commit a22d19ddbf4a4a6c087a9a1e1d0834973998828d Author: epoberezkin Date: Wed Oct 15 08:02:06 2025 +0000 deploy: 8c345e5629b45ffa668010eba23b75c6913143ac diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.well-known/README.md b/.well-known/README.md new file mode 100644 index 0000000000..6346c85a76 --- /dev/null +++ b/.well-known/README.md @@ -0,0 +1,17 @@ +# .well-known + +This website files allow opening SimpleX Chat links (1-time invitations, contact addresses and groups) directly in the app. + +## Android + +File `assetlinks.json` includes certificate hashes for: + +- Play Store (5E:3E:DC:C2:00:FB:A8:D5:F4:88:F3:CA:4C:32:5B:05:78:C5:6A:9C:03:A1:CC:B5:92:9C:D7:5C:7E:57:E2:4D) +- APK in GitHub releases (3C:52:C4:FD:3C:AD:1C:07:C9:B0:0A:70:80:E3:58:FA:B9:FE:FC:B8:AF:5A:EC:14:77:65:F1:6D:0F:21:AD:85) +- F-Droid (AE:C1:95:DC:FD:46:14:BD:3A:91:EC:26:D1:D5:14:C8:75:71:C5:CC:8D:CF:48:08:3F:92:83:14:3C:A2:B9:A6) + +## iOS + +`apple-app-site-association` needs to be served with `Content-type: application/json; charset=utf-8` and GitHub pages do not support adding this header to files without JSON extension. + +To workaround this (thanks to [StackOverflow - Serve json data from github pages](https://stackoverflow.com/questions/39199042/serve-json-data-from-github-pages)) we're creating directory named `apple-app-site-association` with `index.json` file that contains all the necessary configs. \ No newline at end of file diff --git a/.well-known/README/index.html b/.well-known/README/index.html new file mode 100644 index 0000000000..a010fd422b --- /dev/null +++ b/.well-known/README/index.html @@ -0,0 +1,12 @@ +

.well-known

+

This website files allow opening SimpleX Chat links (1-time invitations, contact addresses and groups) directly in the app.

+

Android

+

File assetlinks.json includes certificate hashes for:

+ +

iOS

+

apple-app-site-association needs to be served with Content-type: application/json; charset=utf-8 and GitHub pages do not support adding this header to files without JSON extension.

+

To workaround this (thanks to StackOverflow - Serve json data from github pages) we're creating directory named apple-app-site-association with index.json file that contains all the necessary configs.

diff --git a/.well-known/apple-app-site-association/index.json b/.well-known/apple-app-site-association/index.json new file mode 100644 index 0000000000..3b513fe61e --- /dev/null +++ b/.well-known/apple-app-site-association/index.json @@ -0,0 +1,49 @@ +{ + "applinks": { + "details": [ + { + "appIDs": [ + "5NN7GUYB6T.chat.simplex.app" + ], + "components": [ + { + "/": "/contact/*" + }, + { + "/": "/contact" + }, + { + "/": "/invitation/*" + }, + { + "/": "/invitation" + }, + { + "/": "/a/*" + }, + { + "/": "/a" + }, + { + "/": "/c/*" + }, + { + "/": "/c" + }, + { + "/": "/g/*" + }, + { + "/": "/g" + }, + { + "/": "/i/*" + }, + { + "/": "/i" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/.well-known/assetlinks.json b/.well-known/assetlinks.json new file mode 100644 index 0000000000..e19f8a4c1a --- /dev/null +++ b/.well-known/assetlinks.json @@ -0,0 +1,16 @@ +[ + { + "relation": [ + "delegate_permission/common.handle_all_urls" + ], + "target": { + "namespace": "android_app", + "package_name": "chat.simplex.app", + "sha256_cert_fingerprints": [ + "5E:3E:DC:C2:00:FB:A8:D5:F4:88:F3:CA:4C:32:5B:05:78:C5:6A:9C:03:A1:CC:B5:92:9C:D7:5C:7E:57:E2:4D", + "3C:52:C4:FD:3C:AD:1C:07:C9:B0:0A:70:80:E3:58:FA:B9:FE:FC:B8:AF:5A:EC:14:77:65:F1:6D:0F:21:AD:85", + "AE:C1:95:DC:FD:46:14:BD:3A:91:EC:26:D1:D5:14:C8:75:71:C5:CC:8D:CF:48:08:3F:92:83:14:3C:A2:B9:A6" + ] + } + } +] diff --git a/.well-known/nostr.json b/.well-known/nostr.json new file mode 100644 index 0000000000..8c409fb86c --- /dev/null +++ b/.well-known/nostr.json @@ -0,0 +1,18 @@ +{ + "names": { + "_": "c998a5739f04f7fff202c54962aa5782b34ecb10d6f915bdfdd7582963bf9171" + }, + "relays": { + "c998a5739f04f7fff202c54962aa5782b34ecb10d6f915bdfdd7582963bf9171": [ + "wss://nostr.orangepill.dev", + "wss://eden.nostr.land", + "wss://relay.damus.io", + "wss://relay.snort.social", + "wss://relay.current.fyi", + "wss://nos.lol", + "wss://relay.nostr.bg", + "wss://nostr-verified.wellorder.net", + "wss://nostr.milou.lol" + ] + } +} diff --git a/.well-known/org.flathub.VerifiedApps.txt b/.well-known/org.flathub.VerifiedApps.txt new file mode 100644 index 0000000000..3a9a2d04de --- /dev/null +++ b/.well-known/org.flathub.VerifiedApps.txt @@ -0,0 +1 @@ +ae8b5b2e-76c9-4a31-a044-bcbda1cdf264 diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..e579e0ad9b --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +simplex.chat diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000000..5d3dda3daa --- /dev/null +++ b/about/index.html @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+

About us

+

SimpleX Chat Ltd is a company founded to develop SimpleX network and software.

+

Our mission is to create a fully decentralized network, based on the same principles as open web, but the one that gives users full control and ownership of their identity, contacts and communities.

+

Contact us

+

SimpleX: "Ask SimpleX team" contact in the app or this address.

+

Email: chat@simplex.chat. You can use PGP to encrypt email messages using our key from keys.openpgp.org (its fingerprint is FB44 AF81 A45B DE32 7319 797C 8510 7E35 7D4A 17FC) and making your key available for a secure reply.

+

You can follow our updates on social media: X/Twitter, Reddit, Mastodon and Nostr.

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/ar/contact/index.html b/ar/contact/index.html new file mode 100644 index 0000000000..6695ed1fd7 --- /dev/null +++ b/ar/contact/index.html @@ -0,0 +1,1004 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

لقد وصلتك رسالة للاتصال على SimpleX Chat

+

لإجراء اتصال:

+ +
+

قم بتثبيت تطبيق SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

تواصل في التطبيق

+ + + افتح تطبيق Simplex + +
+

2

+
+
+ +
+

اضغط على زر "اتصال" في التطبيق

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

انضم إلى SimpleX

+

نحن ندعوك للانضمام إلى المُحادثة

+ + + +

اشترك للحصول على آخر مستجداتنا

+ +
+ + + +
+ +
+ +

احصل على تطبيق سطح المكتب SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ar/fdroid/index.html b/ar/fdroid/index.html new file mode 100644 index 0000000000..a83a3000de --- /dev/null +++ b/ar/fdroid/index.html @@ -0,0 +1,842 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat عبر F-Droid

+ +
+ +
+

مستودع SimpleX Chat

+
+
+

الإصدارات الثابتة والتجريبية التي أنشأها المطورون

+

لإضافته إلى عميل F-Droid، امسح رمز QR أو استخدم عنوان URL هذا:

+ + https://app.simplex.chat/fdroid/repo + +

+ توقيع مفتاح البصمة (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

مستودع F-Droid.org

+ +

الإصدارات الثابتة التي تم إنشاؤها بواسطة F-Droid.org

+

تتم الإصدارات إلى هذا المستودع بعد عِدة أيام.

+

مستودعات SimpleX Chat و F-Droid.org مبنية على مفاتيح مختلفة. للتبديل، يُرجى تصدير قاعدة بيانات الدردشة وإعادة تثبيت التطبيق.

+
+
+ +
+
+ + + + + + + + + + diff --git a/ar/index.html b/ar/index.html new file mode 100644 index 0000000000..0f409e53ac --- /dev/null +++ b/ar/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/ar/invitation/index.html b/ar/invitation/index.html new file mode 100644 index 0000000000..cac8c5c07f --- /dev/null +++ b/ar/invitation/index.html @@ -0,0 +1,1004 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

لقد وصلك رابط يفتح مرة واحدة للاتصال على SimpleX Chat

+

لإجراء اتصال:

+ +
+

قم بتثبيت تطبيق SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

تواصل في التطبيق

+ + + افتح تطبيق Simplex + +
+

2

+
+
+ +
+

اضغط على زر "اتصال" في التطبيق

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

انضم إلى SimpleX

+

نحن ندعوك للانضمام إلى المُحادثة

+ + + +

اشترك للحصول على آخر مستجداتنا

+ +
+ + + +
+ +
+ +

احصل على تطبيق سطح المكتب SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ar/learn-more/index.html b/ar/learn-more/index.html new file mode 100644 index 0000000000..d44a8aa39a --- /dev/null +++ b/ar/learn-more/index.html @@ -0,0 +1,1858 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

لماذا SimpleX فريد من نوعه

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

لديك خصوصية كاملة

+
+ +
+ +
+

+ يحمي SimpleX خصوصية ملف تعريفك، جهات اتصالك والبيانات الوصفية، ويخفيه عن خوادم شبكة SimpleX وأي مراقبين. +

+

+ على عكس أي شبكة مُراسلة آخر، لا يحتوي SimpleX على معرّفات مخصّصة للمستخدمين — ولا حتى أرقام عشوائية. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

أنت محمي
من رسائل الإزعاج وإساءة الاستخدام

+
+ +
+ +
+

+ نظرًا لعدم وجود معرّف أو عنوان ثابت على شبكة SimpleX، لا يمكن لأي شخص الاتصال بك ما لم تشارك عنوان مستخدم لمرة واحدة أو مؤقتًا، كرمز QR أو رابط. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

أنت تتحكم في بياناتك

+
+ +
+ +
+

+ يخزن SimpleX جميع بيانات المستخدم على الأجهزة العميلة بتنسيق قاعدة بيانات محمولة مُعمَّاة — يمكّن نقلها إلى جهاز آخر. +

+

+ يتم الاحتفاظ بالرسائل المُعمَّاة بين الطرفين مؤقتًا على خوادم ترحيل SimpleX حتى يتم استلامها، ثُمَّ تُحذف نهائيًا. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

أنت تمتلك شبكة SimpleX

+
+ +
+ +
+

+ شبكة SimpleX لا مركزية بالكامل ومستقلة عن أي عملة مُعمَّاة أو أي شبكة أخرى، بخلاف الإنترنت. +

+

+ يمكنك استخدام SimpleX مع خوادمك الخاصة أو مع الخوادم التي نوفرها — ولا يزال الاتصال ممكن بأي مستخدم. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

الميزات

+ +
+ +
+
+ + +
+

تعمية الرسائل بين الطرفين مع دعم ماركداون والتعديل

+
+ +
+
+ + +
+

تعمية
الصور والفيديوهات والملفات بين الطرفين

+
+ +
+
+ + +
+

المجموعات اللامركزية مُعمَّاة — المستخدمون فقط يعرفون بوجودها

+
+ +
+
+ + +
+

تعمية الرسائل الصوتية بين الطرفين

+
+ +
+
+ + +
+

رسائل ذاتية الاختفاء

+
+ +
+
+ + +
+

تعمية المكالمات الصوتية والفيديو
بين الطرفين

+
+ +
+
+ + +
+

تخزين بيانات التطبيق مُعمَّاة ومحمولة — نقل ملف التعريف إلى جهاز آخر

+
+ +
+
+ + +
+

وضع التخفي —
فريد من نوعه لـ SimpleX Chat

+
+ +
+
+
+ + +
+
+

ما الذي يجعل SimpleX خصوصيًّا

+ +
+
+ + +
+
+ + +
+
+

معرّفات زوجية مجهولة مؤقتة

+
+ +

يستخدم SimpleX معرّفات مزدوجة مؤقتة مجهولة الهوية للعناوين وبيانات الاعتماد لكل جهة اتصال مستخدم أو عضو مجموعة.

+ +

يسمح بتسليم الرسائل بدون معرّفات ملف تعريف المستخدم، مما يوفر خصوصية للبيانات الوصفية أفضل من البدائل.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

تبديل
خارج النطاق

+
+ +

العديد من شبكات التواصل عرضة لهجمات الوسيط (MITM) من قِبل الخوادم أو موفري الشبكات.

+ +

لمنع ذلك، تقوم تطبيقات SimpleX بتمرير مفاتيح لمرة واحدة خارج النطاق، عندما تُشارك عنوان كرابط أو رمز QR.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقتان من
التعمية بين الطرفين

+
+ +

بروتوكول السقاطة المزدوجة —
رسائل OTR مع السرية المستمرة واستعادة الاختراق.

+ +

NaCL cryptobox في كل قائمة انتظار لمنع ارتباط حركة مرور البيانات بين قوائم انتظار الرسائل في حالة اختراق TLS.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

التحقق
من سلامة الرسالة

+
+ +

لضمان سلامة الرسائل يتم ترقيمها بالتسلسل وتضمين تجزئة الرسالة السابقة.

+ +

إذا أُضيفت أي رسالة أو أُزيلت أو تغيّرت، فسيتم تنبيه المُستلم.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقة إضافية من
تعمية الخادم

+
+ +

طبقة إضافية من تعمية الخادم للتسليم إلى المُستلم، لمنع الارتباط بين حركة مرور بيانات الخادم المُستلمة والمُرسلة في حالة اختراق TLS.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

خلط الرسائل
لتقليل من الارتباط

+
+ +

تعمل خوادم SimpleX كعقد مختلطة بزمن انتقال منخفض — الرسائل الواردة والصادرة لها ترتيب مختلف.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

تأمين نقل
TLS المصدق عليه

+
+ +

يتم استخدام TLS 1.2 / 1.3 مع خوارزميات قوية فقط لاتصالات الخادم والعميل.

+ +

تعمل بصمة الخادم وربط القناة على منع هجمات الوسيط (MITM) وإعادة التشغيل.

+ +

استئناف الاتصال معطل لمنع هجمات الجلسة.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

وصول
اختياري عبر تور

+
+ +

لحماية عنوان IP الخاص بك، يمكنك الوصول إلى الخوادم عبر تور أو بعض شبكات تراكب النقل الأخرى.

+ +

لاستخدام SimpleX عبر تور، يُرجى تثبيت تطبيق Orbot وتمكّين وكيل SOCKS5 (أو VPN على iOS ).

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

قوائم انتظار
أحادية الاتجاه

+
+ +

كل رسالة انتظار تمرر الرسائل في اتجاه واحد، بعناوين إرسال واستلام مختلفة.

+ +

إنه يقلل من نواقل الهجوم، مقارنة بوسطاء الرسائل التقليديين، والبيانات الوصفية المتاحة.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقات متعددة من
حشوة المحتوى

+
+ +

يستخدم SimpleX حشوة المحتوى لكل طبقة تعمية لإحباط هجمات حجم الرسالة.

+ +

يجعل الرسائل ذات الأحجام المختلفة تبدو متشابهة للخوادم ومراقبي الشبكة.

+ +
+

انقر للإغلاق

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

شبكة SimpleX

+

يوفر Simplex Chat أفضل خصوصية من خلال الجمع بين مزايا P2P والشبكات الاتحادية.

+ +
+
+
+ + +
+
+

على عكس شبكات P2P

+

+ يتم إرسال جميع الرسائل عبر الخوادم، مما يوفر خصوصية أفضل للبيانات الوصفية وتسليمًا موثوقًا للرسائل غير المتزامنة، مع تجنب الكثير مشاكل شبكات P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

على عكس الشبكات الاتحادية

+

+ لا تقوم خوادم الترحيل SimpleX بتخزين ملفات تعريف المستخدمين وجهات الاتصال والرسائل التي تم تسليمها، ولا تتصل ببعضها البعض، ولا يوجد دليل خوادم. +

+
+
+ + + +
+
+ + +
+
+

شبكة SimpleX

+

+ توفر الخوادم قوائم انتظار أحادية الاتجاه لتوصيل المستخدمين، لكن ليس لديهم رؤية للرسم البياني لاتصال الشبكة — إلا للمستخدمين فقط. +

+
+
+ +
+
+ +
+ + + + + +
+
+

شرح SimpleX

+ + + + + + + +
+
+ +
+
1. تجربة المستخدم
+
+ +

+ يمكنك إنشاء جهات اتصال ومجموعات وإجراء مُحادثات ثنائية الاتجاه، كما هو الحال في أي برنامج مُراسلة آخر. +

+

+ كيف يمكن أن تعمل مع قوائم انتظار أحادية الاتجاه وبدون معرّفات ملف تعريف المستخدم؟ +

+
+
+ +
+
2. كيف يعمل
+
+ +

+ لكل اتصال، تستخدم قائمتي انتظار منفصلتين للمُراسلة لإرسال واستلام الرسائل عبر خوادم مختلفة. +

+

+ تمرّر الخوادم الرسائل في اتجاه واحد فقط، دون الحصول على الصورة الكاملة لمُحادثات المستخدم أو اتصالاته. +

+
+
+ +
+
3. ما الذي تراة الخوادم
+
+ +

+ تحتوي الخوادم على بيانات اعتماد مجهولة منفصلة لكل قائمة انتظار، ولا تعرف المستخدمين الذين ينتمون إليهم. +

+

+ يمكن للمستخدمين زيادة تحسين خصوصية البيانات الوصفية باستخدام تور للوصول إلى الخوادم، ومنع الارتباط بواسطة عنوان IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

مقارنة مع البروتوكولات الأخرى

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal، منصات كبيرةXMPP ،Matrixبروتوكولات P2P
يتطلب هوية عالميةلا - خصوصينعم 1نعم 2نعم 3
احتمالية هجوم الوسيطلا - آمن 4نعم 5نعمنعم
الاعتمادية على DNSلا - مرننعمنعملا
شبكة أحادية أو مركزيةلا - لامركزينعملا - اتِحاديّ 6نعم 7
مكون مركزي أو هجوم الشبكة الواسعلا - مرننعمنعم 2نعم 8
+
+ +
+ +
+
+
    +
  1. عادة ما يكون مكوناً من رقم الهاتف، أو اسم المستخدم في بعض الأحيان
  2. +
  3. العناوين تعتمد على الـDNS
  4. +
  5. المفتاح العام أو معرّف آخر فريد وعام
  6. +
  7. مُرحلات SimpleX لا يمكنها أن تتنازل عن تعمية بين الطرفين. تحقق من رمز الأمان للتخفيف من الهجوم على القناة خارج النطاق
  8. +
  9. إذا خوادم المشغّل مُخترقة. تحقق من رمز الأمان في Signal وبعض التطبيقات الأخرى للتخفيف منه
  10. +
  11. لا يحمي خصوصية البيانات الوصفية للمستخدمين
  12. +
  13. على الرغم من أن الـP2P موزعة، إلا أنها ليست اتِحاديَّة — يعملون كشبكة واحدة
  14. +
  15. شبكات P2P إما لديها سلطة مركزية أو أن الشبكة كلها يمكن عرضة للخطر - اقرأ هنا
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/bg/contact/index.html b/bg/contact/index.html new file mode 100644 index 0000000000..76c7483493 --- /dev/null +++ b/bg/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received an address to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/bg/fdroid/index.html b/bg/fdroid/index.html new file mode 100644 index 0000000000..b4b1636eeb --- /dev/null +++ b/bg/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stable and beta versions built by the developers

+

To add it to your F-Droid client, scan the QR code or use this URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stable versions built by F-Droid.org

+

The releases to this repo are done several days later.

+

SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/bg/index.html b/bg/index.html new file mode 100644 index 0000000000..8ad1a966d6 --- /dev/null +++ b/bg/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/bg/invitation/index.html b/bg/invitation/index.html new file mode 100644 index 0000000000..49df416fb7 --- /dev/null +++ b/bg/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received a 1-time link to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/bg/learn-more/index.html b/bg/learn-more/index.html new file mode 100644 index 0000000000..ee569b1220 --- /dev/null +++ b/bg/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Характеристика

+ +
+ +
+
+ + +
+

E2E-криптирани съобщения с markdown форматиране и редактиране

+
+ +
+
+ + +
+

E2E-криптирани
изображения, видеоклипове и файлове

+
+ +
+
+ + +
+

E2E-криптирани децентрализирани групи — известни само на потребителите

+
+ +
+
+ + +
+

E2E-криптирани гласови съобщения

+
+ +
+
+ + +
+

Изчезващи съобщения

+
+ +
+
+ + +
+

E2E-криптиран
аудио и видео разговори

+
+ +
+
+ + +
+

Преносима криптирана база данни mdash; Можете да преместите профила на друго устройство

+
+ +
+
+ + +
+

Режим инкогнито —
уникален за SimpleX чат

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Временни анонимни двойки идентификатори

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Външен носител за
обмен на ключове

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

За да го предотврати SimpleX, приложенията препращат еднократни ключове през външен носител, когато се споделя адрес като линк или QR код.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2 слоя на криптиране от край до край

+
+ +

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Проверка на
целостта на съобщението

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Допълнителен слой на
криптиране на сървъра

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Смесване на съобщения
за намаляване на корелацията

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Сигурен идентифициран
TLS транспорт

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Възможен
достъп чрез TOR

+
+ +

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Еднопосочни
опашки за съобщенията

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Множество слоеве
допълнение на съдържание

+
+ +

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Обяснението на SimpleX

+ + + + + + + +
+
+ +
+
1. Какъв опит като потребител
+
+ +

+ Можете да създавате контакти и групи и да провеждате двупосочни разговори, както във всеки друго чат приложение. +

+

+ Как може да работи с еднопосочни опашки и без идентификатори на потребителски профили? +

+
+
+ +
+
2. Как работи
+
+ +

+ За всяка връзка използвате две отделни опашки за съобщения, за да изпращате и получавате съобщения през различни сървъри. +

+

+ Сървърите предават съобщения само еднопосочно, без да имат пълната картина от разговорите или връзките на потребителя. +

+
+
+ +
+
3. Какво виждат сървърите
+
+ +

+ Сървърите имат отделни анонимни идентификационни данни за всяка опашка и нямат информация на кои потребители принадлежат. +

+

+ Потребителите могат допълнително да подобрят поверителността на метаданните, като използват Tor за достъп до сървъри, предотвратявайки корелация по IP адрес. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateДа 1Да 2Да 3
Possibility of MITMNo - secure 4Да 5ДаДа
Dependence on DNSNo - resilientДаДаНе
Single or Centralized networkNo - decentralizedДаNo - federated 6Да 7
Central component or other network-wide attackNo - resilientДаДа 2Да 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX релетата не могат да компрометират E2E криптирането. Проверете кода за сигурност, за да предотвратите атаката по външен носител
  8. +
  9. If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. +
+
+
+
+
+ + +

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+ + + + + + + + + + diff --git a/blog/20201022-simplex-chat.html b/blog/20201022-simplex-chat.html new file mode 100644 index 0000000000..9cb118d959 --- /dev/null +++ b/blog/20201022-simplex-chat.html @@ -0,0 +1,545 @@ + + + + + + + + SimpleX blog: Simplex Chat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Simplex chat

+

Published: Oct 22, 2020

+

https://simplex.chat

+

I'd really appreciate your feedback, criticism and suggestions on the open-source idea I was slowly working on since early 2020. I recently made the demo server for the low-level message queue protocol ("simplex messaging protocol") and the website to try to explain the chat idea that would use this protocol.

+

Haskell protocol implementation: https://github.com/simplex-chat/simplexmq

+

In short, the protocol defines a minimalist set of commands and server responses (just 7 commands and 5 responses sent over TCP) to operate encrypted message queues with in-memory persistence - the implementation uses STM.

+

If anything, it was definitely helping to get to know Haskell types etc. much deeper than before :)

+

Any criticism would be great - thank you in advance!

+

Originally published at https://www.reddit.com/r/haskell/comments/jg6uh4/simplex_chat/

+
+
+ + + + + + + + diff --git a/blog/20210512-simplex-chat-terminal-ui.html b/blog/20210512-simplex-chat-terminal-ui.html new file mode 100644 index 0000000000..4a9ed44f1d --- /dev/null +++ b/blog/20210512-simplex-chat-terminal-ui.html @@ -0,0 +1,553 @@ + + + + + + + + SimpleX blog: Announcing SimpleX Chat Prototype! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Announcing SimpleX Chat Prototype!

+

Published: May 12, 2021

+

For the last six months me and my son Efim have been working to bring you a working prototype of SimpleX Chat. We're excited to announce SimpleX Chat terminal client is now available here on Linux, Windows and Mac (you can either build from source or download the binary for Linux, Windows or Mac from the latest release).

+

We’ve been using the terminal client between us and a few other people for a couple of months now, eating our own “dog food”, and have developed up to version 0.3.1, with most of the messaging protocol features we originally planned

+

Features

+
    +
  • End-to-end encryption with protection from man in the middle attack. The connection invitation must be passed out-of-band (see how to use SimpleX Chat in the repo).
  • +
  • No global identity or any usernames visible to the server(s), ensuring full privacy of your contacts and conversations.
  • +
  • Message signing and verification with automatically generated RSA keys, with keys being unique per each connection.
  • +
  • Authorization of each command/message by the servers with automatically generated RSA key pairs, also unique per connection.
  • +
  • Message integrity validation (via passing the digests of the previous messages).
  • +
  • Encrypted TCP transport, independent of certificates.
  • +
  • You can deploy your own server, but you don’t have to - the demo SMP server to relay your messages is available at smp1.simplex.im:5223 (pre-configured in the client).
  • +
+

We need your help!

+

We're building a new kind of chat network - the only network that lets you control your chat. We'd really appreciate your feedback, criticism and support - a star on the github repo, signing up to the mailing list or any contribution to the project will help. There is so much more to do!

+

Originally published at https://www.reddit.com/r/haskell/comments/naw6lz/simplex_chat_prototype_terminal_ui_made_in_haskell/

+
+
+ + + + + + + + diff --git a/blog/20210914-simplex-chat-v0.4-released.html b/blog/20210914-simplex-chat-v0.4-released.html new file mode 100644 index 0000000000..e13174c740 --- /dev/null +++ b/blog/20210914-simplex-chat-v0.4-released.html @@ -0,0 +1,557 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat v0.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat v0.4

+

Published: Sep 14, 2021

+

Open-source decentralized chat that uses privacy-preserving message routing protocol

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter. SimpleX Chat is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.

+

What is SimpleX?

+

We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.

+

The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.

+

What's new in v0.5?

+

We're exicted to announce that SimpleX Chat now supports group chat and file transfer!

+

Chat groups

+

To create a group use the /g <group> command. You can then invite contacts to the group by entering the /a <group> <name> command. Your contact(s) will need to use the /j accept command to accept the invitation to the group. To send messages to the group, simply enter #<group> <message>.

+

Please note: Groups are not stored on any server; they are maintained as a list of members in the app database. Sending a message to the group sends a message to each member of the group.

+

simplex-chat

+

File transfer

+

Sharing files is simple! To send a file to a contact, use the /f @<contact> <file_path> command. The recipient will have to accept before the file is sent.

+

simplex-chat

+

We're always looking for help!

+

We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!

+

Please note: SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.

+

Our goal is to create a new kind of chat platform that lets you control your chat!

+

Originally published at https://www.reddit.com/r/selfhosted/comments/poal79/simplex_chat_an_opensource_decentralized_chat/

+
+
+ + + + + + + + diff --git a/blog/20211208-simplex-chat-v0.5-released.html b/blog/20211208-simplex-chat-v0.5-released.html new file mode 100644 index 0000000000..f461beb473 --- /dev/null +++ b/blog/20211208-simplex-chat-v0.5-released.html @@ -0,0 +1,552 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat v0.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat v0.5

+

Published: Dec 08, 2021

+

Simplex Chat is the first chat platform that is 100% private by design - SimpleX no access to your connections graph

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter. SimpleX Chat is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.

+

What is SimpleX?

+

We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.

+

The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.

+

What's new in v0.5?

+

Long-term chat addresses

+

Users can now create long-term chat addresses that they can share with many people (e.g. in email signature, or online), so that any chat user can send them a connection request.

+

This is an ALPHA feature, and we have not yet added any protection against spam contact requests. However, if the address you created starts receiving spam connection requests, you can simply delete it without losing any of your accepted connections and create another address - as many times as you like!

+

We need your help!

+

We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!

+

Please note: SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.

+

Our goal is to create a new kind of chat platform that lets you control your chat!

+

Originally published at https://www.reddit.com/r/haskell/comments/rc0xkn/simplex_chat_the_first_chat_platform_that_is_100/

+
+
+ + + + + + + + diff --git a/blog/20220112-simplex-chat-v1-released.html b/blog/20220112-simplex-chat-v1-released.html new file mode 100644 index 0000000000..f11615086c --- /dev/null +++ b/blog/20220112-simplex-chat-v1-released.html @@ -0,0 +1,566 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat v1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat v1

+

Published: Jan 12, 2022

+

The most private and secure chat and application platform

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter. SimpleX Chat is our first application, a messaging application built on the SimpleX platform.

+

What is SimpleX?

+

There is currently no messaging application which respects user privacy and guarantees metadata privacy - in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.

+

The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.

+

What's new in v1?

+

Stable protocol implementation

+

All releases from v1 onwards will be forwards and backwards compatible.

+

Message encryption has been completely re-engineered to provide forward secrecy and recovery from break-in.

+

SimpleX Chat v1 now uses:

+
    +
  • double-ratchet E2E encryption using AES-256-GCM cipher with X3DH key agreement using 2 ephemeral Curve448 keys to derive secrets for ratchet initialization. These keys and secrets are separate for each contact, group membership and file transfer.
  • +
  • in addition to double ratchet, there is a separate E2E encryption in each message queue with DH key exchange using Curve25519 and NaCl crypto-box - separate E2E encryption has been added to avoid having any cipher-text in common between message queues of a single contact (to prevent traffic correlation).
  • +
  • additional encryption of messages delivered from servers to recipients, also using Curve25519 DH exchange and NaCl crypto-box - to avoid shared cipher-text in sent and received traffic (also to prevent traffic correlation).
  • +
+

Improved user and server authentication and transport

+

SimpleX now uses ephemeral Ed448 keys to sign and verify client commands to the servers. As before, these keys are different per message queue and do not represent a user's identity.

+

Instead of ad-hoc encrypted transport we now use TLS 1.2+ limited to the most performant and secure cipher with forward secrecy (ECDHE-ECDSA-CHACHA20POLY1305-SHA256), Curve448 groups and Ed448 keys.

+

Server identity is validated as part of TLS handshake - the fingerprint of offline server certificate is used as a permanent server identity which is included in server address, to protect against MITM attacks between clients and servers.

+

SimpleX also uses tls-unique channel binding in each signed client command to the server to protect against replay attacks.

+

Changes in protocol encoding

+

We switched from inefficient text-based low level protocol encodings, that simplified early development, to space and performance efficient binary encodings, reducing protocol overhead from circa 15% to 3.7% of transmitted application message size.

+

Learn more about Simplex

+

Further details on platform objectives and technical design are available here.

+

SimpleX Chat client can be used in the terminal on all major desktop platforms (Windows/Mac/Linux) and also on Android devices with Termux.

+

SimpleX also allows people to host their own servers and own their own chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages).

+

We look forward to you using it!

+

We look forward to your feedback and suggestions - via GitHub issues or via SimpleX Chat - you can connect to the team with /simplex command once you run the chat.

+
+
+ + + + + + + + diff --git a/blog/20220214-simplex-chat-ios-public-beta.html b/blog/20220214-simplex-chat-ios-public-beta.html new file mode 100644 index 0000000000..e0f41c0e15 --- /dev/null +++ b/blog/20220214-simplex-chat-ios-public-beta.html @@ -0,0 +1,564 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat public beta for iOS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat public beta for iOS

+

Published: Feb 14, 2022

+

Private and secure chat and application platform - public beta is now available for iPhones with iOS 15.

+

Our new iPhone app is very basic - right now it only supports text messages and emojis.

+

Even though the app is new, it uses the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 a month ago:

+
    +
  • double-ratchet E2E encryption.
  • +
  • separate keys for each contact.
  • +
  • additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).
  • +
  • additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).
  • +
+

You can read more details in our recent v1 announcement.

+

Join our public beta!

+

Install the app via TestFlight, connect to us (via Connect to SimpleX team link in the app) and to a couple of your friends you usually send messages to - and please let us know what you think!

+

We would really appreciate any feedback to improve the app and to decide which additional features should be included in our public release in March.

+

Should it be:

+
    +
  • images,
  • +
  • link previews,
  • +
  • or maybe something else we couldn't think of.
  • +
+

Please vote on the features you think are the most needed in our app roadmap.

+

What is SimpleX?

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter.

+

We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.

+

The first application built on the platform is Simplex Chat, which is available for terminal (command line in Windows/Mac/Linux) and as iOS public beta - with Android app coming in a few weeks. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.

+

SimpleX also allows people to host their own servers to have control of their chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages). It should be considered though that while self-hosting the servers provides more control, it may reduce meta-data privacy, as it is easier to correlate the traffic of servers with small number of messages coming through.

+

Further details on platform objectives and technical design are available in SimpleX platform overview.

+
+
+ + + + + + + + diff --git a/blog/20220308-simplex-chat-mobile-apps.html b/blog/20220308-simplex-chat-mobile-apps.html new file mode 100644 index 0000000000..5d6d389856 --- /dev/null +++ b/blog/20220308-simplex-chat-mobile-apps.html @@ -0,0 +1,582 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat mobile apps for iOS and Android + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat mobile apps for iOS and Android

+

Published: March 8, 2022

+

SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections graph

+

We have now released iPhone and Android apps to Apple AppStore and Google Play Store, APK for Android is also available for direct download.

+

Please note: the current version is only supported on iPhone 8+ and on Android 10+ - we are planning to add support for iPad and older devices very soon, and we will announce it on our Reddit and Twitter channels - please subscribe to follow our updates there.

+

What is SimpleX

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter.

+

We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.

+

The first application built on the platform is Simplex Chat. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.

+

Further details on platform objectives and technical design are available in SimpleX platform overview.

+

Why we are building it

+

Evgeny (SimpleX Chat founder): I have been working on this platform for a long time to provide a place where all people can communicate freely with each other, without fear of persecution because of what they said and who they are connected with. Not sharing information about your connections is very important, particularly for people living in oppressive regimes. Because of the terrible conflict between Russia and Ukraine, people of both countries – I have friends and family there – could be at risk when sharing their opinions or just from being connected to people who were prosecuted. Every messenger app that knows who you are can end up sharing all of your connections with undesirable third parties, either as a result of a court order or as a result of attack - so even Signal, which has strong encryption, cannot protect your connection graph. I hope our messenger can help people living in the oppressive regimes to express their opinions without fear and risk of prosecution.

+

Huge thanks to our testers!

+

Thanks a lot to everybody who helped testing and improving the apps!

+

If you have a TestFlight version installed you can continue using it.

+

We plan to keep it as stable as we can, and it will give you access to all new features 1-2 weeks earlier - it's limited to 10,000 users, so you can grab it while it's available. You can still communicate with people who use a public version – we are committed to maintaining backwards compatibility.

+

You can always migrate from a public App Store version to a TestFlight version. The opposite migration - from TestFlight to public version - is only possible when we have the same app versions released, as there are usually some database migrations that cannot be reversed. To migrate to public version you have to disable automatic updates on TestFlight, wait until public version catches up and then install it from App Store. In any case, it is safe installing the public version, but it might crash if you have a newer version from TestFlight - in this case you just need to re-install the app from TestFlight and install App Store version a bit later - you would not lose any of your data.

+

It's not all new - our core code has been used for a long time by a few thousand people in our terminal app.

+

The apps use the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 earlier this year:

+
    +
  • double-ratchet E2E encryption.
  • +
  • separate keys for each contact.
  • +
  • additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).
  • +
  • additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).
  • +
+

You can read more technical details in our recent v1 announcement.

+

A big thank you to @angerman for making it possible to compile our Haskell code to mobile platforms and getting it approved on app stores - it has been a non-trivial project, and it is still ongoing.

+

Install the apps and make a private connection!

+

Once you install the app, you can connect to anybody:

+
    +
  1. Create your local chat profile - it is not shared with SimpleX servers, it is local to your devices, and it will be shared with your contacts when you connect.
  2. +
  3. To make a private connection, you need to create a one-time connection link / QR code via "Add contact" button in the app. You can either show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel - only one user can connect via this link.
  4. +
  5. Once another user scans the QR code or opens the app via the link (they also should create their profile first) the connection will be created and you can send e2e encrypted messages privately, without anybody knowing you are connected.
  6. +
+

New features and improvements that are coming soon

+
    +
  • push notification server. Currently the apps load messages in the background periodically, that can be quite infrequent on iOS if you don't open the app regularly. With push notifications you would know about the new messages instantly.
  • +
  • e2e encrypted audio and video calls via WebRTC.
  • +
  • export and import of the chat database.
  • +
  • "reply to message" - feature allowing you to quote the message you are replying to.
  • +
  • localization - we will let you know once you can contribute the translations to your languages.
  • +
  • configuring your servers in the apps - this will be released this week, both for iOS and Android. By default the apps are using SimpleX Chat servers, but you will be able to configure your own and still be connected to other users who use our app with our servers.
  • +
  • user profile images.
  • +
  • sending images and files - image preview will be sent via the servers, so it can be asynchronous, and large files/full resolution images via WebRTC, so both devices will have to be online.
  • +
+

Please let us know what else you think is important and if you find any bugs.

+
+
+ + + + + + + + diff --git a/blog/20220404-simplex-chat-instant-notifications.html b/blog/20220404-simplex-chat-instant-notifications.html new file mode 100644 index 0000000000..71a45c40e0 --- /dev/null +++ b/blog/20220404-simplex-chat-instant-notifications.html @@ -0,0 +1,623 @@ + + + + + + + + SimpleX blog: Instant notifications for SimpleX Chat mobile apps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Instant notifications for SimpleX Chat mobile apps

+

Published: April 04, 2022

+

SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections

+

Since we released SimpleX Chat mobile apps couple of weeks ago we've had a lot of excitement from our users - nearly 2000 people downloaded the app after the announcement!

+

Huge thanks to everybody who downloaded and connected to us via the chat - there were many great questions and suggestions, and on some days I spent most of the time chatting to our users :)

+

Since we released the app, we've added and released:

+
    +
  • support for iPhone 7.
  • +
  • configurable SimpleX servers.
  • +
  • message replies, editing and deletion.
  • +
  • profile images.
  • +
  • and, most importantly, private instant message notifications on Android devices - more on that below.
  • +
+

Install the apps and make a private connection!

+

Once you install the app, you can connect to anybody:

+
    +
  1. Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.
  2. +
  3. To make a private connection, you need to create a one-time connection link or a QR code via the "Add contact" button in the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.
  4. +
  5. Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.
  6. +
+

See demo video that shows how two users connect and send the first messages.

+

Why we are doing it

+

We are building SimpleX Chat because we believe that privacy is a fundamental human right, and that protecting our personal network of contacts is even more important than the content of the messages - sharing this network can lead to various adverse consequences, from manipulating us into buying goods we don't need, manipulating election processes, and in some cases, prosecuting innocent people. For example, Mohamedou Ould Salahi was detained in Guantanamo prison for 15 years after a single "wrong" phone call. His story is told in his memoir and in The Mauritanian movie.

+

Problem - users expect to be instantly notified when messages arrive!

+

Our first users realized that what we take for granted in messaging apps - instant message notifications - is missing in our first release of SimpleX Chat apps. Quite a few people thought that it was a bug, rather than a missing feature. Sorry to disappoint!

+

Why can't we just do what messenger X does?

+

SimpleX Chat is the first and the only messenger we know of that operates without user identities of any kind. There are no phone numbers, emails, usernames, public keys, or any other addresses or identifiers to uniquely identify the users to the network or servers. That is why we say it is 100% private by design, and fundamentally different than other chat platforms.

+

Instead, SimpleX Chat assigns these identifiers to unidirectional message queues. What looks to SimpleX Chat users like contacts and groups [1], to SimpleX servers looks like an unorganized and unrelated collection of unidirectional message queues. Our servers do not know which queues belong to which users, contacts or groups. Even a single conversation can happen via two different servers (one for sent and another for received messages). This makes our personal network of contacts invisible to the servers.

+

But it also creates a problem for instant notifications - all push notification services require having a device token.

+

So, how can we operate without identities and still have instant notifications?

+

[1] yes, we have groups in our terminal app, and the UI to manage them is coming to mobile apps soon. Some users have already firgured out how to create groups via chat console.

+

We've cracked it for Android!

+

After some research into how push notifications work on Android, and open-source alternatives to Google push notifications, we discovered how to avoid sharing device tokens with any servers.

+

We have implemented message reception as a background service (in Android terminology, a "foreground service" showing a notification icon when the service is running) following the same design as ntfy.sh created by Philipp Heckel, who, in turn, credits the design to the blog post by Roberto Huertas. Big thanks to them!

+

How does it work? When the app is first started on an Android device, it starts the background service that keeps the TCP connections to the messaging servers open with almost no traffic (only doing periodic checks that connections still exist). It consumes only a few percents of battery per day, depending on how stable your internet connection is, and delivers message notifications as soon as messages arrive.

+

This service continues running when the app is switched off, and it is restarted when the device is restarted even if you don't open the app - so the message notifications arrive instantly every time. To maximize battery life, it can be turned off by switching off "Private notifications". You will still receive notifications while the app is running or in the background.

+

So, for Android we can now deliver instant message notifications without compromising users' privacy in any way. The app version 1.5 that includes private instant notifications is now available on Play Store, in our F-Droid repo and via direct APK downloads!

+

Please let us know what needs to be improved - it's only the first version of instant notifications for Android!

+

iOS notifications require a server

+

iOS is much more protective of what apps are allowed to run on the devices, and the solution that worked on Android is not viable on iOS.

+

We already have background refresh in the iOS app that periodically checks for new messages, and if you use the app every day it delivers notifications within 10 or 20 minutes. It is not instant, but it may be usable for some. If you use the app infrequently, however, this delay can become several hours, or your phone may stop checking for the new messages completely. This is not ideal!

+

The only solution known to us is using Apple's push notifications service (APN) to deliver push notifications.

+

We planned for it, so we added to v1 of SMP (the protocol used by our servers) an extension allowing the client to subscribe to notifications from message queues, via separate queue addresses, and using separate cryptographic keys for each queue. This has to be enabled by the client for each queue separately. We haven't used this extension so far, and now we are building a SimpleX notification service based on it.

+

If the user enables push notifications, then for each contact the app would enable a notification subscription and pass credentials to the notification server together with the device token required to deliver push notifications to user's device.

+

The notification server will subscribe to these notifications from SMP servers. The notifications do not include any message content, only the signal that a message has arrived to the server. Notification server is only allowed to send 2-3 hidden notifications per hour to the device. The notification is end-to-end encrypted and contains information about which server has a message, so that the client can connect to the server, retrieve and decrypt the message, and show the notification to the users including sender name and the message content. None of this information is shared with any server.

+

If the user receives more than 2-3 messages per hour, the notification server can send additional visible notifications that would simply say "you have a new message", and the user will have to open the app to receive and see these messages. We are also investigating whether we can use "mutable-content" notifications that allow doing some processing when the notification arrives before showing it to the users.

+

It is a substantial amount of development, we are aiming to release it later this month.

+

This design is a compromise between privacy and convenience. The notification server will have to have a device token to deliver notifications. Several things we did (or plan to do) to improve this compromise:

+
    +
  1. The notification server will only store device tokens and queue addresses in memory, making it more complex for a potential attacker to access. If server has to be restarted, they would lose all configured notification subscriptions and the clients would have to create them again. We will program the clients to periodically check for the existence of notification subscriptions on the notification server.
  2. +
  3. The notificaiton server will not know the addresses of the messaging queues used to receive or send messages. A different address is used to subscribe to notifications. So while the notification server would have the knowledge of how many queues your device has (and on which servers), it still won't know who is sending you the messages.
  4. +
  5. We are also planning to split the logic of notification subscriptions and delivering notifications to the devices to two different servers. The server that subscribes to the notifications could be self-hosted, allowing you full control of how you deploy it. Only this server would know which messaging servers you use or how many messaging queues you have. The server that delivers notifications to the devices will be managed by SimpleX Chat as we have to authorize it with Apple's push notification service. This split will not be available in the first release. We plan to add it a bit later.
  6. +
+

So, with the notification servers added, our network design will look like this:

+
  User's iOS device                Internet                        Servers
+---------------------   |   ------------------------   |   -------------------------
+                        |                              |
+                        |                              |   (can be self-hosted now)
++--------------+        |                              |      +----------------+
+| SimpleX Chat |       -------------- TLS ---------------     | SimpleX        |
+|    client    |------> SimpleX Messaging Protocol (SMP) ---> | Messaging      |
++--------------+       ----------------------------------     | Server         |
+     ^    |             |                              |      +----------------+
+     |    |             |                              |            |   |
+     |    |             |                              |            | S | T
+     |    |             |                              |            | M | L
+     |    |             |                              |            | P | S
+     |    |             |                              |            |   |
+     |    |             |                              |      +----------------+       +----------------+
+     |    |            -------------- TLS ---------------     | SimpleX        |       | SimpleX        |
+     |    |----------->     Notifications management    ----> | Notifications  | ----> | Push           |
+     |                 ----------------------------------     | Subscriber     |       | Server         |
+     |                  |                              |      +----------------+       +----------------+
+     |                  |                              |     (can be self-hosted                |
+     |                  |                              |        in the future)                  |
+     |                  |                              |                                        V
+     |                 -------------- TLS ---------------                              +-----------------+
+     |-----------------       Notification delivery     <----------------------------- | Apple PN server |
+                       ----------------------------------                              +-----------------+
+                        |                              |
+
+

Please let us know what you think about this design and about this privacy / usability trade-off:

+
    +
  • For you, is this an acceptable compromise, if you can choose to disable instant notifications?
  • +
  • Do you have any ideas about how this design could be improved upon?
  • +
+

Thank you!

+
+
+ + + + + + + + diff --git a/blog/20220511-simplex-chat-v2-images-files.html b/blog/20220511-simplex-chat-v2-images-files.html new file mode 100644 index 0000000000..9590032e75 --- /dev/null +++ b/blog/20220511-simplex-chat-v2-images-files.html @@ -0,0 +1,558 @@ + + + + + + + + SimpleX blog: SimpleX Chat v2.0 - sending images and files in mobile apps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v2.0 - sending images and files in mobile apps

+

Published: May 11, 2022

+

New in version 2.0 - sending images and files privately

+

To send image and files SimpleX Chat uses privacy-preserving system components, both in iOS and Android apps. We do not ask for permission to access multiple or selected files, as, for example, Signal and Telegram do - it compromises either privacy or convenience.

+

How does it work? The gallery and files are accessed from a system provided dialogue that runs in a separate process, and provides a temporary URI to access only one file selected by the user, only until the app is restarted.

+

To make file and images work for mobile apps we made a breaking change in SimpleX Chat core. The current version can exchange files with the previous version 1.6 of the terminal app, but not with the version before that.

+

In the mobile app, to send and receive files both devices must have version 2.0 installed - so please check it with your contacts. Receiving images works in the previous version, so even if your contacts did not yet upgrade the app, they should be able to receive the images.

+

The first messaging platform without user identifiers

+

To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the network – unlike any other messaging platform.

+

Many people asked: if SimpleX has no user identifiers, how can it deliver messages?

+

To deliver mesages, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts. In the current version of the protocol each queue is used until the contact is deleted. Later this year we plan to add queue rotation to the client protocol, so that even conversations don't have long term identifiers visible to the network. This design prevents leaking any users metadata on the application level.

+

You define which server(s) to use to receive the messages, your contacts – the servers you use to send the messages to them. It means that every conversation is likely to use two different servers - one for each message direction.

+

Only client devices store user profiles, contacts, groups, and messages sent with 2-layer end-to-end encryption.

+

Read more in SimpleX whitepaper.

+

How to connect with your contacts in SimpleX Chat

+

Once you install the app, you can connect to anybody:

+
    +
  1. Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.
  2. +
  3. To make a private connection, you need to create a one-time connection link or a QR code via the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.
  4. +
  5. Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.
  6. +
+Make a private connection +
+
+ + + + + + + + diff --git a/blog/20220524-simplex-chat-better-privacy.html b/blog/20220524-simplex-chat-better-privacy.html new file mode 100644 index 0000000000..f6bee224c3 --- /dev/null +++ b/blog/20220524-simplex-chat-better-privacy.html @@ -0,0 +1,545 @@ + + + + + + + + SimpleX blog: SimpleX Chat v2.1 - better conversation privacy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v2.1 - better conversation privacy

+

Published: May 24, 2022

+

New in version 2.1 - clearing conversations without deleting contacts

+

In this version you can irreversibly delete individual messages after they were deleted by a sender, and also completely clear the conversation.

+

The only way to do it before this version was by deleting the contact, now you can keep the connection when you clear the conversation.

+

+

See v1 announcement for information on how SimpleX protects the security of the messages.

+

See v2 announcement for more information about SimpleX platform and how it works.

+

Read about SimpleX design in whitepaper.

+
+
+ + + + + + + + diff --git a/blog/20220604-simplex-chat-new-privacy-security-settings.html b/blog/20220604-simplex-chat-new-privacy-security-settings.html new file mode 100644 index 0000000000..33b10a3188 --- /dev/null +++ b/blog/20220604-simplex-chat-new-privacy-security-settings.html @@ -0,0 +1,563 @@ + + + + + + + + SimpleX blog: SimpleX Chat v2.2 - the new privacy and security features + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v2.2 - the new privacy and security features

+

Published: June 4, 2022

+

See v2 announcement for more information about SimpleX platform and how it protects your privacy by avoiding user identities of any kind in its design - SimpleX, unlike any other messaging platform, has no identity keys or any numbers that identify its users.

+

New Privacy and Security settings in version 2.2

+ +

Protect your chats

+

To protect your chats you can enable SimpleX Lock. Every time you open the chat after it was in the background for 30 second, you will need to pass biometric or pin code authentication to use the app (provided it is enabled for your device).

+

Save data and avoid sharing you are online

+

In case you want to save your mobile data or to avoid showing to your contacts that you are online, you can disable automatic image downloads. For many users it is more convenient to have images downloaded automatically, so it is enabled by default.

+

Low resolution image previews would still be shown, the senders have no way to see if you received them or not.

+ +

When you receive the links that include link previews, it is fully private - these previews are generated by the sender, and they do not expose your IP address in any way.

+

When you send the links, the app automatically downloads the link description and the picture from the website of the link. While it is convenient, it exposes your IP address to the website. To avoid it you can disable sending link previews.

+

Identify any lost messages in the chat

+

The app tracks the integrity of the messages you receive by cheching their sequential numbers and by validating that the hash of the previous message matches the hash included in the message – each conversation, effectively, is two blockchains that only you and your contact have access to.

+

In case some of the messages are lost, you would see it in the chat. It can happen because of one the following reasons:

+
    +
  • the messages have expired on the server after 30 days not being delivered.
  • +
  • the messages were removed when the server was restarted. We will add server redundancy later this year to avoid message loss in this case, for now if you see an indication that some messages were lost in the chat, you can check with your contact what it was.
  • +
  • some other app error. Please notify us via chat - we will investigate possible root causes.
  • +
  • the connection is compromised. This is very unlikely, but not an impossible scenario.
  • +
+

There is more

+

You can discover additional features we are currently testing in Experimental Features - they will be announced later!

+

More information

+

See v1 announcement for information on how SimpleX protects the security of the messages.

+

Read about SimpleX design in whitepaper.

+
+
+ + + + + + + + diff --git a/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html b/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html new file mode 100644 index 0000000000..b1bc9cecde --- /dev/null +++ b/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html @@ -0,0 +1,597 @@ + + + + + + + + SimpleX blog: SimpleX announces SimpleX Chat v3 &mdash; with encrypted calls and iOS push notifications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX announces SimpleX Chat v3 - with encrypted calls and iOS push notifications

+

Published: Jul 11, 2022

+

New in version 3

+ +

Instant notifications for iOS

+

I wrote previously about our design for iOS notifications - this is now released. The app will offer to migrate the database when updated, and then you need to choose notifications mode – instant or periodic push notifications, or previously available periodic background refresh that does not use push notifications.

+

To deliver the notifications to iOS devices we use our notification server, as there is a single private key that Apple issues for the app. This server has minimal amount of information about your chat activity:

+
    +
  • it does not have the addresses of messaging queues used to send and receive messages - there is an additional address used for notification server to receive notifications from the messaging servers.
  • +
  • notifications themselves do not include message content or contacts, even in encrypted form - they only contain end-to-end encrypted metadata about the server and the queue that has available messages - so Apple servers cannot access the information about how many contacts you have or how frequently each of them messages you - they can only see the total number of notifications your device receives.
  • +
  • message senders do not connect to the notification server, so it cannot in any way correlate sent and received traffic across multiple devices.
  • +
+ +

Please note: for periodic notifications to work the app has to be in the background - if the app is completely stopped (removed from the recent apps), it will not check the new messages and you will not receive notifications. Instant notifications work even when the app is completely stopped.

+

End-to-end encrypted audio/video calls

+

You can now call your contacts via WebRTC, connecting via SimpleX Chat relay servers or peer-to-peer, and in the near future you will be able to configure your own STUN/TURN servers used to establish the connection. The calls are end-to-end encrypted - the key is negotiated via the connection you already have with your contact in the chat, that is also used as a signalling layer for WebRTC - in most cases only three messages in total have to be sent by your and your contact's clients for the call to start, including the initial call invitation.

+ +

The calls are still quite limited, especially on iOS, - for example, you cannot continue the call while the app is in the background.

+

Database export and import

+

Quite a few users asked - how can I move my chat profile to a new device? SimpleX Chat v3 has a solution for that - you can now export chat database from one device and import it into another - even to another platform, e.g. you can move chat database from Android phone to iOS or to the terminal (console) client.

+ +

Some important limitations:

+
    +
  • you cannot run the same chat profile from two devices, neither at the same time nor in turns. You should only use the latest database version - every time you want to move it to another device you need to export a new chat archive from the device that was the latest to use it, and import it to the device where you want to use it next.
  • +
  • we plan to add internal database encryption soon, but currently it is stored on the device without encryption, and the exported archive is also not encrypted. You should store it securely, and encrypt it if you store it in the cloud or send via email.
  • +
+

This feature can be useful in some other scenarios:

+
    +
  • managing multiple chat profiles - it's not very convenient, and a better support of multiple profiles is coming soon.
  • +
  • share access to the same profile with other people, as long as it is not used at the same time. For that use case it may be better to run SimpleX Chat terminal client in the cloud, as we do with our public account that you can connect to via the app.
  • +
  • preserve chat profile when you need to temporarily delete the app from your device.
  • +
+

Protocol privacy and performance improvements

+

Adding push notifications for iOS required SimpleX Messaging Protocol changes. We managed not just to keep the same level of meta-data privacy from passive observers, but to improve it - now all message meta-data that is passed from the server to the recipient is included into the same encrypted envelope as the message itself - as before, there is no identifiers or ciphertext in common inside TLS traffic between received and sent traffic of the server, and now there is no message timestamp inside TLS as well.

+

We also improved the protocol flow for establishing bidirectional connection between two users - it is substantially faster now, consuming much less network traffic and battery. It improves the time it takes to connect to your contacts and to start delivering images and files.

+

All these changes did not affect backward compatibility - if your contact has the previous version of the client, or you are connecting to a previous version of the server, the previous version of the protocol will be used - SimpleX has independent version negotiation in 4 protocol layers since v1, allowing us to evolve the protocols without any disruption to the users.

+

SimpleX platform

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter. SimpleX Chat is our first application, a messaging application built on the SimpleX platform.

+

The first (and we believe the only) messaging platform without user identifiers of any kind - 100% private by design!

+

To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the servers and the network – unlike any other messaging platform. Not only SimpleX doesn't use phone numbers or emails, as Signal and many other platforms, it also does not have any persistent identifiers to identify users - unlike many other messengers considered private - Session, Cwtch, Ricochet, Briar, Jami, etc., - all these platforms have global user identifiers, uniquely identifying their users and creating the risks of de-anonymising the users.

+

Why having users' identifiers is bad for the users?

+

When each user has a unique identifier on the platform, even if this is just a random number, e.g. as a Session ID, it creates risks that whoever gains access to the platform data can observe how the users are connected and how many messages are transmitted between them, and then correlate this information with the existing public social networks, determining the real identities of some users. Even with the most private messengers built on top of Tor network, having a persistent identity means that if you talk to two different users via the same profile they can prove that they communicate with the same person, as they would use the same address to send messages.

+

SimpleX platform avoids these risks by not having any user identity in its design - so even if you talk to two different people from the same chat profile, they would not be able to prove they are talking to the same person - only that user profiles look the same. And we are planning to add a feature allowing to have a different display name for each contact you connect to - quite a few users asked for it.

+

How does it work

+

Many people asked: if SimpleX has no user identifiers, how can it deliver messages?

+

I wrote about it in v2 release announcement and you can get more information about SimpleX platform objectives and technical design in the whitepaper.

+

We ask you to help us pay for 3rd party security audit

+

I will get straight to the point: I ask you to support SimpleX Chat with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.

+

We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.

+

It is possible to donate via GitHub, which is commission-free for us, or via OpenCollective, that also accepts donations in crypto-currencies, but charges a commission.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html b/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html new file mode 100644 index 0000000000..77224a84e3 --- /dev/null +++ b/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html @@ -0,0 +1,613 @@ + + + + + + + + SimpleX blog: SimpleX Chat v3.1-beta is released &mdash; improved battery/traffic usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v3.1-beta is released - improved battery/traffic usage

+

Published: Jul 23, 2022

+

What's new

+ +

Terminall app: access to messaging servers via SOCKS5 proxy / Tor

+ +

While SMP protocol is focussed on protecting application-level meta-data by using pairwise connection identifiers instead of user identifiers (that are used by all other messaging platforms), there are scenarios when it is important for the users to protect their IP addresses from the servers - quite a few users have been somewhat disappointed that we didn't add it earlier.

+

This release of terminal app supports accessing the servers via Tor, but the servers themselves are still available on their usual addresses. We are planning to add .onion addresses (v3 hidden service) to all messaging servers we provide, and the users who self-host the servers will also be able to have dual servers addresses - so that one party in the conversation can access the servers via .onion address without necessarily requiring that the other party uses Tor as well.

+

To access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with -x option. See terminal app docs for more information.

+

As this is a beta release, to install it you need to use this command:

+
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | sh -s -- v3.1.0-beta.0
+
+

Mobile apps: join and leave chat groups

+

+

Groups have been supported by SimpleX Chat core for a very long time, but there was no user interface in the mobile apps to use them - users had to use chat console to create groups, add members, and accept invitations.

+

This release allows accepting the invitations to join groups via mobile apps UI, making it much easier to create groups - only one user (a group owner) needs to use chat console, while all other groups members just need to tap a button in the UI to join or leave the group. Full group UI is coming in v3.1 in 1-2 weeks, but you can already start using groups today by installing beta-versions of mobile apps via TestFlight, Google PlayStore Beta and APK download.

+

To manage groups via terminal app or via chat console in the mobile apps you have to use these commands:

+
    +
  • to create group: /g <group_name> [<description>]
  • +
  • to add member (admin by default): /a <group_name> <contact_name> [owner/admin/member]
  • +
  • to remove member from the group: /rm <group_name> <contact_name>
  • +
+

Accepting group invitations, leaving and deleting groups no longer requires using console commands.

+

Optimized battery and traffic usage - up to 90x reduction

+

To reduce battery and traffic usage this release updated SMP protocol to allow batching multiple server commands (up to 90!) into one traffic block – provided both the server and the client are upgraded. It means that if you have 90 contacts (or group members) on one server, to subscribe to all messaging queues you now need to send only one 16kb block instead of ~1.5Mb of traffic (90 blocks). It also hides how many contacts you have from any attackers who observe your network.

+

You might notice that sending commands to multiple queues in one block would allow the server to correlate that all these queues belong to the same user, even though the current server implementation we use does not do it. But even without batching, as the commands are sent via the same TCP connection, this correlation was already possible, so compared with the previous version it has no downsides.

+

To mitigate the risk of servers correlating your messaging queues we will soon add an option to access each queue via a separate TCP connection, which will have to be used together with access via Tor (as otherwise the servers would still see the same IP address). While it will increase battery and traffic consumption, it will also provide the highest level of privacy.

+

Docker configuration for self-hosted SMP servers

+

When we released SimpleX Chat v3 two weeks ago many users wanted to host messaging servers in docker containers. So, we are now offering two versions of docker configurations:

+
    +
  • fast and convenient - it downloads SMP server binary from GitHub.
  • +
  • more secure - it builds SMP server from the source code.
  • +
+

Let us know how it works for you!

+

SimpleX platform

+

We are building a new platform for distributed Internet applications where privacy of the messages and the network matter. SimpleX Chat is our first application, a messaging application built on the SimpleX platform.

+

The first (and the only?) messaging platform without user identifiers of any kind - 100% private by design!

+

To protect identities of users and their connections, instead of user identifiers visible to the servers and/or the network (that are used by all other messaging platforms), SimpleX Chat uses pairwise identifiers of connections between the users – there are two queues in each connection, each queue having 2 different identifiers to send and to receive the messages. It increases the number of used identifiers to the square of the number of users, making it more difficult (or impossible) to determine who is talking to whom. I wrote previously why it is bad for the users' privacy to have any identifiers, even random numbers, associated with their profiles.

+

If SimpleX has no user identifiers, how can it deliver messages?

+

I wrote about it in v2 release announcement and you can get more information about SimpleX platform objectives and technical design in the whitepaper.

+

Privacy: technical details and limitations

+

SimpleX design follows "defence in depth" security principles having multiple overlapping defensive mechanisms to protect users privacy and security:

+
    +
  • TLS transport with server identity validation and channel binding, limited to the most secure cryptographic algorithms.
  • +
  • Three levels of encryption that both protect message content and meta-data, preventinc trafic correlation even if TLS is compromised: +
      +
    • end-to-end encryption in each messaging queue.
    • +
    • end-to-end encryption of the conversation using double-ratchet algorithms, that provides OTR messaging with forward secrecy and break-in recovery.
    • +
    • additional encryption layer between the server and message recipient, to prevent traffic correlation by ciphertext or any identifiers.
    • +
    +
  • +
  • Four levels of message padding to prevent any attack based on the content size - the TLS transport block is padded to a fixed 16kb size, and each of 3 encrypted envelopes is padded to a constant size before encryption as well.
  • +
+

What we plan to add soon to further improve privacy and security:

+
    +
  • message queue rotation, so that pairwise identifiers become temporary, and your conversations move from server to server automatically.
  • +
  • access to the messaging servers via Tor v3 hidden services.
  • +
  • message mixing - adding latencies to message delivery, to protect against traffic correlation by message time.
  • +
  • using Tor v3 hidden service addresses for messaging servers.
  • +
  • passphrase-based local database encryption.
  • +
+

SimpleX Chat README page has more details about it.

+

We ask you to help us pay for 3rd party security audit

+

I will get straight to the point: I ask you to support SimpleX Chat with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.

+

We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.

+

It is possible to donate via GitHub, which is commission-free for us, or via OpenCollective, that also accepts donations in crypto-currencies, but charges a commission.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20220808-simplex-chat-v3.1-chat-groups.html b/blog/20220808-simplex-chat-v3.1-chat-groups.html new file mode 100644 index 0000000000..c64792e0db --- /dev/null +++ b/blog/20220808-simplex-chat-v3.1-chat-groups.html @@ -0,0 +1,612 @@ + + + + + + + + SimpleX blog: SimpleX Chat v3.1 is released &mdash; with secret groups and server access via Tor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v3.1 is released - with secret groups and server access via Tor

+

Published: Aug 8, 2022

+

What's new

+ +

Secret chat groups

+

+

It's been nearly a year since the users of SimpleX Chat terminal app started experimenting with the groups, and now it is available to mobile app users as well. Many bugs were fixed, the stability was improved, but there are both the features we need to add and the bugs we need to fix to make groups more useful - we really look forward to your feedback. You can send any suggestions via the app by choosing Chat with the developers via app Settings (or using /simplex command in the terminal app) – this would connect you to SimpleX team via its fixed chat address.

+

SimpleX network is decentralized, so how do groups work? Unlike Matrix or Signal that host the group profile and the list of group members on their servers, SimpleX servers have no information about the group's existence - only its members do. SimpleX network does not assign any globally unique identifiers to the group, there is only a local database identifier and the list of members stored on members' devices. A user has an independent connection to each member in a group. When a user sends a message to the group, the app sends this message independently to each member. You can read more about how groups work in SimpleX Chat Protocol.

+

But how can it scale, you might ask? It simply won't, and the current design for the groups is only suitable for relatively small groups of people who know each other well, definitely not larger than few hundred members – this design prioritized privacy and security of the group over its size or performance. For example, to send a message to the group of 100 members a user would need to send a total of ~1.6mb of data (as each message uses a fixed size block of 16kb). And if you were to send a 1mb file then it would also require sending it 100 times (provided each member accepts it).

+

What if you need to send many large files to group members? We will be developing a file hosting server where the users will be able to upload the file (or image) once, and only send the file link and credentials to all group members, without the need to send the actual file. A small hosting quota will be available to all users for free, paid for by donations, and for larger files or to increase the total quota the users would either have to pay a small hosting cost or to self-host this server – it will be available as an open-source code.

+

What if you need to have a large group - e.g. 100,000 members or more? We will be introducing SimpleX channels later this year, that can be both public and private. These channels would require a server to host them, either provided by SimpleX Chat or self-hosted - same as for a website. If this is a public channel it would be optionally accessible via the web browser as well, and it will be possible to embed it into any webpage.

+

Other group improvements we will add soon:

+
    +
  • manage notifications in each group independently.
  • +
  • search for messages - it is useful for direct conversations too, but more important for groups.
  • +
+

Access messaging servers via Tor

+

 

+

SimpleX protocols are focussed on protecting application-level meta-data – they don't have any user identifiers used by all other messaging platforms, instead relying on pairwise connection identifiers.

+

But there are scenarios when users need to protect their IP addresses from the servers and any network observers – this is best done by using Tor to access any network services.

+

This release allows to access SimpleX messaging servers via Tor on all platforms:

+
    +
  • terminal app beta supported it for a couple weeks now: to access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with -x option. See terminal app docs for more information.
  • +
  • Android app supports access via Tor using Orbot SOCKS proxy. Once you install and start Orbot, you need to enable Network & Servers / Use SOCKS proxy setting in the app to access SimpleX servers via Tor.
  • +
  • iOS app can also be used with Orbot iOS app (that is installed as a system-wide VPN provider). The only setting you might need to change is to increase network timeouts in the app - to do that you have to enable Developer tools, and then chose Network & Servers / Advanced network settings / Set timeouts for proxy.
  • +
+

Currently all servers are accessed via their public Internet addresses, and while users can self-host messaging servers on .onion addresses (as v3 hidden services), it would require both connected contacts to use Tor. We are planning to add support for dual server addresses very soon, to allow the same server to be accessed both via its public Internet address and via .onion address, so that users can access servers without exiting Tor (via .onion address), but their contacts can access the same servers without using Tor.

+

Advanced network settings

+

To reduce traffic on slow networks we added network access settings. To use these settings, you need to first enable Developer tools and then choose Network & Servers / Advanced network settings:

+
    +
  • if your connections to the servers are unstable, and you frequently see the spinners in the list of chats, please increase the connection and protocol timeouts - it should reduce the traffic, but it may also make the app a bit slower when your Internet connection is slow.
  • +
  • if your connection to the servers appears stable, but the traffic usage is high, please try disabling TCP keep-alive setting or increasing keep-alive idle period (TCP_KEEP_IDLE) and interval (TCP_KEEP_INTVL).
  • +
+

Once we investigated how these settings affect traffic and user experience we will simplify them - huge thanks to everyone testing them and reporting any traffic issues.

+

New app icons

+ +

Many users asked to allow customizing the app, this is just a start - you can now choose either light or dark icon option via Appearance settings.

+

More options to customize the app are coming - please let us know what are the most important.

+

Published chat protocol

+

The low level SimpleX protocols were published long time ago, and updated to reflect the evolution of the protocols, the high level chat protocol was not published before. The reason for that was to allow us to iterate it quickly, without committing to any of the decisions.

+

This is the first draft of SimpleX Chat Protocol - let us know any questions or suggestions.

+

Other changes since v3

+

Since v3 release we also optimized battery and traffic usage - with up to 90x traffic reduction in some cases – and published two docker configurations for self-hosted SMP servers. Read more about it in the previous beta version announcement.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

We ask you to help us pay for 3rd party security audit

+

I will get straight to the point: I ask you to support SimpleX Chat with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.

+

We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.

+

It is possible to donate via:

+
    +
  • GitHub: it is commission-free for us.
  • +
  • OpenCollective: it also accepts donations in crypto-currencies, but charges a commission.
  • +
  • Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20220901-simplex-chat-v3.2-incognito-mode.html b/blog/20220901-simplex-chat-v3.2-incognito-mode.html new file mode 100644 index 0000000000..dc3219da06 --- /dev/null +++ b/blog/20220901-simplex-chat-v3.2-incognito-mode.html @@ -0,0 +1,603 @@ + + + + + + + + SimpleX blog: SimpleX Chat v3.2 is released &mdash; meet Incognito mode, unique to Simplex Chat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v3.2 is released - meet Incognito mode, unique to Simplex Chat

+

Published: Sep 1, 2022

+

What's new

+ +

Implementation audit is arranged for October!

+

Incognito mode

+

+

SimpleX is already private, so why do we need an incognito mode, you may ask.

+

You indeed can choose a pseudonym as your main profile name, but there are several problems:

+
    +
  • many users want to have their real name as their main profile, so that their friends recognise them. SimpleX objective is to provide anonymity from the network operators, but not necessarily from your contacts.
  • +
  • even if you choose a pseudonym, it would be used for all your contacts. And if two of them meet, while they cannot prove they are talking to the same person, as they use different addresses in SimpleX network to send you the messages, they could suspect it.
  • +
  • any pseudonym you manually choose leaks some information about you, as it's not really random.
  • +
+

You could also use multiple chat profiles - currently you can only switch between them via export/import, we will make it easier very soon! But there are problems with multiple profiles too:

+
    +
  • if you make many anonymous connections, each in its own user profile, you would end up having too many profiles - it is very inconvenient to manage.
  • +
  • sometimes, as your relationship with your contact evolves, you may want to share your main profile with them and have them among your friends - multiple profiles don't make it possible.
  • +
+

So, the new Incognito mode allows having a new random name shared with each new contact, while having them all in the same user profile, and without the hassle of managing it manually. It's like a private mode in the browsers, where you can temporarily enable it when you connect to somebody you don't trust, and then disable it when connecting to the friend who knows you. It can be turned on via the app settings - see the pictures.

+

I don't know any other messenger with this feature, and I always wanted to have this mode, so we are really looking forward to your feedback about it!

+

Assign names to your contacts

+

You can now change the name under which your contacts appear in the chats. This is particularly useful when somebody connected to you using a random name – you can change it to be related to the context of the connection.

+

Using .onion server addresses with Tor

+

 

+

We have released support for using SOCKS proxy to access messaging servers via Tor, but previously the servers were still available via their public Internet addresses. It means that while your IP address was protected from the server, the whole Tor circuit could have been observed by some actors, and for some communication scenarios it is not desirable.

+

This release adds support for servers with multiple hostnames - all servers provided by SimpleX Chat now have dual addresses (one public and one .onion), and you can have your own servers available via two addresses as well - all you have to do is to install Tor client on your server and register its address with Tor. If you server has both public and .onion address, it is not really hidden, so you should enable HiddenServiceSingleHopMode to reduce the latency of connection - it protects anonymity of the people who connect to the server, but not of the server itself. The server address would include both its public and onion address, as you can see in the server addresses in the app (in the contacts pages) - you should use the same format for the addresses of your servers.

+

Both android and iOS app allow managing whether .onion addresses are used, and you can also enforce using .onion addresses - in this case the app will not connect to the server unless one of its hostname is .onion address. On Android, .onion addresses are used by default when SOCKS proxy is enabled.

+

Endless scrolling and search in chats

+

Now you can access the full chat history via the app - it's embarrassing how long it took us to add it! And you can search the messages as well.

+

Choose accent color and dark mode

+

Many of you said that blue is the worst possible color, so you can now make the app buttons and links look like you want! My favourite colours are green and orange.

+

And you can choose dark or light mode independently of the system settings.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

We ask you to help us pay for 3rd party security audit

+

Our great news is that we have already signed the agreement and paid for the security audit!

+

It is planned in October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.

+

This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.

+

Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.

+

Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.

+

It is possible to donate via:

+
    +
  • GitHub: it is commission-free for us.
  • +
  • OpenCollective: it also accepts donations in crypto-currencies, but charges a commission.
  • +
  • Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20220928-simplex-chat-v4-encrypted-database.html b/blog/20220928-simplex-chat-v4-encrypted-database.html new file mode 100644 index 0000000000..6af000dfca --- /dev/null +++ b/blog/20220928-simplex-chat-v4-encrypted-database.html @@ -0,0 +1,626 @@ + + + + + + + + SimpleX blog: SimpleX Chat v4.0 with encrypted database is released + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v4 with encrypted local database is released

+

Published: Sep 28, 2022

+

What's new in v4

+ +

Also, this version adds German language to mobile apps UI - huge thanks to Michael who contributed them!

+

Other new features since v3:

+
    +
  • secret chat groups (see details in v3.1 announcement - they are fully decentralized, only their members know these groups exist.
  • +
  • accessing messaging servers via Tor with support for .onion server addresses (see details in v3.1 and v3.2 announcements) - to protect users anonymity on the TCP transport level.
  • +
  • Incognito mode - sharing a random profile name with each new contact, to completely eliminate any shared data between them (see details in v3.2 announcement).
  • +
  • endless scrolling and search in chats.
  • +
  • reduced Android APK size for direct download and in F-Droid repo from 200 to 50Mb!
  • +
+

Implementation audit is arranged for October!

+

Local chat database encryption

+ +

SimpleX Chat focus has always been on protecting messages in delivery, not when they are stored on the device. This release changes it - now all messages that you receive and send are stored on the device encrypted with SQLCipher.

+

Please note: If you are already using SimpleX Chat, your database will remain unencrypted until you enter the passphrase via the app settings. You have to remember the passphrase you choose, as there is no way to recover it if it is lost.

+

By default your passphrase will be stored securely on the device (in KeyChain on iOS or encrypted with the key stored in TPM, if available, on Android) - it is only accessible to the app, and only on one device. Storing passphrase is required for instant notifications to work. In this case, if you lose the passphrase, the app will continue to work, but you will not be able to change the passphrase and to migrate your user profile to another device.

+

For additional security of your messages you also have the option to remove the passphrase from the device. In this case you will need to enter the passphrase every time you start the app. The notifications will continue to work only while the app is in the background. For iOS it means that periodic and local notifications will work, but instant notifications will only show that there is a message available, but not message content or who it is from - you will need to open the app and enter the passphrase to see the messages. In this case, if you lose the passphrase, you will not be able to open the app or decrypt the database - so make sure you store it safely.

+

Self-hosted WebRTC ICE servers

+ +

You could make audio and video calls via SimpleX Chat WebRTC servers since v3 - that meant that our servers could observe your IP addresses. This release adds configuration to use your own STUN/TURN servers, helping you protect your privacy.

+

See this guide to learn how to deploy your own coturn server and to configure the mobile apps to use it.

+

Improved stability of creating new connections

+

Secret groups made SimpleX Chat much more useful, but because SimpleX groups are completely decentralized and for them to work each member should connect to all other members, sometimes these connections fail and the group becomes fragmented - some members do not receive all messages. That was more common for larger groups, as the number of required member connections is O(n^2) of the group size.

+

The reason for that problem was that some network operations required for group connections were not retried. This release improves stability of all network operations - receiving messages, making new contact connections, receiving files and connecting to members in the groups you join.

+

Deleting files and media

+ +

While the database with messages and all contacts is now encrypted, the files you receive and send are not (we are planning to improve it later). To protect the security of the files we have added an option to delete all files from the app storage - just make sure not to do it before the files you send are delivered to the recipients, or they won't receive them.

+

For developers - TypeScript SDK for integrating with SimpleX Chat

+

It's been quite some time since it's been possible to create a chat-bot using SimpleX Chat as a library - but you had to either write Haskell code or use foreign function interface in any other language.

+

With v4 we are announcing TypeScript SimpleX Chat Client SDK that you can use to create any integrations with SimpleX Chat CLI.

+

You can run SimpleX Chat CLI as a local WebSockets server on any port, we use 5225 here:

+
simplex-chat -p 5225
+
+

Then you can create a JavaScript or TypeScript application that would connect to it and control it via a simple WebSocket API. TypeScript SDK defines all necessary types and convenience functions to use in your applications. See this sample bot and README page.

+

SimpleX Chat API allows you to:

+
    +
  • create and change user profile (although in most cases you would do it manually, via SimpleX Chat terminal app).
  • +
  • create and accept invitations or connect with the contacts.
  • +
  • create and manage long-term user address, accepting connection requests from the code or automatically.
  • +
  • create, join and manage groups - this can be used, for example, to connect two different people who connected to chat-bot.
  • +
  • send and receive files.
  • +
+

Some possible applications you can create:

+
    +
  • peer-to-peer trading bots, that would connect people with matching buy/sell orders,
  • +
  • bots to access information,
  • +
  • language translation bots,
  • +
  • etc.
  • +
+

As SimpleX Chat protocols provide strong encryption and authorization of the connections, you could use it not only in various communication scenarios, but also to remotely control any equipment where high level of security is required, for example:

+
    +
  • smart home automation,
  • +
  • network services,
  • +
  • remote deletion of application data,
  • +
  • etc.
  • +
+

We are really looking forward to seeing what applications you create - please submit your ideas and implementations, we will publish the links on a separate page on the website and GitHub repository.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

We ask you to help us pay for 3rd party security audit

+

We have already signed the agreement and paid for the security audit!

+

It is planned for October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.

+

This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.

+

Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.

+

Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.

+

It is possible to donate via:

+
    +
  • GitHub: it is commission-free for us.
  • +
  • OpenCollective: it also accepts donations in crypto-currencies, but charges a commission.
  • +
  • Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
  • +
  • Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html b/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html new file mode 100644 index 0000000000..21e9b7fbc9 --- /dev/null +++ b/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html @@ -0,0 +1,656 @@ + + + + + + + + SimpleX blog: Security assessment by Trail of Bits, the new website and v4.2 released + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Security assessment by Trail of Bits, the new website and v4.2 released

+

Published: Nov 8, 2022

+

Security assessment by Trail of Bits

+ +

When we first launched the app in March the response on Reddit was: "Have you been audited or should we just ignore you?".

+

We have a growing number of enthusiasts using SimpleX Chat who can accept the security risks of unaudited system, but the users who depend on their security were patiently waiting until some independent experts review our codebase.

+

Trail of Bits, a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects, had 2 engineers reviewing SimpleX Chat for one calendar week, specifically simplexmq library that is responsible for all cryptography and networking of SimpleX platform.

+

2 medium and 2 low severity issues were identified, all of which require a high difficulty attack to exploit – the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. 3 of these issues are already fixed in v4.2.

+

In the course of the audit, Trail of Bits assessed the maturity of the simplexmq library across eight categories and found five of them to be strong or satisfactory.

+

Explained below is our understanding of the issues, as well as fixes implemented by the SimpleX Chat team after project completion. The full security review is available via Trail of Bits publications.

+

We are hugely thankful to Trail of Bits and their engineers for the work they did, helping us identify these issues and supporting the ongoing efforts to make SimpleX Chat more secure.

+

Medium severity issues

+

X3DH key exchange for double ratchet protocol

+

We made a mistake implementing X3DH key exchange - the key derivation function was not applied to the result of concatenation of three DH operations. The attack to exploit this mistake has high difficulty, as it would require compromising one of private keys generated by the clients, and also it would only affect forward secrecy until break-in recovery happens (after both sides sent some messages).

+

Please note that SimpleX does not perform X3DH with long-term identity keys, as the SimpleX protocol does not rely on long-term keys to identify client devices. Therefore, the impact of compromising a key will be less severe, as it will affect only the secrets of the connection where the key was compromised.

+

This issue is fixed in version 4.2 in this PR, and if both clients are updated the key exchange will not have this vulnerability. Also, previously created connections should be secure as long as both sides sent the messages, but if you believe that your private key(s) could have been compromised (for example, if you used SimpleX Chat since before we added database encryption), we recommend that you create the new connections with your contacts, at least with the security-critical ones. Simply rotating the connection queue (manual queue rotation is added in version 4.2) will not be sufficient, as this rotation does not re-initialize the ratchets - this is something we will be adding in the future.

+

Keys are stored in unpinned memory and not cleared after their lifetime

+

The problem here is that the memory with cryptographic keys can be swapped to the storage and potentially accessed by an attacker who has root-level access to the device (or the level of access required to access swap file of the application). So, if you are running SimpleX Chat on desktop you could improve its security by running it in an isolated container.

+

In our opinion, on mobile operating systems it is less severe as each application already runs in its own container, and applications do not share access to their swap areas (e.g., on Android swap is a compressed area in RAM not accessible to other applications).

+

To exploit this issue an attacker needs to have a privileged system access to the device. Also, we believe Haskell generational garbage collection makes the lifetime of unused memory lower than in other languages.

+

We will be addressing this issue in the near future, possibly by using library secure-memory created by Kirill Elagin, an engineer at Serokell, or some other similar approach.

+

Low severity issues

+

The string padding function is incorrect for long messages, and the string unpadding function throws exception for short messages

+

Both these issues are fixed in 4.2 in this PR, with the additional unit tests, and we also validated that even before the fix the strings that would cause such exception were never passed to this function – The SimpleX Chat team could not find the possibility of the attack that would succeed because of this issue.

+

What's next

+

There are areas of SimpleX Chat that were out of scope of this review, specifically:

+
    +
  • the chat protocol implementation and mobile UIs, as they includes no cryptography of networking (with the exception of Android app storing encrypted database passphrase and key exchange/encryption for WebRTC calls).
  • +
  • push notifications server that is used by iOS clients.
  • +
+

We will be arranging to review these areas separately.

+

The new website

+

Our previous website was created 2 years ago to present SimpleX idea, there was no SimpleX Chat at the time - we only had a prototype implementation of SimpleX Messaging Protocol server then.

+

A lot of people told us that our website didn't explain well enough who SimpleX Chat is for, what problems it solves, and how it is different from the alternatives. So, while we love to be focused on the chat application, we decided to make the new one.

+

We hope that our new website better answers these questions. If you think something should be added/removed/changed - please let us know. Thank you!

+

SimpleX Chat v4.2 released!

+

New in this release:

+
    +
  • fixed 3 issues from the security audit!
  • +
  • group links - group admins can create the links for new members to join
  • +
  • auto-accept contact requests + configure whether to accept incognito and welcome message
  • +
  • small things: change group member role, mark chat as unread, send stickers and GIFs from Android keyboards.
  • +
+

Beta features (enable Developer tools to try them):

+
    +
  • manually switch contact or member to another address / server (it has to be supported by both clients to work)
  • +
  • receive files faster (enable it in Privacy & Security settings)
  • +
+ +

  

+

It's been requested by many users - to be able to join a group via link. Because SimpleX Chat groups are fully decentralised, and there is no server-side state, joining via these links requires the participation of the link creator who has to be online to accept the group joining request.

+

The way it works under the hood is similar to how contact addresses work:

+
    +
  1. Group admin or owner creates a long term address that is technically the same as a user address, but it is associated with a specific group.
  2. +
  3. The user that joins the group can identify that this link belongs to some group by an additional piece of data in the link - {"type": "group", "groupLinkId": "some random string"}. The ID in this link does not represent a group identity, every time any user creates a new link for the same group, this ID will be different. This ID is used by the joining client to identify the group and automatically accept the invitation when it is received.
  4. +
  5. When admin receives a connection request, they automatically accept it and send invitation link to join the group.
  6. +
  7. The joining user compares the ID in the invitation with the ID in the link, and if they match – automatically accepts the invitation.
  8. +
+

After that it works as when joining via the manual invitation - the joining user will be establishing the connection with all existing members to be able to send messages to the group.

+

The link can be created via the group page, as shown on the picture.

+

We have several groups you can join to ask any questions or just to test the app:

+ +

You can join these groups either by opening these links in the app or by opening them in desktop browser and scanning QR code.

+

Let me know if you'd like to add some other countries to the list. Join via the apps to share what's going on and ask any questions!

+

Auto-accept contact requests

+

  

+

When somebody connects to you via your long-term address you have to manually accept a connection request (it shows in blue color in the list of chats). The feature that we added in this release allows to configure the app to accept contact requests automatically, and also choose whether this contact should receive your main profile or a random incognito profile (independent of the current app setting), and add an optional auto-reply message.

+

This feature is useful if you publish your address on your webpage or social profile, and do not want to screen people who want to connect to you. You may want to send a standard welcome message, for example, if it is an online store, and you need to share any information with everybody who contacts you.

+

Our @simplex account that you connect to when you choose "Connect to developers" in the app used this feature for a long time, and now it is available to mobile app users.

+

Some small things

+
    +
  1. +

    Changing group member role is a very basic feature, but it was only added in this release.

    +
  2. +
  3. +

    You can now mark a conversation as unread, for example if you accidentally marked all messages as read and you want to review it later.

    +
  4. +
  5. +

    Send stickers and GIFs from Android keyboards, and, finally, the bug with backspace button is resolved as well.

    +
  6. +
+

Change your delivery address (BETA)

+ +

To manually switch any of your contacts (or a group member to a new server address) enable Developer tools and choose "Change receiving address" on the contact page. As long as they run a new version of the app and online, the switch should only take a few seconds.

+

That is a major improvement of metadata privacy of SimpleX protocols, because previously, while we didn't have user identifiers, the pairwise identifiers of messaging queues used to deliver messages were used for as long as the contact existed. Now these identifiers are temporary, and in a near future we will be adding automatic rotation of these delivery addresses.

+

It is also useful when you want to migrate message delivery to another server, for example, if you used SimpleX Chat default servers and now want to self-host your own. Or, maybe, you need to change the address of your server. Previously it would require creating new contacts and losing conversation histories, and now all you have to do is to change server configuration in the app, and when the change of the address is triggered (currently, only manually, and in the near future - automatically), your contacts will be migrated to a new server, without you doing anything - it only requires each party sending 2 messages to negotiate the reconnection, and it would also rotate the encryption keys used for the outer layer of E2E encryption.

+

Receive images and small files faster (BETA)

+ +

From version 4.2 all files smaller than ~92kb (equal to 6 message blocks) will be sent in the same connection where you have the chat, and files smaller than ~231kb (the limit for image size) can also be optionally received via the same connection – the latter requires enabling "Transfer images faster" in Privacy & security settings (it will be available after you enable Developer tools). There are two reasons why it is not on by default yet: 1) we wanted to ensure it is stable; 2) there is a small effect on metadata privacy of having a burst of traffic in the same connection where you are having the main conversation.

+

This functionality was created for the future voice messages, as they need to be sent without acceptance, so that the recipients can listen to them even when the sender is offline.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see the information on our new website - it also answers all these questions.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

It is possible to donate via:

+
    +
  • GitHub - it is commission-free for us.
  • +
  • OpenCollective - it charges a commission, and also accepts donations in many crypto-currencies.
  • +
  • Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
  • +
  • Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
  • +
  • please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20221206-simplex-chat-v4.3-voice-messages.html b/blog/20221206-simplex-chat-v4.3-voice-messages.html new file mode 100644 index 0000000000..5940afcca7 --- /dev/null +++ b/blog/20221206-simplex-chat-v4.3-voice-messages.html @@ -0,0 +1,620 @@ + + + + + + + + SimpleX blog: SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration.

+

Published: Dec 6, 2022

+

SimpleX Chat reviews

+

Since we published the security assessment of SimpleX Chat completed by Trail of Bits in November, several sites published the reviews and included it in their recommendations:

+ +

What's new in v4.3

+ +

Instant voice messages

+ +

Voice messages, unlike normal files, are sent instantly, in the existing connection with your contact and without acceptance from the recipient. For this reason we limited the size of voice messages to ~92.5kb (an equivalent of 6 messages), that limits the duration to 30 seconds on iOS and to ~42 seconds on Android (the size is different because of different encoders), with an average sound quality. The voice messages are sent in MP4AAC format that is natively supported both on iOS and on Android, and you can play voice message files outside of SimpleX Chat app.

+

Users who do not want to receive voice messages can disable them, either globally, for all contacts, or for each contact independently. Please note that the global preference change will only affect the contacts where you shared your main profile (not incognito contacts) and where you didn't change the preference for the particular contact. Groups have a separate policy that allows disabling voice messages for all members (they are allowed by default). The owner can set this policy when creating a group or later, via Group preferences page.

+

Irreversible message deletion

+

  

+

When you receive email, you have full confidence that the sender cannot delete their email from your mailbox after you received it. And it seems correct – in the end, this is your device, and nobody should be able to delete any data from it.

+

Most existing messengers made an opposite decision – the senders can irreversibly delete their messages from the recipients' devices after they were delivered, whether recipients agree to that or not. And it seems correct too - this is your message, you should be able to delete it, at least for a limited time; that the message is on the recipient device doesn't change your ownership of this message.

+

While both these statements appear correct, at least to some people, they simply cannot both be correct at the same time, as they contradict each other - either one or both of them must be wrong. This appears to be a very polarising subject, and the polls I made yesterday show it - the votes are split evenly.

+

You may want to be able to delete your messages even after they are received to protect your privacy and security, and you want the communication product you use to enforce it. But you may also have many reason to disagree to the deletion of messages on your device for several different reasons:

+
    +
  • it may be a business context, and either your organisation policy or a compliance requirement is that every message you receive must be preserved for some time.
  • +
  • these messages may contain threat or abuse and you want to keep them as a proof.
  • +
  • you may have paid for the the message (e.g., it can be a consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation.
  • +
+

Instead of taking any side in this choice, we decided to allow to change this behaviour either globally or separately for each contact or group. That makes SimpleX Chat unique, being suitable both for the communication contexts where email is traditionally used and in informal or privacy sensitive contexts, that would allow the senders to delete messages irreversibly, provided that the recipients agree to that.

+

In any case, the senders can never be 100% certain that the message is deleted from the recipient's device - recipient can be running a modified client that does not honour the conversation setting, and there is no way to ascertain which code your contact runs on their device.

+

If irreversible message deletion is not allowed in the conversation, the senders can still mark their messages as deleted, and it would show "mark deleted" placeholder in the conversation. The recipients can then both reveal the content of the original message and fully delete it on their devices.

+

SMP servers configuration and password

+

     

+

When you self-host your own SMP server you may want to make it public so that anybody can use it to receive messages. But many users want to host their private servers, so that only they and their friends can use them to receive the messages.

+

v4.0 of SMP server and the new version of the apps adds support for server passwords. It is chosen randomly when you initialize the new server, and if you already have a server you can change it. Anybody can still message you, it doesn't require knowing the password, and the links you share do not include it, but to be able to receive the messages you need to know a server address that includes the password. In a way, it is similar to how basic authentication works in HTTP, and how browsers support the URIs with included credentials.

+

The new server configuration section now allows to test your servers before you start using them, and you can also share your server address via QR code, so that your friends or your team can use them too, without the need to copy paste the addresses.

+

You can read how to install and configure SMP servers in this guide.

+

Privacy and security improvements

+

Protect app screen

+ +

It is now enabled by default, but you can disable it via settings.

+

iOS app only hides the app screen in the recent apps, Android app in addition to that also prevents the screenshots.

+

This is not the security measure for the senders, and we made it optional, as the recipient could circumvent it anyway – this is for you to protect your app screen when you give your phone to somebody.

+ +

Previously, when you sent somebody an invitation link, a contact address or a group link, they would take half a screen in the chat and they could open in the browser in some cases. Also, as these links are quire large, it is not easy to see if the page domain is maliciously replaced, what SMP server the connection would go through or what kind of link it is.

+

This version instead of showing the full link shows a short description, and it replaces a public web address with an internal URI scheme that the app uses (simplex:/) – such links open directly in the app. There is an option to show the full link, if you need it, and even to open it in the browser from the app, but in this case if this link is not using https://simplex.chat website it will show as red to highlight it.

+

Optional Android app data backup

+

The previous version always backed up app data in the way it was configured by the system. Now you can override it from inside the app, preventing the backup even if it's enabled by the system settings. This version requires disabling it manually, we will make it disabled by default in the next release (v4.3.1).

+

Direct messages between group members

+

The new version does not allow them by default, but it can be enabled by group owners in the group settings when the group is created or at any later moment.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see the information on our new website - it also answers all these questions.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

It is possible to donate via:

+
    +
  • GitHub - it is commission-free for us.
  • +
  • OpenCollective - it charges a commission, and also accepts donations in many crypto-currencies.
  • +
  • Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
  • +
  • Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
  • +
  • Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2
  • +
  • please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230103-simplex-chat-v4.4-disappearing-messages.html b/blog/20230103-simplex-chat-v4.4-disappearing-messages.html new file mode 100644 index 0000000000..a336dbc858 --- /dev/null +++ b/blog/20230103-simplex-chat-v4.4-disappearing-messages.html @@ -0,0 +1,591 @@ + + + + + + + + SimpleX blog: SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language!

+

Published: Jan 3, 2023

+

What's new in v4.4

+ +

Also, we added French language interface, thanks to the users' community and Weblate!

+

Disappearing messages

+

  

+

It is now possible to send the messages that will be deleted from both sender and recipient device after set time – for the sender from the time they were sent, and for the recipient - from the time they were read.

+

Unlike in most other messengers, it requires agreement of both sides, not just the sender decision. I wrote previously why we believe it is wrong to allow the senders to delete their messages without recipient consent, and the same logic applies here – if you want to send the message that will disappear after some time, your contact should be ok with that too.

+

In group conversations disappearing messages can be enabled by the group owners, by default they are disabled.

+

"Live" messages

+ +

Pressing "bolt" button before you start typing the message will start a "live" message. Now, as you type it, it will be updated for all recipients every several seconds, including only complete words. To finish the message you need to press "checkmark" button.

+

You can also start a live message after you started typing or after you chose the image – long-press send button and then press "Send live message".

+

Connection security verification

+ +

SimpleX Chat design prevents the possibility of messaging servers substituting the key during the initial connection (man-in-the-middle attack) by requiring that the invitation link is passed via another channel. I wrote more about how MITM attack works in this post. But this other channel, however unlikely, could still have been compromised by an attacker to replace the invitation link you sent. That is the reason why we recommend sharing QR code in a video call – this is very complex for an attacker to replace it in this case.

+

This new feature allows you to verify, via yet another channel, that the connection is secure and the keys were not replaced. You can either scan the security code from your contact's app, or compare codes visually, or even read it in a voice call – if your and your contact's app have the same security code for each other then the connection is secure.

+

If you are sending direct messages to some group members then it might also be important to verify security of these connections, as in this case the invitations were exchanged via the member who added you or another member, and if this member's client was modified, they could have replaced the keys and the addresses, and intercept the entire conversation.

+

Regardless how connection is established, verifying the connection proves its security. Technically, this security code is the hash of associated data used in the end-to-end encryption, which in turn is taken by combining public keys from the initial key exchange.

+

Animated images and stickers

+

  

+

Android app supported GIFs and stickers for some time, now you can view and send them from iOS app as well, e.g. using GIPHY keyboard - you no longer need to choose between privacy and stickers. Just bear in mind, that third party keyboards can be insecure, so you should not be using them for typing sensitive information.

+

French language interface

+

Thanks to our users' community and to Weblate kindly providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds French.

+

Please get in touch if you want to translate the interface into your language!

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

It is possible to donate via:

+
    +
  • GitHub - it is commission-free for us.
  • +
  • OpenCollective - it charges a commission, and also accepts donations in crypto-currencies.
  • +
  • Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt - Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
  • +
  • BCH address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
  • +
  • Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2
  • +
  • please let us know, via GitHub issue or chat, if you want to create a donation in some other cryptocurrency - we will add the address to the list.
  • +
+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html b/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html new file mode 100644 index 0000000000..6ad17af1dd --- /dev/null +++ b/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html @@ -0,0 +1,606 @@ + + + + + + + + SimpleX blog: SimpleX Chat v4.5 released – with multiple chat profiles, message draft, transport isolation and Italian language! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v4.5 released – with multiple user profiles, message draft, transport isolation and Italian interface!

+

Published: Feb 4, 2023

+

What's new in v4.5

+ +

Also, we added Italian interface, thanks to the users' community and Weblate!

+

Multiple chat profiles

+

  

+

Incognito mode added in v3.2 allows to share a random profile name with your new contacts. It is quite popular - more than half of users connecting to our support profile use it. In case when you just want a throw-away profile name that doesn't share any information about you it is more convenient that creating a new profile for each contact manually.

+

But there are many cases when a disposable profile is not good enough enough, and you want to create separate profiles - one for your family, another for work, yet one more for your online contacts that only know your pseudonym rather than your real name.

+

Previously this was only possible by using separate chat databases. This version adds a chat profile manager that allows you to create unlimited number of profiles, and very quickly switch them. All these profiles are connected at the same time.

+

When you delete profile you no longer need you have two options - either delete both profile data on the device and any message queues that this profile created on SMP servers (e.g., when it is more important to leave as few meta-data on the servers), or delete only profile data without making any network requests (when it is more important to delete all data from the device quickly).

+

While most app settings apply to all profiles, several settings are profile-specific.

+

You can separately set which SMP servers are used to create the new contacts in each profile (via Network settings). Please note: changing SMP servers in one profile won't affect other profiles, and all new profiles are created with preset servers.

+

You can also separately set the retention time for messages in each profile (via Database settings).

+

Also, you have a different contact address in each profile, and different Chat preferences.

+

All other settings are used for all profiles. While you may want to have different settings for different security levels, it is much better to use different devices in this case.

+

Message draft

+

  

+

Previously, if you've closed the conversation with unsent message, this message was disappearing. While it might be better for privacy, there are several scenarios when it is very inconvenient:

+
    +
  • you need to compose the message from several parts that you copy from other conversations.
  • +
  • some messages arrives that you need to answer urgently, so you can leave unfinished message to return to it later.
  • +
+

Both are now possible - the message you wrote, together with any attachments, and even a voice message you recorded, will remain available as draft until you either close the app or leave another message unfinished - while you can send the message in another chat without losing the current draft, there can be only one draft at a time.

+

Transport isolation

+ +

Even when you create different chat profiles you are still connecting to your contacts via the same device. Transport isolation, by default, makes connections belonging to the same profile use different TCP sessions, so while the server sees the same IP address, it doesn't see it as the same client connection. If you are connecting via Tor using SOCKS proxy (e.g. Orbot app on Android) not only the app will use different TCP sessions, it will also use separate Tor circuits for connections from different profiles, preventing the servers and network observers seeing this as traffic coming from the same device.

+

There is an additional BETA option to use a separate transport connection for each contact and group member connection you have – it is available in Network settings if you enable dev tools. In case you have a large number of contacts or participate in large groups across all profiles in the app, you should not use this option, as it may create a lot of traffic and also can exceed the quota for TCP sockets. Also creating a lot of separate Tor circuits can be slow. We will be testing at which number of connections this option starts failing and by the time it's available without dev tools we will add some limits.

+

Reduced battery usage

+

Battery usage is one of the biggest complaints of SimpleX Chat users. The main reason for excess traffic is inefficient retry strategies for Network operations in these cases:

+
    +
  • the message queue capacity is exceeded - the app will keep retrying to send the message until there will be capacity.
  • +
  • the server is not available, e.g. if you connect to somebody via their server, and they later disable it. This case creates much less extra traffic than the first.
  • +
+

This version makes retries for exceeded queue capacity 10x less frequent and adds SMP protocol extension that will allow to reduce retries even further by the next version. It works in the following way:

+
    +
  • when the sender encounters "queue quota exceeded" error, the sender stops trying to send the message.
  • +
  • the server also takes note of that error.
  • +
  • once recipient receives all messages from this queue, the server will notify the recipient that the sender had "queue quota exceeded" error.
  • +
  • the recipient will then send a special message to the sender client to instruct it that it can resume delivery.
  • +
  • the sender can still occasionally try sending the message, e.g. once every hours, but it won't need to retry once every few minutes as it does now.
  • +
+

Reducing battery usage is our big priority - we expect to reduce it by at least 2-3x in the next few months.

+

Private filenames

+

When you send an image or voice message they are sent as files with filenames including timestamp. We didn't see it as a problem, as files are sent together with the message, and messages have server-side timestamps anyway. But the users pointed out that the timestamp we used was in the local timezone, and therefore leaked the country (or continent) where the user is located. A simple workaround was to reset timezone to UTC, and that is what most users who need to protect their location do anyway. But this version resolves it - these filenames now include UTC timezones – no workarounds are needed.

+

Italian interface

+

Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Italian and many more is in progress - Chinese, Japanese, Czech, Dutch, etc.

+

You can contribute the translation of the apps to your language too!

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230301-simplex-file-transfer-protocol.html b/blog/20230301-simplex-file-transfer-protocol.html new file mode 100644 index 0000000000..d0658705c3 --- /dev/null +++ b/blog/20230301-simplex-file-transfer-protocol.html @@ -0,0 +1,637 @@ + + + + + + + + SimpleX blog: SimpleX File Transfer Protocol - a new protocol for sending large files efficiently, privately and securely. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX File Transfer Protocol – a new protocol for sending large files efficiently, privately and securely.

+

Published: Mar 1, 2023

+ +

⚡️ Quick start: send a file with XFTP CLI in 3 simple steps

+

Download XFTP binary for Linux from the release – you need the file xftp-ubuntu-20_04-x86-64 - rename it as xftp.

+

Step 1: To send the file:

+
xftp send filename.ext
+
+

You can also send the file that can be received by multiple recipients using -n option:

+
xftp send filename.ext -n 10
+
+

Step 2: Pass file description(s) (files rcvN.xftp) to the recipient(s) securely, e.g. send it as a file via SimpleX Chat.

+

Step 3: To receive the file:

+
xftp recv rcvN.xftp
+
+

The sender also delete all file chunks from the relays before they expire in 48 hours with this command:

+
xftp del ./filename.ext/snd.xftp.private
+
+
+

What's the problem?

+

If you are using SimpleX Chat apps you know that support of sending files and images is not very good, and sending videos and large files is simply impossible. There are currently these problems:

+
    +
  • the sender has to be online for file transfer to complete, once it was confirmed by the recipient.
  • +
  • when the file is sent to the group, the sender will have to transfer it separately to each member, creating a lot of traffic.
  • +
  • the file transfer is slow, as it is sent in small chunks - approximately 16kb per message.
  • +
+

As a result, we limited the supported size of files in the app to 8mb. Even for supported files, it is quite inefficient for sending any files to large groups.

+

Why didn't we just use some existing solution?

+

We really hoped to find some existing open-source solution that we could integrate with SimpleX Chat.

+

We decided not to use torrent-like or any other P2P solutions because of their lack of privacy, challenging legality in some jurisdictions and, in many cases, because they are inefficient in groups.

+

We reviewed several S3-compatible solutions (e.g., minio, garage, SeaweedFS), but they all require the development of a separate service layer, making them unusable as standalone services and harder to deploy for the users who want to self-host the file transfer service. As a side note, the solution that we developed can still be composed with S3-compatible storage for higher capacity servers with some privacy/efficiency trade-offs.

+

We also looked at a few independent implementations of file sharing, with some ad-hoc protocols (e.g., ceph and lufi), but neither seemed sufficiently mature, and also not as private as we would like.

+

So after a lot of searching we decided to design and implement a new protocol for file transfers, that both solved the problems above, and provided a higher level of metadata privacy than any other file transfer solution has.

+

What is XFTP and how does it work?

+
           Sender                      Internet                XFTP relays             Internet         Recipient
+----------------------------   |   -----------------   |   -------------------   |   ------------   |   ---------- 
+                               |                       |                         |                  |
+                               |                       |   (can be self-hosted)  |                  |
+                               |                       |        +---------+      |                  |
+                  chunk 1     ----- HTTP2 over TLS ------       |  XFTP   |     ---- HTTP2 / TLS -----   chunk 1
+                |---> SimpleX File Transfer Protocol (XFTP) --> |  Relay  | --->        XFTP         ------------->|
+                |             ---------------------------       +---------+     ----------------------             |
+                |              |                       |                         |                  |              | 
+                |              |                       |                         |                  |              v
+          +----------+         |                       |        +---------+      |                  |        +-------------+
+          | Sending  | ch. 2  ------- HTTP2 / TLS -------       |  XFTP   |     ---- HTTP2 / TLS ----  ch. 2 |  Receiving  |
+file ---> |   XFTP   | ------>           XFTP            ---->  |  Relay  | --->        XFTP         ------> |     XFTP    | ---> file
+          |  Client  |        ---------------------------       +---------+     ----------------------       |    Client   |
+          +----------+         |                       |                         |                  |        +-------------+
+                |              |                       |                         |                  |              ^
+                |              |                       |        +---------+      |                  |              |
+                |             ------- HTTP2 / TLS -------       |  XFTP   |     ---- HTTP2 / TLS ----              |
+                |------------->           XFTP           ---->  |  Relay  | --->        XFTP         ------------->|
+                   chunk N    ---------------------------       +---------+     ---------------------    chunk N
+                               |                       |   (store file chunks)   |                  |
+                               |                       |                         |                  |
+                               |                       |                         |                  |
+
+

XFTP stands for SimpleX File Transfer Protocol. Its design is based on the same ideas and has some of the qualities of SimpleX Messaging Protocol, that is used in SimpleX Chat:

+
    +
  • recipient cannot see sender's IP address, as the file fragments (chunks) are temporarily stored on multiple XFTP relays.
  • +
  • file can be sent asynchronously, without requiring the sender to be online for file to be received.
  • +
  • there is no network of peers that can observe this transfer - sender chooses which XFTP relays to use, and can self-host their own.
  • +
  • XFTP relays do not have any file metadata - they only see individual chunks, with access to each chunk authorized with anonymous credentials (using Edwards curve cryptographic signature) that are random per chunk.
  • +
  • chunks have one of the sizes allowed by the servers - currently we allow 256kb, 1mb and 4mb chunks, so if you send, say 1gb file, to XFTP relays it will look indistinguishable from sending many small files, and they would only know that chunks are sent by the same user only via the transport information, but none of the relays will see all chunks. Also, once this feature is available in mobile apps you can use transport isolation per chunk, when each file fragment will be uploaded via a separate TCP connection (and Tor circuit, if you use Tor) – the CLI we released does not yet support per-chunk transport isolation.
  • +
  • each chunk can be downloaded by multiple recipients, but each recipient uses their own key and chunk ID to authorize access, and the chunk is encrypted by a different key agreed via ephemeral DH keys (NaCl crypto_box (SalsaX20Poly1305 authenticated encryption scheme ) with shared secret derived from Curve25519 key exchange) on the way from the server to each recipient. XFTP protocol as a result has the same quality as SMP protocol - there are no identifiers and ciphertext in common between sent and received traffic inside TLS connection, so even if TLS is compromised, it complicates traffic correlation attacks.
  • +
  • XFTP protocol also supports redundancy - each file chunk can be sent via multiple relays, and the recipient can choose the one that is available. The released CLI does not support redundancy though.
  • +
  • the file as a whole is encrypted with a random symmetric key using NaCl secret_box.
  • +
+

So, how would any recipient know where to get all these file fragments from and how to put them back together into the original file? Normally, when you send a file via any file-sharing service it provides you a link that you can pass to the recipient. The link allows to download the original file, but it also provides the server a lot of file meta-data, that often includes file name and exact size, and in many cases the server also has access to a file content.

+

Instead of using a link, XFTP protocol includes a special format for a "file description" - it is a small text file containing the locations, access keys and digests for all file chunks, and also the encryption key and digest (SHA512) for the whole file. This file description does not contain the original file name or exact file size, so if it is used after the file fragments are expired or removed from XFTP relays, this information is not accessible.

+

CLI generates a separate file description for each intended recipient - you need to specify how many people you want to be able to receive this file. You can specify a larger number of recipients to avoid revealing the real number of recipients from XFTP relays. Mobile apps, when this protocol is integrated, will do it automatically, choosing some large random number of possible recipients, so while the relays will be able to observe how many people time the file was downloaded, they won't know how many intended recipients you had - sending to a group of 10 people and to 1 recipient can look the same to the relays.

+

File description is a security-sensitive file that contains private keys and chunk addresses necessary to receive the whole file, and also a symmetric key to decrypt the file. Therefore you must use a secure channel to send file description - e.g., it can be sent via SimpleX Chat. But once the recipient downloaded the file, CLI invalidates the file fragment addresses on relays and the same file description cannot be used again to download the file.

+

What is next?

+

We released and deployed several XFTP relays for you to experiment with (they are hardcoded in the XFTP CLI), and you can deploy your own relays either from downloadable binary or by compiling the source code. We also released XFTP CLI - it is available in the same release.

+

We are currently integrating support for sending large files using XFTP protocol into SimpleX Chat clients. SimpleX Chat v5.0 will have support for receiving files sent via XFTP protocol (you will be able to send a file description via a SimpleX Chat CLI app, so that mobile apps will be able to receive them as normal files, only much faster), and v5.1 will fully support for sending large files (up to 1gb) in the mobile apps.

+

We will also publish a formal specification for XFTP protocol and overview of its security qualities and threat model. For now you can learn more about the protocol design and motivations from this internal XFTP protocol RFC.

+

Using and sending files with the available XFTP CLI will hugely help us stabilizing both the protocol and implementations. What we really like about this design is that it is completely independent from SimpleX Chat - you can use it on its own, sending files and passing file descriptions to your contacts via any other messenger - e.g. via Signal, – without this messenger being able to observe that you are in fact sending a large file.

+

We did not yet decide whether we will be making a separate security audit of XFTP implementation, or if we combine it with the next security audit of SimpleX Chat. The latter seems more likely, as XFTP uses the same cryptographic primitives that were reviewed during SimpleX Chat security assessment by Trail of Bits in November 2022.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230328-simplex-chat-v4-6-hidden-profiles.html b/blog/20230328-simplex-chat-v4-6-hidden-profiles.html new file mode 100644 index 0000000000..5730da7c3f --- /dev/null +++ b/blog/20230328-simplex-chat-v4-6-hidden-profiles.html @@ -0,0 +1,601 @@ + + + + + + + + SimpleX blog: SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage.

+

Published: Mar 28, 2023

+

What's new in v4.6

+ +

Also, we added Chinese and Spanish interface languages, thanks to the users' community and Weblate!

+

ARMv7a (32 bit) and Android 8+ support!

+

It increases the number of supported Android devices twice - now most of your friends should be able to install SimpleX Chat. SimpleX Chat still doesn't support Android 7 and erlier versions.

+

If you install the app from GitHub or F-Droid you need to choose the correct APK, Play Store will provide it automatically.

+

Hidden chat profiles

+

     

+

For a long time the main way to protect SimpleX Chat app from people who have access to your phone was device authentication - it is requested when you open the app (and some of its sensitive functions).

+

Many users asked to allow setting the app password or PIN independently from the device PIN, as some other apps do. But it did not seem a good enough solution - if somebody has your device PIN, then in most cases they can also ask you to provide the app PIN as well.

+

So instead of having an app password, that reduces convenience and doesn't improve security too much, we did what we think could be better. You can now create hidden chat profiles, that are not visible anywhere in the app, and do not show any notifications, until you enter a correct passphrase. If multiple profiles are hidden with the same passphrase they will all show in the list when you enter it.

+

It's important to remember that these hidden profiles are still stored locally on your device, so if somebody has access to your chat database (they need to know database passphrase, that is independent from device PIN or profile passphrases) or to chat console in the app, they will be able to access these profiles data and reset their passwords. We are considering how chat console can be better protected - e.g., by requiring a separate password or by providing an option to remove it from the UI permanently - tell us what you think.

+

Group / Community moderation

+

Initially we did not design SimpleX Chat to support communities - our focus has always been maximum privacy and security.

+

SimpleX Chat supports small and fully decentralized groups, that are not hosted anywhere. But many users want to participate in and to discover communities. Since we added support for group links, the groups we created to let users test the app started to grow, and many other communities of over 100 people emerged.

+

We are already observing some less-than-friendly messages and undesirable content that is not welcome in some communities. So this version adds features allowing to moderate groups.

+

Firstly, group admins and owners can revoke members rights to send messages to the group by assigning members an "observer" role, and also make this role default for users joining via a group link.

+

Secondly, group admins can now delete messages sent by other members (excluding the messages sent by the group owners). "Moderate" action in the message menu will either mark the message as deleted or delete it irreversibly for all members, as set in group preferences by the owners.

+

These features will allow group owners to decide their own rules. More robust moderation tools are coming later when we build support for large communities.

+

Group welcome message

+

Group owners can now set a welcome message that will be shown to new members when they join the group via a group link.

+

Improved audio/video calls

+ +

Prior to this version audio and video calls in iOS app were very limited – they only worked while the app was in foreground. This version fully re-implemented audio/video calls in iOS – it now uses native WebRTC library instead of web view. These calls are still end-to-end encrypted, and compatible with the calls in the previous versions of the app, both on iOS and on Android platforms.

+

Where allowed by App Store policy, the calls on iOS now use Apple's native interface for calls CallKit, that allows to accept calls from the lock screen, prevents call interruption by incoming phone calls and optionally allows to include calls in the phone call history - the last option needs to be enabled separately.

+

Calls on Android were also improved – they now support bluetooth headphones, allow changing volume in video calls and support proximity sensor during the audio call, to prevent accidental interruption when you hold the phone close to your ear.

+

Reduced battery usage

+

We know that battery usage of SimpleX Chat is suboptimal, and we are committed to reduce it. Unfortunately, there is no simple change that we could make to solve this problem, it requires many systematic improvements and fixes.

+

One of the big issues, particularly in large groups, was inefficient retry strategy for sending messages in cases when the receiving message queue (mailbox) was out of capacity.

+

This version increases the maximum retry period for "out-of-capacity" scenario to 1 hour, and also preserves this retry period in the database. So, if previously before the message expired in 48 hours there were up to ~2800 delivery attempts and up to ~45Mb wasted traffic per recipient (depending on how frequently the app was restarted), now there will be only ~50 retries, resulting in not more than 0.8Mb of traffic - up to 56x traffic reduction when sending messages to the large groups.

+

This issue might not have affected you at all, and also solving it won't reduce overall traffic/battery usage by that factor - there are other inefficiences we will be addressing. But if you actively sent messages to large groups you should observe a substantial reduction of battery and traffic consumption.

+

Please share your experience. If the battery usage is still suboptimal, please share your usage statistics - they can be requested in chat console with /get stats command - it will return the aggregated number of network operations, per server, since the app was started. Please note that these statistics include the addresses of the servers you connect to, so if you want to keep them private, please redact them. You can also reset usage statistics with /reset stats command.

+

SMP server monitoring

+

If you use preset servers in SimpleX Chat you can now see when we do any maintenance or when the server is down either by connecting to status bot via the app or by visiting a status page. Status bot always sends automatic messages before the server is restarted for maintenance, but in case of downtime if the same server is down that you use to receive the messages from the bot, you may miss them - check the status page in this case.

+

Chinese and Spanish interface - you can choose the language via the app!

+

Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Chinese and Spanish and more are in progress.

+

You can contribute the translation of the apps to your language too!

+

The app now supports 8 languages in addition to English - Czech, German, Spanish, French, Italian, Dutch, Russian and Chinese. You can now choose the language via the app settings (Appearance page), independently from the system settings.

+

SimpleX platform

+

Some links to answer the most common questions:

+

SimpleX Chat security assessment.

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Visit our website to learn more.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html b/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html new file mode 100644 index 0000000000..35e6ca9bba --- /dev/null +++ b/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html @@ -0,0 +1,613 @@ + + + + + + + + SimpleX blog: SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb.

+

Published: Apr 22, 2023

+

SimpleX Chat vision and funding:

+ +

What's new in v5.0:

+ +

Also, we added Polish interface language, thanks to the users' community and Weblate.

+

SimpleX Chat apps are now available in 10 languages!

+

SimpleX Chat vision and funding

+

Why is it a commercial company?

+

It was a big decision: whether SimpleX Chat should be a non-profit project or an open-source project led by a commercial company.

+

During the last 25 years of the Internet, commercial companies have shown a much higher ability to innovate than non-profit organizations. One of the most inspiring examples is NetScape that created the Web as we know it - not only as the destination to access information, but also as an application platform, inventing cookies, SSL and JavaScript, that to this day remain the main building blocks for all web applications.

+

While SimpleX Chat Ltd is a commercial company, SimpleX Chat software is and will remain open-source. We believe that this way we will create much more value both for the end users, and also for the shareholders and the employees of the company.

+

Many large tech companies prioritizing value extraction over value creation earned a bad reputation for all businesses, particularly in the communities that value decentralization and privacy. But commercial objectives do not have to result in exploitation. Our goal is to build a new kind of communication network, and also an application platform, that is private by design, fully decentralized and not owned by any single entity, where SimpleX Chat Ltd is one of many organizations that operate the network. I shared my thoughts about how the Internet and privacy might evolve in the interview in Opt Out Podcast.

+

How is it funded and what is the business model?

+

We started working full-time on the project in 2021 when Portman Wills and Peter Briffett (the founders of Wagestream where I led the engineering team) supported the company very early on, and several other angel investors joined later. In July 2022 SimpleX Chat raised a pre-seed funding from the VC fund Village Global - its co-founder Ben Casnocha was very excited about our vision of privacy-first fully decentralized messaging and community platform, both for the individual users and for the companies, independent of any crypto-currencies, that might grow to replace large centralized platforms, such as WhatsApp, Telegram and Signal.

+
+

Edit: please see the comment from Ben Casnocha about this investment in our post from August 14, 2024.

+
+

Overall we raised from our investors approximately $370,000 for a small share of the company to allow the project team working full time for almost two years, funding product design and development, infrastructure, and also the security assessment by Trail of Bits. A large part of this money is not spent yet.

+

The project was hugely supported by the users as well - collectively, you donated over $25,000. Without these donations the investment we raised would not be possible, because we believe that voluntary user donations can sustain the project in the long term – it already covers all infrastructure costs. There are only two ways an Internet service can exist - either users are paying for it, or the users data becomes the product for the real customers, as happened with many large Internet companies. In the latter case the users are losing much more money than they are saving by giving away their privacy and the rights to the content they create on the centralized platforms.

+

Going forward we plan to keep the basic usage of the platform free, and at the same time we will be providing the benefits to the project sponsors. For example, there will be additional app icons and user profile badges. There also will be higher file transfer limits – currently we don't limit it at all, only limiting the file size, but it's unlikely to be sustainable. In any case, the app will remain highly usable for everyone for free, and fully open-source. Several other apps are already being developed based on our app core, leading to a fully decentralized network.

+

What is next?

+

Our goals for the next 1-2 years are to make the messaging network:

+
    +
  • more reliable and resilient, by adding redundancy into the message delivery and delivery receipts,
  • +
  • more private, by automating rotation of the servers used to deliver messages and by adding delivery relays to better protect IP addresses of the users,
  • +
  • more usable by adding and improving the functions users are expecting in messengers, and also adding some unique functions, like we did with incognito mode, live messages and hidden profiles.
  • +
+

One major initiative we will kick-off this year is the support for large, fully decentralized and private communities and groups not hosted on any servers – something that no Internet platform achieved so far in as private and efficient way as we plan to build it.

+

To accelerate product development and growth we will be raising a seed funding this year, both from the VCs and angel investors, and we also might offer our users an opportunity to participate in the crowd funding round on the same terms as other investors, allowing to both support the project and to benefit from its future growth. Subscribe to our updates not to miss it, connect to the team in SimpleX Chat and join users' groups.

+

What's new in v5.0

+

Send videos and files up to 1gb!

+ +

In the beginning of March we released servers and command-line utility to send and receive files via XFTP protocol - a very private and secure protocol that sends end-to-end encrypted files in chunks, protecting meta-data better than any alternatives we know of.

+

Now this protocol is fully integrated in SimpleX Chat, and all files except small voice messages are sent using this protocol (small voice messages are sent as usual messages). Not only it is much faster than before - with the fast Internet connection I can send 25Mb file in 3 seconds and 1gb file in 2 minutes (for most users it's capped at the available Internet bandwidth), it has two other major advantages making it more usable:

+
    +
  • the file sent to a group has to be uploaded only once, regardless of the group size.
  • +
  • once the file is uploaded (it will have the tick), you no longer need to be online for your contact (or group members) to be able to receive it.
  • +
+

As for the metadata privacy, it has similar guarantee to SimpleX Messaging Protocol. The files are sent via TLS 1.2/1.3, with the same server identity verification, TLS channel binding and upload authorization as used with SMP servers. But the file metadata is protected even if TLS is compromised, as there are no identifiers and ciphertext in common in server received and sent traffic, allowing to correlate only by sending and receiving time. Correlating by time becomes less efficient as the server traffic grows.

+

We also added the ability to send videos in the chat, so they can be played right in the conversation or on full screen without leaving the app – thanks to the efficient and fast file transfer they are very usable.

+

We also plan to add support for longer and higher quality voice messages, and also for sending full resolution images in the next versions.

+

App passcode

+

  

+

While we do think that app passcode does not increase security too much, compared with device passcode or biometric protection, there are cases when it may be preferable, and also many users really wanted that it is added.

+

Now you can choose whether to use faster and more convenient system biometric authentication or to use a separate app passcode. You can choose which one to use when it is first offered, or switch later in the settings.

+

Networking improvements

+ +

Two small improvements to the app networking capabilities were added in this version.

+

Firstly, you can now make your self-hosted servers available on IPv6 addresses, and the app supports them as well. Please bear in mind that older clients won't be able to connect to you if you use IPv6 address, and also that some ISPs do not provide IPv6 addresses to their users, in which case they would also not be able to connect if IPv6 address is used. To allow connections in these cases you should make your servers available on some domain name that resolves to both IPv4 and IPv6 addresses, and use this domain name in the server address.

+

Secondly, Android client now supports configuring host and port of the SOCKS proxy, allowing to use apps other than Orbot and also to run SOCKS proxy in the local network, to save mobile device battery.

+

SimpleX platform

+

Some links to answer the most common questions:

+

SimpleX Chat security assessment.

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Visit our website to learn more.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html b/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html new file mode 100644 index 0000000000..02bdf608da --- /dev/null +++ b/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html @@ -0,0 +1,612 @@ + + + + + + + + SimpleX blog: SimpleX Chat v5.1 released: message reactions and self-destruct passcode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v5.1 released: message reactions and self-destruct passcode

+

Published: May 23, 2023

+

What's new in v5.1:

+ +

There are lots of small improvements and fixes in this release:

+
    +
  • setting to disable audio/video calls per contact.
  • +
  • group welcome message visible in a group profile - add the link to join the group there.
  • +
  • fixes for sending files.
  • +
  • configurable SOCKS proxy host and port*.
  • +
  • improved calls on lock screen*.
  • +
  • locale-dependent formatting of time and date*.
  • +
+

Also, we added Japanese and Portuguese (Brazil)* interface languages, thanks to our users and Weblate.

+

* These features are available in the Android version only.

+

Message reactions

+ +

No idea why it took us so long to add them – finally we have them, and they are great.

+

We didn't like the view of other messengers plagued by 40 different reactions on a message, and we were not quite sure what can be done about it, so we initially decided to limit available reactions to just 6: thumbs up 👍, down 👎, smile 😀, tear 😢, heart ❤️ and rocket 🚀. But unlike some other messengers, we don't limit the reactions to just one per message - you can put up to 3.

+

You can add them via the menu, or just by tapping the reaction already on the message.

+

The next app version will allow prohibiting the reactions per conversation, as you asked. Some groups work better with more substantive responses.

+

Improved messages

+

Voice messages: up to 5 minutes, better quality, playback control

+ +

Since v4.3 voice messages were sent in small 16kb chunks, so we had to limit them to 30-40 seconds for better user experience, as sending larger files would require the sender to be online.

+

With the new XFTP protocol that allows sending files up to 1gb it is now possible to increase the message size - we decided to limit it at 5 min, increasing their quality 2x (the bitrate is increased from 16 to 32kbps). We also added a slider to control the playback.

+

Disappearing messages: choose any time!

+

  

+

Since v4.4 disappearing messages were only configurable for the whole conversation, with a limited choice of allowed times between 30 seconds and 1 month.

+

This version allows to configure the time for messages to disappear more granularly, in the range from 1 second to 3 months. You can also set a different time to disappear when you send the message (hold the Send button), as long as disappearing messages are enabled in the conversation.

+

Message editing history

+ +

I wrote previously why we decided to require the recipient concent before the messages can be fully deleted by the sender - in short, it is to support recipient's data sovereignty and prevent the possibility of offensive messages being removed without any trace. By default, when the sender deletes the message it is marked as deleted, rather than fully deleted, and you can reveal the original message.

+

You've found the workaround for it of course - it's enough to simply edit the message to hide the original content. This version adds a visible message editing history, together with other detailed information about when the message was sent, received or deleted, that wasn't visible in the conversation.

+

Customize and share color themes

+ +

Android app now allows choosing between three color themes - Light, Dark and SimpleX (a dark blue theme). You can customize any theme by setting 9 different colors used in the app, including titles, menus, accent colors and colors for sent and received messages.

+

You can share your theme with other users by exporting it to a file and sending to them. You can also contribute your favorite themes to our GitHub repository.

+

Self-destruct passcode

+ +

This is something many of you asked before - when asked to enter the app passcode under duress, to be able to enter a special self-destruct code that would remove the app data. This feature is offered in many security tools, and now you can configure it in SimpleX Chat as well.

+

To enable it:

+
    +
  • go to app Settings > Privacy & security > SimpleX Lock.
  • +
  • switch lock mode to Passcode and, if necessary, enable lock – Self-destruct passcode will become available.
  • +
  • enable it, enter the main passcode and then enter and confirm self-destruct passcode.
  • +
  • optionally, you can set the new display name of the profile that will be created after the data was wiped. If it is left blank, a new empty profile will have a random name.
  • +
+

SimpleX platform

+

Some links to answer the most common questions:

+

SimpleX Chat security assessment.

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Visit our website to learn more.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html b/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html new file mode 100644 index 0000000000..b3cecfec51 --- /dev/null +++ b/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html @@ -0,0 +1,650 @@ + + + + + + + + SimpleX blog: SimpleX Chat v5.2 released: message delivery receipts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v5.2 released: message delivery receipts

+

Published: July 22, 2023

+

What's new in v5.2:

+ +

Platform evolution:

+ +

What's new in v5.2

+

Message delivery receipts

+ +

Most messaging apps add two ticks to sent messages – the first one to show that the message is accepted by the server, and the second – that it is delivered to the recipient's device. It confirms that the network is functioning, and that the message is not lost or delayed. SimpleX Chat now has this feature too!

+

In some cases it may compromise recipients' privacy, as they show that the recipient is online, so we made sending delivery receipts optional – it can be disabled separately for each chat profile or contact. For the new chat profiles this feature is enabled by default.

+

To avoid compromising your privacy, sending delivery receipts is disabled for all your existing chat profiles. The first time you start the app after the update, you will be offered to enable them for all visible profiles, and they can be enabled later via Privacy and Security settings.

+

Filter favorite and unread chats

+ +

You can now mark your contacts and groups as favorite, to be able to find them faster. With filter enabled, you will only see favorite chats, chats that contain unread messages and also any unaccepted group invitations and contact requests.

+

More usable groups

+

Active SimpleX Chat users know how broken the current group experience is, and that we plan some major overhaul of the groups protocol – more on that below. In the meanwhile, we added some simple features that make groups in their current state a bit more usable.

+

What is this in reply to?

+ +

A major problem is that you can see replies to the messages you've not seen before - this would happen both when you just join the group, and didn't connect to most other members, and also when other new members join the group and they didn't yet connect to you – so literally all the time, and the bigger the group gets, the worse it becomes. While this problem cannot be solved without major group protocol changes, at least there is now ability to see the original message that was replied to via the message information.

+

How to connect to this member?

+ +

To simplify direct connections with other group members, you can now share your SimpleX address via your chat profile, and group members can send you a contact request even if the group does not allow direct messages.

+

How to find a member in the list?

+

Large member lists (and also the long lists of contacts, if you have many of them) become hard to scroll through, so now there is a search in both lists.

+

Stability improvements

+

This version fixes many long-standing problems with the message delivery, failed connections with group members (that also contributed to group fragmentation), and reduces traffic in groups (beta users experienced a traffic spike because of this fix, but it doesn't affect the final v5.2 release). It's not the end of the road to making SimpleX Chat as stable as mainstream messengers, but it is a big improvement.

+

Please report the cases when messages are not delivered – delivery receipts should help with that.

+

Messages failed to decrypt? Problem solved!

+

Previously, a growing number of users had the issue when after restoring the chat database from backup, messages from some contacts failed to decrypt and were showing an error in the app.

+

This happens due to double ratchet protocol protecting the integrity of end-to-end encryption after the compromise - post-compromise security. The protocol logic does not allow to use the old version of the database to decrypt the message.

+

v5.2 added the extension to the messaging protocol allowing to negotiate the new ratchet keys in such cases - both with the contacts and the group members. This requires a user action, and it resets the security code verification status for this contact or member – you need to verify it again to have the additional protection from man-in-the-middle attacks.

+

The negotiation of the new ratchet keys still happens via the end-to-end encrypted messages, as the protocol has two layers of end-to-end encryption, so it cannot be compromised by the messaging relays.

+

You may still lose connection if you or your contact changed the receiving address after you made the backup, so make sure to make a new backup after any receiving address changes.

+

Reconnect the servers

+

While v5.2 solved many message delivery issues, there may be some others, but they are usually resolved with app restart. It was difficult to fully restart Android app, as there is a continuosly running background service for notifications that doesn't restart with the app. Now Android app has both Restart and Shutdown buttons that take background service into account.

+

On iOS you can now pull down the list of conversations to reconnect to all relays without restarting the app.

+

Better disappearing messages

+

You can now send a separate disappearing message if the chat preferences allow them, but do not have any time to disappear enabled – this applies both to groups and to contacts. You can also set the time to disappear up to 12 months.

+

Prohibit message reactions

+

While most people like message reactions, some conversations make them inappropriate - you can disable them now.

+

Platform evolution

+

Problems of public groups

+

As I wrote above, the major problem is that not all messages are received by all members, or, at least, they may be substantially delayed. Additional problems are various scenarios when the list of members gets out of sync for different members.

+

How to cope with these problems?

+

It really helps to only use one link shared with the members to join the group - the one created by the client that is most frequently online, ideally always online. This is sometimes confusing, as any group admin can create another group link, and share it with the members, and if this admin is not online, the new member won't be able to join.

+

We will add new group features to manage fragmentation - there will be an option to fix the connection with the member that you failed to connect to by passing the link out-of-band. This can be particularly helpful for stable groups of 20-50 people where it's important to see all messages.

+

In the long term, the only way to make groups usable is to move to a new design. We considered several options.

+

Why not hosted groups with MLS?

+

Initially, we considered the design with the dedicated servers, potentially self-hosted, that host groups. This design would require adopting MLS (or similar) protocol for group-wide key agreement. Unfortunately, this design is not sufficiently resilient and easier to censor than decentralized design. Also, MLS protocol is very complex to implement, requires a centralized component, and reduces forward secrecy. So we decided against this approach.

+

Why not fully decentralized groups?

+

We also considered rumour-mongering protocol, where all members are equal and participate in message dissemination. The problem with this approach is that it adds a lot of traffic for all members, even those who mostly read messages. Also, it still requires establishing a fully connected graph, and with large groups it becomes prohibitively expensive and unreliable, given that many members join public groups for a limited time.

+

Members host the groups

+

We are now considering a middle-ground - the design where the owners and admins host the group, synchronising the state between them, receiving and re-broadcasting the messages between all members. This puts a higher burden on these members, but these clients can be hosted in the cloud, and also group owners have a larger incentive to maintain group integrity. At the same time, this design is better for the rest of the group members, as they don't need to establish connections with all other members, only with a limited number of "hosting" members, and it also better protects their privacy, due to the lack of direct connections between most members.

+

This approach avoids the need for a group-wide key agreement protocol, as hosting members are expected to have access to all content anyway, so pair-wise ratchets are sufficient. At the same time the content remains end-to-end encrypted, and protected from the outsiders.

+

This approach also simplifies moderation - the message that needs to be removed simply won't reach the members before it is moderated (in case of automatic or policy-based moderation).

+

Discovery and content search in such groups will be provided via a dedicated discovery server that will participate in the group, provide an always-online client, and also automatic content moderation functionality - a possible approach to moderation is described here.

+

We really look forward to your feedback on this design.

+

What about read receipts?

+

We have an approximately equal number of users who ask us to add receipts, and those who ask not to add them, even as optional.

+

While read receipts provide some convenience to the message senders, they introduce a lot of stress for the recipients.

+

As one of the users in the group wrote it: "The existence of read receipts in other platforms is exhausting and is often a source of undue stress. I have to make a decision to read something and let someone know that I have read something and decided not to respond or merely didn't have the time to respond. The outcome of that is a complex social negotiation with non-theoretical social fallout as a consequence. All in all, it's an invasion of privacy of being able to read things at the pace of the individual as opposed to the pace dictated by others... Most people don't need a read receipt, so leave it to a group of individuals to decide if having read receipts make sense to them for their workflow".

+

Also read this post about the damage from read receipts and other invasive features, like typing and presense notifications.

+

There is also no discounting that the presense of read receipts functionality, even as opt-in, creates a social pressure to enable them, with the same consequences – there are many scenarios when they become non-optional in some relationships. So many users belive, and we share this view, that it is better not to have these features at all. We will be re-assessing this view.

+

SimpleX platform

+

Some links to answer the most common questions:

+

SimpleX Chat security assessment.

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Visit our website to learn more.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html b/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html new file mode 100644 index 0000000000..183e691acf --- /dev/null +++ b/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html @@ -0,0 +1,622 @@ + + + + + + + + SimpleX blog: SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups with directory service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups

+

Published: September 25, 2023

+

What's new in v5.3:

+ +

There are a lot of other improvements and fixes in this release:

+
    +
  • improved app responsiveness and stability.
  • +
  • app memory usage is reduced by 40%.
  • +
  • new privacy settings: show last messages & save draft.
  • +
  • fixes: +
      +
    • bug preventing group members connecting (it will only help the new connections).
    • +
    • playing videos on full screen**.
    • +
    • screen reader for messages**.
    • +
    • reduced background crashes**.
    • +
    +
  • +
+

Also, we added 6 new interface languages: Arabic, Bulgarian, Finnish, Hebrew, Thai and Ukrainian - thanks to our users and Weblate.

+

* Android app.

+

** iOS app.

+

Multiplatform desktop app

+ +

Thanks a lot to everybody who was testing the desktop app since July – it really helped to make it stable!

+

To use desktop app you need to create a new profile. As SimpleX platform has no user accounts, it's not as simple as for centralized apps to access the same profile from two devices.

+

The next app version will allow using your mobile profile from desktop app. For now, as a workaround, you can join groups from both mobile and desktop devices, and use small groups instead of direct conversations.

+

When you start the app first time, you will be offered to set database passphrase – you have to memorize it, as there is no way to recover it. If you skip it, a random passphrase will be generated and stored on your desktop device as plaintext (unencrypted) – you can change it later.

+

Other limitations of the desktop app:

+
    +
  • you cannot send voice messages.
  • +
  • there is no support for calls yet.
  • +
+

You can download the desktop app for Linux and Mac via downloads page. Windows version will be available soon.

+

Group directory service and other group improvements

+ +

Directory service provides a way to search for public groups submitted by the users. To use it, you need to connect to it via SimpleX Chat, as you would connect to any other contact, and type some words to search.

+

You can also create and register your group, with some limitations explained here.

+

Other group improvements in this release:

+
    +
  • +

    you can send delivery receipts to the groups up to 20 members.

    +
  • +
  • +

    if the group settings allow it, you can send direct messages to group members even after you deleted the contact.

    +
  • +
  • +

    connections between members are made faster, and the bug that prevented the connections in some cases is fixed in this release.

    +
  • +
+

The next release will reduce the time it takes to send messages to the group, especially when there are many members or when you have a slow device storage.

+

Encrypted local files and media with forward secrecy

+ +

All messages, files and media sent via SimpleX Chat were always end-to-end encrypted from the very beginning. SimpleX Chat uses double-ratchet algorithm with encrypted message headers, for the best possible meta-data protection.

+

You contacts, groups and messages are stored in the local database on your device, and this database was encrypted from v4.0 released a year ago.

+

But until this version all files and media in the app storage were not encrypted, and when you exported the chat archive, they were unencrypted there as well.

+

From v5.3 all files and media (except videos, for now) are encrypted with a random symmetric key - in many cases they are encrypted before they are written to the storage. Local file encryption can be disabled via Privacy & Security settings, for example, if you need to access the files from the storage outside of the app.

+

In addition to the videos that are stored unencrypted, there are other rare scenarios when the received files may be unencrypted in this release. Files have an open or closed lock icons to indicate whether they were encrypted locally. These limitations will be addressed in the next release. In any case, all files and media are always sent end-to-end encrypted, without any exceptions.

+

The keys used to encrypt files locally are associated with the messages and stored in the encrypted database. If you delete a message with the attached file or media, the key will be irreversibly deleted as well. Even if an attacker gains access to your database passphrase later and to the copy of the encrypted file, they won't be able to decrypt the file.

+

This approach provides forward secrecy for locally stored files, unlike file encryption schemes used in some other apps when the same passphrase is used for all files.

+

Simplified incognito mode

+ +

Incognito mode was added a year ago to improve anonymity of your profile, but it was confusing for some users - it was a global setting, but it only affected the new connections.

+

It is now simpler to use - you can decide whether to connect to a contact or join a group using your main profile at a point when you create an invitation link or connect via a link or QR code.

+

When you are connecting to people you know you usually want to share your main profile, and when connecting to public groups or strangers, you may prefer to use a random profile.

+

SimpleX platform

+

Some links to answer the most common questions:

+

SimpleX Chat security assessment.

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Visit our website to learn more.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html b/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html new file mode 100644 index 0000000000..277e7d7304 --- /dev/null +++ b/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html @@ -0,0 +1,637 @@ + + + + + + + + SimpleX blog: SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups.

+

Published: Nov 25, 2023

+

What's new in v5.4:

+ +

There are many other improvements and fixes in this release:

+
    +
  • profile names now allow spaces.
  • +
  • when you delete contacts, they are optionally notified.
  • +
  • previously used and your own SimpleX links are recognized by the app.
  • +
  • and more - see the release notes.
  • +
+ +

This release allows to use chat profiles you have in mobile app from desktop app.

+

This is only possible when both devices are connected to the same local network. To send and receive messages mobile app has to be connected to the Internet.

+

⚡️ Quick start - how to use it

+

On desktop

+

If you don't have desktop app installed yet, download it and create any chat profile - you don't need to use it, and when you create it there are no server requests sent and no accounts are created. Think about it as about user profile on your computer.

+

Then in desktop app settings choose Link a mobile - it will show a QR code.

+

+

On mobile

+

In mobile app settings choose Use from desktop, scan the QR code and verify session code when it appears on both devices - it should be the same. Verifying session code confirms that the devices are connected directly via a secure encrypted connection. There is an option to verify this code on subsequent connections too, but by default it is only required once.

+

+

The devices are now paired, and you can continue using all mobile profiles from desktop.

+

If it is an Android app, you can move the app to background, but iOS app has to remain open. In both cases, while you are using mobile profiles from desktop, you won't be able to use mobile app.

+

The subsequent connections happen much faster - by default, the desktop app broadcasts its session address to the network, in encrypted form, and mobile app connects to it once you choose Use from desktop in mobile app settings.

+

How does it work?

+

The way we designed this solution avoided any security compromises, and the end-to-end encryption remained as secure as it was - it uses double-ratchet algorithm, with perfect forward secrecy, post-compromise security and deniability.

+

This solution is similar to WhatsApp and WeChat. But unlike these apps, no server is involved in the connection between mobile and desktop. The connection itself uses a new SimpleX Remote Control Protocol (XRCP) based on secure TLS 1.3 and additional quantum-resistant encryption inside TLS. You can read XRCP protocol specification and threat model in this document. We will soon be augmenting double ratchet to be resistant to quantum computers as well.

+

The downside of this approach is that mobile device has to be connected to the same local network as desktop. But the upside is that the connection is secure, and you do not need to have a copy of all your data on desktop, which usually has lower security than mobile.

+

Please note, that the files you send, save or play from desktop app, and also images you view are automatically saved on your desktop device (encrypted by default except videos). To remove all these files you can unlink the paired mobile device from the desktop app settings – there will be an option soon allowing to remove the files without unlinking the mobile.

+

🤖 Connecting to remote SimpleX CLI

+

Warning: this section is for technically advanced users!

+

If you run SimpleX CLI on a computer in another network - e.g., in the cloud VM or on a Raspberry Pi at home while you are at work, you can also use if from desktop via SSH tunnel. Below assumes that you have remote machine connected via SSH and CLI running there - you can use tmux for it to keep running when you are not connected via ssh.

+

Follow these steps to use remote CLI from desktop app:

+
    +
  1. On the remote machine add the IP address of your desktop to the firewall rules, so that when CLI tries to connect to this address, it connects to localhost instead: iptables -t nat -A OUTPUT -p all -d 192.168.1.100 -j DNAT --to-destination 127.0.0.1 (replace 192.168.1.100 with the actual address of your desktop, and make sure it is not needed for something else on your remote machine).
  2. +
  3. Also on the remote machine, run Simplex CLI with the option --device-name 'SimpleX CLI', or any other name you like. You can also use the command /set device name <name> to set it for the CLI.
  4. +
  5. Choose Link a mobile in desktop app settings, note the port it shows under the QR code, and click "Share link".
  6. +
  7. Run ssh port forwarding on desktop computer to let your remote machine connect to desktop app: ssh -R 12345:127.0.0.1:12345 -N user@example.com where 12345 is the port on which desktop app is listening for the connections from step 3, example.com is the hostname or IP address of your remote machine, and user is some username on remote machine. You can run port forwarding in the background by adding -f option.
  8. +
  9. On the remote machine, run CLI command /connect remote ctrl <link>, where <link> is the desktop session address copied in step 3. You should run this command within 1 minute from choosing Link a mobile.
  10. +
  11. If the connection is successful, the CLI will ask you to verify the session code (you need to copy and paste the command) with the one shown in desktop app. Once you use /verify remote ctrl <code> command, CLI can be used from desktop app.
  12. +
  13. To stop remote session use /stop remote ctrl command.
  14. +
+

Better groups

+

Faster to join, with more reliable message delivery

+

We improved the protocols for groups, by making joining groups much faster, and also by adding message forwarding. Previously, the problem was that until a new member connects directly with each existing group member, they did not see each other messages in the group. The problem is explained in detail in this video at 18:23.

+

With v5.4, the admin who added members to the group forwards messages to and from the new members until they connect to the existing members. So you should no longer miss any messages and be surprised with replies to messages you have never seen once you and new group members upgrade.

+

New group features

+

+

Create groups with incognito profile

+

Previously, you could only create groups with your main profile. This version allows creating groups with incognito profile directly. You will not be able to add your contacts, they can only join via group link.

+

Block group members to reduce noise

+

You now can block messages from group members that send too many messages, or the messages you don't won't to see. Blocked members won't know that you blocked their messages. When they send messages they will appear in the conversation as one line, showing how many messages were blocked. You can reveal them, or delete all sequential blocked messages at once.

+

Prohibit files and media in a group

+

Group owners now have an option to prohibit sending files and media. This can be useful if you don't won't any images shared, and only want to allow text messages.

+

Better calls

+

Calls in SimpleX Chat still require a lot of work to become stable, but this version improved the speed of connecting calls, and they should work for more users.

+

We also added screen sharing in video calls to desktop app.

+

Other improvements

+

This version also has many small and large improvements to make the app more usable and reliable.

+

The new users and group profiles now allow spaces in the names, to make them more readable. To message these contacts in CLI you need to use quotes, for example, @'John Doe' Hello!.

+

When you delete contacts, you can notify them - to let them know they can't message you.

+

When you try to connect to the same contact or join the same group, or connect via your own link, the app will recognize it and warn you, or simply open the correct conversation.

+

You can find the full list of fixed bugs and small improvements in the release notes.

+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html b/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html new file mode 100644 index 0000000000..c8f15bd7f2 --- /dev/null +++ b/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html @@ -0,0 +1,610 @@ + + + + + + + + SimpleX blog: SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.

+

Published: Jan 24, 2024

+

SimpleX Chat infrastructure on Linode:

+
    +
  • Free infrastructure.
  • +
  • SimpleX servers in Linode Marketplace.
  • +
  • High capacity messaging servers.
  • +
+

What's new in v5.5:

+ +

Also, we added Hungarian (only Android) and Turkish interface languages, thanks to our users and Weblate.

+

SimpleX Chat Android app is now available in 20 languages!

+

SimpleX Chat infrastructure on Linode

+

We chose Linode as our hosting provider as and they have been consistently reliable, cheaper than alternatives, with excellent support and great documentation.

+

When Linode was acquired by Akamai, we were a bit nervous about how it may affect service quality. So far it's been working out quite well.

+

As the usage of SimpleX network was growing, so did our hosting costs, and from being really small they started to become significant, particularly as we didn't yet manage to optimize the servers last year.

+

Linode helped - we're really excited to announce that Akamai decided to support SimpleX Chat growth by accepting it into their Linode Rise startup program.

+

Thanks to this program:

+
    +
  • +

    we received free infrastructure for the first year up to $10,000 per month, no strings attached. It already saved us some money, and gave us enough time to optimize the servers - the latest version of the servers are much less costly to operate with the current traffic, and can support a much larger traffic within this limit. In the year 2 of the program we will receive 50% discount with unlimited traffic, and in year 3 - 25% discount.

    +
  • +
  • +

    Linode Marketplace now includes SimpleX Chat messages and file servers - you can get free $100 credits for the first 2 months and run your own servers in just a few clicks, and use them in SimpleX Chat apps. Anybody can submit their application to Linode marketplace, but dedicated support we have from Linode team via this program made it simpler.

    +
  • +
  • +

    Akamai solution engineers are helping us to design high capacity server solution, free of charge, so that a single host can provide horizontally scalable capacity for messaging, allowing for a much larger number of concurrent users on a single server address. Initially we considered using HAProxy, and the latest proof of concept uses OpenResty - a fork of Nginx with Lua script engine - to route requests from a single host to multiple SMP relays, reducing an overhead for the clients that would be configured with a smaller number of higher capacity servers. This project is still in progress, there will be more details as we roll it out.

    +
  • +
+

What's new in v5.5

+

Private notes

+

+

"Where do I put notes for myself?" was a very common support question. There was a workaround - you could create an empty group, just with yourself, and use it to save notes, but it was not very convenient, and you could accidentally add members there.

+

This version has a more convenient and private alternative - the Private notes. It looks like an ordinary conversation where you can put text messages, links with previews, and any media and files, but they are not sent anywhere - they are stored locally, only on your device, with encrypted files.

+

You can access the Private notes created in mobile app from desktop app too, by linking a mobile and desktop apps - the feature added in the previous version. It allows to conveniently share files between the devices without sending them over the Internet.

+

Group history

+

+

In the previous version, when users joined groups, they only saw an empty conversation, and the notifications of being connected to other members. This version allows group admins sending recent group history to the new members - this option is enabled by default for new groups, and can be enabled for the existing groups in the preferences. So now new members can join the conversation as soon as they join.

+

This does not mean that these messages are stored on any servers - the admin member that adds a new member to the group sends these messages directly when a new member joins. Groups are still fully decentralized, do not have any identity on the network, and fully private - only their members know they exist.

+

That is, unless a group owner decides to make it public. Groups can be registered in SimpleX groups directory to be discovered by the new members - group directory is also improved.

+

Simpler UX to connect to other users

+

+

SimpleX platform has no user accounts or identities, and while it improves metadata privacy, it also makes it harder to understand how to connect to other people, particularly for the new users who are not invited by the existing users.

+

This version simplifies this interface by allowing to connect via the received link just by pasting the address into the search bar, as is common in many wallet apps and some other decentralized messengers. We also improved the interface of creating invitation links.

+

We will continue working on improving and simplifying user interface throughout the year. Please send us any feedback and suggestions to the team's address available in the app.

+

Message delivery stability and other improvements

+

One of the long standing issues was that message reception could get stuck in some rare occasions, and only get resumed once the app is fully restarted. As Android app includes an always-on notification service that runs in background, full restart should be done via the app settings.

+

This version fixed many issues with message delivery stability and also added some diagnostics to identify any other cases when message delivery may stop. These fixes should also reduce battery usage, particularly on slow internet connections.

+

Other improvements in this version:

+
    +
  • you can now reveal secret messages by tapping. To send a secret message wrap in "#" characters, e.g. "#password#".
  • +
  • you can delete the last user profile, simplifying account deletion. If you have hidden user profiles, they won't be deleted in this case, and will be accessible again once you create a new profile.
  • +
+

SimpleX platform

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html b/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html new file mode 100644 index 0000000000..68de9d6081 --- /dev/null +++ b/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html @@ -0,0 +1,698 @@ + + + + + + + + SimpleX blog: SimpleX Chat v5.6 (beta): adding quantum resistance to Signal double ratchet algorithm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm

+

Published: Mar 14, 2024

+

This is a major upgrade for SimpleX messaging protocols, we are really proud to present the results of the hard work of our whole team on the Pi day.

+

This post also covers various aspects of end-to-end encryption, compares different messengers, and explains why and how quantum-resistant encryption is added to SimpleX Chat:

+ +

Why do we need end-to-end encryption?

+

The objective of end-to-end encryption is to make any potential attackers, such as traffic observers or communication providers who pass the messages between senders and recipients, unable to recover any message content or meaningful information about the messages, even if these attackers possess very advanced computing and mathematical capabilities.

+

While human eyes are unable to see any difference between simply scrambled and encrypted messages, the difference between unreadable scrambling and unbreakable encryption can be as huge as just a few seconds to unscramble a message on an average laptop and more time than the Universe existed required to break the encryption on the most powerful computer in the world.

+

Achieving the latter requires a lot of mathematical precision in both the cryptographic algorithms and in how they are used, and effectively makes encrypted messages indistinguishable from random noise, without any discoverable patterns or statistical irregularities that a computer could use to break the message encryption any faster than it it would take to try every possible combination of bits in the key.

+

End-to-end encryption is an important component of our individual and business security, privacy and sovereignty. Having our private communications protected from any observers is both the natural condition and our inalienable human right.

+

It's very sad to see the same people who keep their financial affairs private to protect from financial crimes, lock their doors to protect from thieves, and curtain their windows to protect from the occasional prying eyes, when it comes to protecting their personal lives from the data criminals say "we don't care about privacy, we have nothing to hide". Everybody's safety depends on keeping their affairs and relations private, not visible to a vast and ruthless data gathering machines, that abuse our data for commercial gain, without any regard to our interests or even the safety of our families and children.

+

Why is encryption even allowed?

+ +

If encryption is such a powerful tool to protect our lives, it also can be used to conceal crimes, so why the governments don't consider it similar to arms, and don't heavily regulate its use?

+

Prior to 1996 the cryptography was considered munition, and its export from the United States was controlled under this category, alongside flamethrowers and B-1 bombers. When Daniel J. Bernstein (DJB), then a student of Mathematics at University of California, Berkeley, wanted to publish the paper and the source code of his Snuffle encryption system, the Office of Defense Trade Controls of the Department of State (DOS) after more than a year of correspondence requested that DJB registers as the arms dealer.

+

In 1995 DJB represented by the Electronic Frontier Foundation brought a case against the DOS to overturn cryptography restrictions. The ruling in the case declared that the export control over cryptographic software and related technical data constitute an impermissible infringement on speech in violation of the First Amendment. This decision resulted in regulatory changes, reducing controls on encryption exports, particularly for open-source algorithms. The case continued until 2003, when it was put on hold after the commitment from the US government not to enforce any remaining regulations.

+

This case is very important for the whole industry, as to this day we can freely create and use open-source cryptography without export control restrictions. It also shows the importance of engaging with the system and challenging its views in an open dialogue, rather than either blindly complying or violating regulations.

+

DJB role for cryptography and open-source goes beyond this case – many cryptographic algorithms that are considered to be the most advanced, and many of which we use in SimpleX Chat, were designed and developed by him:

+
    +
  • Ed25519 cryptographic signature algorithm we use to authorize commands to the servers.
  • +
  • NaCL library with cryptobox and secretbox constructions that combine X25519 Diffie-Hellman key agreement with Salsa20 encryption and Poly1305 authentication. We use cryptobox to encrypt messages in two of three encryption layers and secretbox to encrypt files.
  • +
  • Streamlined NTRU Prime algorithm for quantum resistant key agreement that we used in the protocol for linking mobile app with desktop, and now added to Signal double ratchet algorithm, as explained below.
  • +
+

Without DJB's work the world would have been in a much worse place privacy- and security-wise.

+

Daniel, we are really grateful for the work you did and continue doing. Thank you, and congratulations on the International Mathematics Day!

+

End-to-end encryption security: attacks and defense

+

End-to-end encryption is offered by many messaging apps and protocols, but the security of different implementations are not the same. While many users know about the importance of forward secrecy - the quality of end-to-end encryption that preserves security of the encryption of the past messages, even if the keys used to encrypt some of the messages were compromised - there are many other qualities that protect from different attacks. Below there is the overview of these attacks and the properties of end-to-end encryption schemes that mitigate these attacks.

+

1. Compromised message size - mitigated by padding messages to a fixed block size

+

While the content encryption is the most important, concealing the actual message size is almost as important for several reasons:

+
    +
  • attacker able to observe even approximate message sizes can use these sizes as an additional signal for machine learning to de-anonymise the users and to categorize the relationships between the users.
  • +
  • if a messenger conceals the routing of the messages to hide the transport identities (IP addresses) of senders and recipients, message sizes can be used by traffic observers to confirm the fact of communication with a much higher degree of certainty.
  • +
+

The only effective mitigation to these attacks is to pad all messages to a fixed size. Using space-efficient schemes like Padme, or padding to encryption block size is ineffective for mitigating these attacks, as they still allow differentiating message sizes.

+

To the best of our knowledge, the only messengers other than SimpleX Chat that pad all messages to a fixed packet size are Cwtch and no longer developed Pond - SimpleX design can be seen as an evolution of Pond design.

+

2. Compromised confidential messages - mitigated by repudiation (deniability)

+

Many users are very interested in having ability to irreversibly delete sent messages from the recipients devices. But not only would this ability violate data sovereignty of device owners, it is also completely ineffective, as the recipients could simply put the device offline or use a modified client app to ignore message deletion requests. While SimpleX Chat provides such features as disappearing messages and the ability to irreversibly delete sent messages provided both parties agree to that, these are convenience features, and they cannot be considered security measures.

+

The solution to that is well known to cryptographers - it is the quality of the encryption algorithms called "repudiation", sometimes also called "deniability". This is the ability of the senders to plausibly deny having sent any messages, because cryptographic algorithms used to encrypt allow recipients forging these messages on their devices, so while the encryption proves authenticity of the message to the recipient, it cannot be used as a proof to any third party.

+

Putting it all in a simpler language - a sender can claim that the recipient forged messages on their device, and deny ever having sent them. The recipient will not be able to provide any cryptographic proof. This quality makes digital conversation having the same qualities as private off-the-record conversation - that's why the family of algorithms that provide these qualities are called off-the-record (OTR) encryption.

+

Repudiation is still a rather new concept - the first off-the-record algorithms were proposed in 2004 and were only offered to a wide range of users in Signal messenger. This concept is still quite badly understood by users and society, and yet to have been used as the defense in any public court cases, as legal systems evolve much slower than technology. In high profile cases repudiation can be used as an effective evidence for the defense.

+

Repudiation in messaging systems can be undermined by adding cryptographic signature to the protocol, and many messengers that use OTR encryption algorithms do exactly that, unfortunately. SimpleX Chat does not use signature in any part of client-client protocol, but the signature is currently used when authorizing sender's messages to the relays. v5.7 will improve deniability by enabling a different authorization scheme that will provide full-stack repudiation in all protocol layers.

+

3. Compromised message keys - mitigated by forward secrecy

+

The attacker who obtained or broke the keys used to encrypt individual messages, may try to use these keys to decrypt past or future messages. This attack is unlikely to succeed via message interception, and it is likely to require breaking into the device storage. But in any case, if the key was broken or obtained in some other way it's important that this key cannot be used to decrypt other messages - this is achieved by forward secrecy.

+

This property is well understood by the users, and most messengers that focus on privacy and security, with the exception of Session, provide forward secrecy as part of their encryption schemes design.

+

4. Compromised long-term or session - mitigated by break-in recovery

+

This attack is much less understood by the users, and forward secrecy does not protect from it. Arguably, it's almost impossible to compromise individual message keys without compromising long-term or session keys. So the ability of the encryption to recover from break-in (attacker making a copy of the device data without retaining the ongoing access) is both very important and pragmatic - break-in attacks are simpler to execute on mobile devices during short-term device access than long-term ongoing compromise.

+

Out of all encryption algorithms known to us only Signal double ratchet algorithm (also referred to as Signal algorithm or double ratchet algorithm, which is not the same as Signal messaging platform and protocols) provides the ability for the encryption security to recover after break-ins attacks. This recovery happens automatically and transparently to the users, without them doing anything special or even knowing about break-in, by simply sending messages. Every time one of the communication parties replies to another party message, new random keys are generated and previously stolen keys become useless.

+

Double ratchet algorithm is used in Signal, Cwtch and SimpleX Chat. But Signal app by allowing to use the same profile on multiple devices compromises the break-in recovery function of Signal algorithm, as explained in this paper. Because of break-in recovery you cannot use SimpleX Chat profile on more than one device at the same time - the encryption scheme rotates the long term keys, randomly, and keys on another device become useless, as they would become useless for the attacker who stole them. Security always has some costs to the convenience.

+

5. Man-in-the-middle attack - mitigated by two-factor key exchange

+

Many people incorrectly believe that security of end-to-end encryption cannot be broken by communication provider. But end-to-end encryption is only as secure as key exchange. While any intermediary passing the keys between senders and recipients cannot recover the private keys from the public keys, they can simply replace the passed public keys with their own and then proxy all communication between the users having full access to the original messages. So instead of having an end-to-end encrypted channel, users would have two half-way encrypted channels - between users and their communication intermediary.

+

Pictures below illustrate how this attack works for RSA encryption.

+

1) Alice sends the key to Bob (e.g. via p2p network or via the messaging server).

+

Public key is shared

+

2) Now Bob can send encrypted messages to Alice - he believes they are secure!

+

Message is encrypted

+

3) But the key could have been intercepted and substituted by Tom (the attacker, or a service provider).

+

Key is intercepted and replaced

+

4) Now the attacker can read the messages without Alice and Bob knowing.

+

End-to-end encryption is compromised

+

The attack on Diffie-Hellman (or on quantum-resistant) key exchange, when both parties send their public keys (or public key and ciphertext), requires the attacker to intercept and replace both keys, but the outcome remains the same - if all communication is passed via a single channel, as it is usually the case with communication services, then any attacker that has inside access to the service can selectively compromise some of the conversations. Two years ago I wrote the post about this vulnerability of end-to-end encryption to MITM attacks.

+

All known mitigations of this attack require using the secondary communication channel to ensure that the keys have not been substituted. The most secure approach is to make user's key (or key fingerprint) a part of the user's address or connection link, thus making two-factor key exchange non-optional. This approach is used in Session, Cwtch and SimpleX Chat.

+

A less secure approach is to provide users an optional way to compare security codes - this is what is done by Signal, Element and many other messengers. The problem with this post-key-exchange verification is that it is optional, and is usually skipped by the majority of the users. Also, this security code can change because the user changed the device, or as a result of the attack via the service provider. When you see in the client app the notification that the security code changed, it's pointless to ask in the same messenger whether the device was changed, as if it were an attack, the attacker would simply confirm it. Instead, the security code needs to be re-validated again via another channel. A good security practice for the users would be to warn their communication partners about the intention to switch the device in advance, before the security code is changed.

+

6. "Record now, decrypt later" attacks - mitigated by post-quantum cryptography.

+

This is the idea based on the assumption that commercially viable quantum computers will become available during the next 10 years, and then they can use time-efficient Shor's algorithm developed in 1994 to break asymmetric encryption with quantum computer (symmetric encryption is not vulnerable to this algorithm).

+

Post-quantum cryptography, or encryption algorithms that are resistant to quantum computers, has been the area of ongoing research for several decades, and there are some algorithms that might protect from quantum computers. It's important to account for these limitations:

+
    +
  • none of the post-quantum algorithms are proven to be secure against quantum or conventional computers. They are usually referred to as "believed to be secure" by the researchers and security experts. There is continuous research to break post-quantum algorithms, and to prove their security, and many of these algorithms are broken every year, often by conventional computers.
  • +
  • because of the lack of proofs or guarantees that post-quantum cryptography delivers on its promise, these algorithms can only be used in hybrid encryption schemes to augment conventional cryptography, and never to replace it, contrary to some expert recommendations, as DJB explains in this blog post.
  • +
  • they are much more computationally expensive and less space efficient, and the encryption schemes have to balance their usability and security.
  • +
  • many of post-quantum algorithms have known patent claims, so any system deploying them accepts the risks of patent litigation.
  • +
  • the silver lining to these limitations is that the risk of appearance of commercially viable quantum computers in the next decade may be exaggerated.
  • +
+

So, to say it provocatively, post-quantum cryptography can be compared with a remedy against the illness that nobody has, without any guarantee that it will work. While there is a reasonable hope that it might work, so it's not exactly a snake oil, these limitations and risks have to be much better communicated to the end users than they are.

+ +

Does it mean that post-quantum cryptography is useless and should be ignored? Absolutely not. The risks of "record now, decrypt later" attacks are real, particularly for high profile targets, including millions of people - journalists, whistle-blowers, freedom-fighters in oppressive regimes, and even some ordinary people who may become targets of information crimes. Large scale collection of encrypted communication data is ongoing, and this data may be used in the future. So having the solution that may protect you (post-quantum cryptography), as long as it doesn't replace the solution that is proven to protect you (conventional cryptography), is highly beneficial in any communication solution, and has already been deployed in many tools and in some messengers.

+

How secure is end-to-end encryption in different messengers?

+

This comparison may be incorrect in some of the columns. We apologize if some of the points are incorrect, please let us know about any mistakes so we can amend them!

+

The main objective here is to establish the framework for comparing the security of end-to-end encryption schemes, and to highlight any areas for improvement, not to criticize any implementations.

+

Messengers comparison

+

1 Repudiation in SimpleX Chat will include client-server protocol from v5.7 or v5.8. Currently it is implemented but not enabled yet, as its support requires releasing the relay protocol that breaks backward compatibility.

+

2 Post-quantum cryptography is available in beta version, as opt-in only for direct conversations. See below how it will be rolled-out further.

+

Some columns are marked with a yellow checkmark:

+
    +
  • when messages are padded, but not to a fixed size (Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes).
  • +
  • when repudiation does not include client-server connection. In case of Cwtch it appears that the presence of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  • +
  • when 2-factor key exchange is optional (via security code verification).
  • +
  • when post-quantum cryptography is only added to the initial key agreement and does not protect break-in recovery.
  • +
+

Adding quantum resistance to Signal double ratchet algorithm

+

We have been exploring post-quantum cryptography since early 2022, when SimpleX Chat was first released, and we did not want to be pioneers here - cryptography is critically important to make it right.

+

We hoped to adopt the algorithm that will be standardized by NIST, but the standardization process turned out to be hugely disappointing, and the ML-KEM (Kyber) algorithm that was accepted as a standard was modified to remove an important hashing step (see the lines 304-314 in the published spec)), that mitigates the attacks via a compromised random numbers generator, ignoring strong criticism from many expert cryptographers, including DJB (see this discussion and the comments NIST received). To make it even worse, the calculation of security levels of Kyber appears to have been done incorrectly, and overall, the chosen Kyber seems worse than rejected NTRU according to the analysis by DJB.

+

We also analyzed the encryption schemes proposed in Tutanota in 2021, and another scheme adopted by Signal last year, and published the design of quantum resistant double ratchet algorithm that we believe provides better security than these schemes:

+
    +
  • unlike Tutanota design, it augments rather than replaces conventional cryptography, and also avoids using signatures when the new keys are agreed (ratchet steps).
  • +
  • unlike other messengers that adopted or plan to adopt ML-KEM, we used Streamlined NTRU Prime algorithm (specifically, strnup761) that has no problems of ML-KEM, no known patent claims, and seems less likely to be compromised than other algorithms - it is exactly the same algorithm that is used in SSH. You can review the comparison of the risks of various post-quantum algorithms.
  • +
  • unlike Signal design that only added quantum resistance to the initial key exchange by replacing X3DH key agreement scheme with post-quantum PQXDH, but did not improve Signal algorithm itself, our design added quantum-resistant key agreements inside double algorithm, making its break-in recovery property also quantum resistant.
  • +
+

The we could make break-in recovery property of Signal algorithm quantum-resistant, and why, probably, Signal didn't, is because irrespective of the message size SimpleX Chat uses a fixed block size of 16kb to provide security and privacy against any traffic observers and against messaging relays. So we had an extra space to accommodate additional ~2.2kb worth of keys in each message without any additional traffic costs.

+

In case when the message is larger than the remaining block size, e.g. when the message contains image or link preview, or a large text, we used zstd compression to provide additional space for the required keys without reducing image preview quality or creating additional traffic - our previously inefficient JSON encoding of chat messages was helpful in this case.

+Double KEM agreement +

The additional challenge in adding sntrup761 was that unlike Diffie-Hellman key exchange, which is symmetric (that is, the parties can share their public keys in any order and the shared secret can be computed from two public keys), sntrup761 is interactive key-encapsulation mechanism (KEM) that requires that one party shares its public key, and another party uses it to encapsulate (which is a fancy term for "encrypt" - that is why it has asterisks in the image) a random shared secret, and sends it back - making it somewhat similar to RSA cryptography. But this asymmetric design does not fit the symmetric operation of Signal double ratchet algorithm, where both sides need to generate random public keys and to compute new shared secrets every time messaging direction changes for them. So to achieve that symmetry we had to use two KEM key agreements running in parallel, in a lock-step fashion, as shown on the diagram. In this case both parties generate random public keys and also use the public key of another party to encapsulate the random shared secret. Effectively, this design adds a double quantum-resistant key agreement to double ratchet algorithm steps that provide break-in recovery.

+

When can you start using quantum resistant chats?

+

+

Quantum resistant double ratchet algorithm is already available in v5.6 (beta) of SimpleX Chat as an optional feature that can be enabled for the new and, separately, for the existing direct conversations.

+

The reason it is released as opt-in is because once the conversation is upgraded to be quantum resistant, it will no longer work in the previous version of the app, and we see this ability to downgrade the app if something is not working correctly as very important for the users who use the app for critical communications.

+

To enable quantum resistance for the new conversations:

+
    +
  • open the app settings (tap user avatar in the top left corner).
  • +
  • scroll down to Developer tools and open them.
  • +
  • enable Show developer options toggle.
  • +
  • now you will see Post-quantum E2EE toggle - enable it as well.
  • +
+

Now all new contacts you add to the app will use quantum resistant double ratchet algorithm.

+

Once you have enabled it for the new contacts, you can also enable it for some of the existing contacts:

+
    +
  • open the chat with the contact you want to upgrade to be quantum resistant.
  • +
  • tap contact name above the chat.
  • +
  • tap Allow PQ encryption.
  • +
  • exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.
  • +
+

Next for post-quantum crypto - all direct chats, small groups and security audit

+

We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.

+

We will also be adding quantum resistance to small groups up to 10-20 members. Computing cryptographic keys is much slower, in comparison, and it would be very inefficient (and completely unnecessary) for large public groups.

+

We have also arranged a 3rd party cryptographic review of our protocol and encryption schemes design for June/July 2024 - it will cover the additions to SimpleX protocols since the previous security audit in November 2022, including XFTP protocol we use for file transfers and quantum resistant Signal double ratchet algorithm we just released in this beta version.

+

In November 2024 we will be conducting further implementation audit, with double the scope of our 2022 audit.

+

Security audits are very expensive, as they require employing exceptionally competent engineers and cryptographers, and it does stretch our budgets - so any donations to help us cover the costs would be hugely helpful.

+

That's it for now!

+

Thank you for helping us improve the app, and look forward to your feedback.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donates to SimpleX Chat!

+

As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html b/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html new file mode 100644 index 0000000000..82f1ac19f9 --- /dev/null +++ b/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html @@ -0,0 +1,637 @@ + + + + + + + + SimpleX blog: SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration

+

Published: Mar 23, 2024

+

SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:

+ +

What's new in v5.6:

+ +

There are many other improvements and fixes in this release:

+
    +
  • group admins can block a member for all other members.
  • +
  • filtering chats no longer includes muted chats with unread messages.
  • +
  • and more - see the release notes.
  • +
+

SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance

+

Community and business interests are aligned

+

Some people in our users' community believe that there is a conflict between the business and the community interests. This view fails to see a bigger picture of how these interests are aligned. I wrote a blog post about it here. Our goal is to grow the network and the ecosystem while enriching all stakeholders involved, both the community and the business shareholders. This strategy relies on the strengths and opportunities of both the business and the decentralized network we build, with its vibrant community of individuals and organizations. It positions the business not as a controller but as a supporter of the community growth, resilience and sustainability.

+

By leveraging access to investment resources, its ability to provide stock-based incentives beyond salaries, operating as a business will satisfy users' and community needs more effectively, ensuring the long-term viability and growth of the network, while remaining true to the mission. A purely nonprofit model with no avenue to sustain this growth is simply not possible. Sustainability requires profits, that is simply spending less than earning, as every responsible individual and organization should aim for, and these profits must be based on users' payments, and not on some other sources of revenue or funds. And building the software product that customers are willing to pay for requires substantial business investments. We will accomplish it while maintaining transparency and the commitment to keep SimpleX network and its protocols open and free to use.

+

The journey to the decentralized non-profit protocol governance

+

At the current early stage of network growth the protocols will benefit most from the rapid evolution and centralized design. Many protocols that decentralized their evolution too early failed to evolve and to adapt to the product requirements of the majority of users, causing them to stall in growth. Even the open web became possible only thanks to Netscape, a venture funded company, that developed browsers and web server software taking it upon themselves to rapidly evolve web specification to make it into a robust application platform as we now know it. It is very unlikely that it would have happened if it was managed by a nonprofit or community, in a decentralized way.

+

Once SimpleX network protocols stabilize and reach the required maturity, we plan to transition its governance to several new nonprofit entities, ensuring its continued evolution aligns more closely with our vision of community-driven, independent and transparent governance. We and our investors believe that this is a win-win strategy. It both maximizes the business value, by creating a product built on protecting privacy and users' trust - a model that we see as the only viable path forward. It also maximizes the value created for the user community.

+

Welcome, Esra’a!

+

To help us deliver these goals, Esra’a Al Shafei joined SimpleX Chat team - we are excited to welcome her!

+

Esra'a is a longtime privacy and human rights advocate from Bahrain. She is the founder of Majal.org, a network of platforms that amplify under-reported and marginalized voices in the Middle East and North Africa. She is also the co-founder of the Numun Fund, the first dedicated fund for women-led tech in the Global South. Esra’a is currently the Vice Chair of the Board at the Wikimedia Foundation, the nonprofit which hosts Wikipedia. She is also on the Board of the Tor Project, developers of one of the world’s strongest tools for privacy and freedom online. Previously, she served on the Board of Access Now, an international nonprofit dedicated to an open and free Internet.

+

In her own words: "Privacy and security have been the center of my work as a human rights advocate for the last 20 years in one of the most surveilled countries in the world where staying safe remains a burden. Our privacy is our dignity. It is something that belongs to us and something we should treasure - as people, as companies, as governments. Despite messaging being the most intimate aspect of our digital lives, the leading protocols in this space are centralized and we deserve a web that operates on the core principles of genuine privacy and security in a fully decentralized framework. SimpleX network will play a critical role towards that vision."

+

Executing the plan towards decentralized nonprofit protocol governance will be Esra’a’s primary responsibility. Our primary objective with this plan is to ensure that no single entity can control or have unrestricted ownership of the protocols, so it can maintain its integrity.

+

What's new in v5.6

+

Quantum resistant end-to-end encryption (BETA)

+

Adding post-quantum resistance to the double ratchet end-to-end encryption algorithm in SimpleX Chat is a major upgrade to messaging protocols, and it creates the security against the future quantum computers.

+

I wrote in detail in the previous post about various properties of end-to-end encryption and how exactly quantum resistance is implemented in SimpleX Chat - currently SimpleX Chat has the most secure end-to-end encryption design against the present and future attacks.

+

We plan to perform a security audit of this design and implementation later this year.

+

Post-quantum encryption is currently added as opt-in and has to be separately enabled to be active for the new contacts, and, additionally, can be enabled for the existing contacts.

+

+

To enable quantum resistance for the new conversations:

+
    +
  • open the app settings (tap user avatar in the top left corner).
  • +
  • scroll down to Developer tools and open them.
  • +
  • enable Show developer options toggle.
  • +
  • now you will see Post-quantum E2EE toggle - enable it as well.
  • +
+

Now all new contacts you add to the app will use quantum resistant Signal double ratchet algorithm.

+

Once you have enabled it for the new contacts, you can also enable it for some of the existing contacts:

+
    +
  • open the chat with the contact you want to upgrade to be quantum resistant.
  • +
  • tap contact name above the chat.
  • +
  • tap Allow PQ encryption.
  • +
  • exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.
  • +
+

We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.

+

Use the app during the audio and video calls

+

+

Since we added the audio and video calls in 2022 a lot of work was done to improve the stability of calls. One of the usability downsides until this release was that it was impossible to use the app during the call.

+

This version solved this problem - now you can return back to the app without interrupting the call and use any of the app functions - for example, you can send the messages or files to the person you are in the call with. If this is a video call, you will continue seeing your contact in a small picture-in-picture view.

+

Migrate all app data to another device via QR code

+

We always believed that cross-platform data portability is very important for any software. Users own their data, and they should have a way to export it from any software they use. So from the version of SimpleX Chat released in July 2022 it was possible to export the database as a self-contained file, including all contacts, messages and files, and import it on a new device.

+

"How can I migrate my data to another device?" was one of the most frequent user questions, but until this release this process was quite complex, requiring too many steps, and most non-technical users were not willing to try it, as even though it was reliable, it appeared risky.

+

This release made the app data migration very simple, see the steps below.

+

Start the migration on the source device

+

+

On the device you migrate your app data from, follow these steps:

+
    +
  • choose Migrate to another device,
  • +
  • if necessary, set the database passphrase (initially, the database is encrypted with a random passphrase), or, if it's already set, verify it - for security and to ensure that the archive will be usable on the new device,
  • +
  • tap Archive and upload to and upload the app data in chunks to the XFTP servers configured in the app,
  • +
  • the app will show the QR code that should be scanned from the new device.
  • +
+

Migrate data to the target device

+

+

On the device you migrate your data to, follow these steps:

+
    +
  • on the first app page choose Migrate from another device,
  • +
  • scan the QR code shown on the source device,
  • +
  • once the archive downloads, enter the database passphrase and tap Open chat,
  • +
+

Finalize migration on the source device

+ +

When the chat starts on the target device, make sure to tap Finalize migration and then Delete database on the source device.

+

The database cannot be used on two devices at the same time, doing so would make it impossible to decrypt the received messages. This is a security measure - the break-in recovery property of double ratchet algorithm.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

How SimpleX is different from Session, Matrix, Signal, etc..

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donates to SimpleX Chat!

+

As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html b/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html new file mode 100644 index 0000000000..f24e33aee0 --- /dev/null +++ b/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html @@ -0,0 +1,551 @@ + + + + + + + + SimpleX blog: Why I joined SimpleX Chat - by Esra'a al Shafei + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Why I joined SimpleX Chat

+

Published: Apr 4, 2024

+

By Esra'a al Shafei

+

Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, my decision to join SimpleX Chat may come as a surprise to some. But, as I step into this new chapter, I want to share the insights and convictions that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.

+

The nonprofit world has been my primary focus for decades. My team and I ran the platforms at Majal.org with an extremely limited budget. We had to navigate many complexities and challenges that shadow the nonprofit model. And because we worked primarily in creating applications and tools, a recurring theme has been financial sustainability. Being a Bahrain-based entity for most of these years meant that the many communities we served were not in a position to provide contributions and we were not eligible for most foundation grants. This drastically limited our growth and the reliability of our apps. When we failed to raise sufficient funds or meet our target budgets, we often had to shutter certain applications, sometimes after spending more than 10 years building them.

+

With secure and private messaging, the stakes are even graver. Any failure to commit and resource/fund ongoing development, security patches, etc means lives can be at risk. I still believe in nonprofit models, and it’s why I continue to serve them through various volunteer roles. I do also believe that there is room for a mixture of models that, in the case of something as unique as SimpleX Chat, can serve as a fully open and transparent public interest technology while also having a profitable values-aligned company that can keep the lights on to continue developing, expanding, and improving the protocol, network and their reach.

+

I’m no stranger to writing about some VC models being corrupt. Frankly, I also hold the view that some tech VCs are amongst the most complicit in egregious war crimes worldwide, or enabling the intrusive surveillance we’re fighting against. So being part of a VC-funded venture is not a decision I take lightly. However, I have been following SimpleX Chat’s growth since early 2022 when I first met Evgeny at the Mozilla Festival. I appreciated the drive and Evgeny’s firm refusal to settle for the current models of private messaging. We share the belief that messaging is something we need to keep improving and that we must continue pushing its boundaries to make it even more private, secure, usable for groups, and, most importantly - fully decentralized. This is a major undertaking, and it requires funding to achieve. Candidly, I did worry about funding and sustainability because, at the time, SimpleX was still primarily funded by user contributions.

+

But even knowing this, I scrutinized SimpleX Chat for taking VC funding ($350K) from Village Global and questioned the individuals featured on its frontpage. I had to speak with Evgeny directly to learn who exactly from this fund was involved, how much power they wielded, if any, and if this changes the ethos of the company - all of which he is already making public. It was only after these discussions that I was comfortable to take a leap of faith and continue to use the app and vouch for its current and future offerings. It required me to question my own views on whether a VC-funded company can actually have major positive contributions to privacy as well as the open ecosystem.

+ +

The web has a long history of trading privacy for “free” services. Traditionally, these services have also been centralized, closed-source, non-transparent, and profit-oriented. The companies behind these apps and services became prolific because of their disregard of privacy rights, which normalized lucrative surveillance capitalism. There is such an extensive global monopoly that in Africa, only 1 of the 5 biggest messaging apps in Africa isn't owned by Meta, notoriously known for spying not just through its own apps but even through its competitors, – relentless, massive data harvesting that stretches far beyond its own walled gardens:

+

Some of the world’s top engineers often go to these companies because of the benefits and financial opportunities. We can question their ethics all day long, but we also need to question if the web would look significantly different if there were as many opportunities at privacy-first companies with purpose and strong, proven moral boundaries, set up in a way that can guarantee operational independence from any shareholders and VCs.

+

SimpleX could have taken the route of other companies in the privacy space, whether it’s Skiff which rushed to take a large amount of VC money only to shutter its doors after an acquisition, leaving its users hanging with many unanswered questions, or giving up control of the company, which would puts its future solely in the hands of VCs with majority ownership. SimpleX aims to prevent this, and in fact has left money on the table to ensure that it does not occur. Had it not been for this information, I would not have joined, and I would have remained a user of the product, albeit a very cautious one, constantly wondering whether it will be sold or corrupted.

+

It’s worth noting that some private foundations operate on the VC model in supporting nonprofits, either by requiring Board seats or requesting that their funding be used towards very specific objectives not always in alignment with the organization’s values and mission. It’s also worth noting that some nonprofits actually operate on the models of surveillance and censorship. Therefore, whether an organization or company is VC-backed or a nonprofit should not be the sole factor in deciding whether or not it is trustworthy. Actions are important, with full transparency being one of the most critical factors, and being fully open source being another to attract valid criticisms and audits to ensure any product or protocol lives up to its privacy and security promise. SimpleX Chat prides itself on being both transparent and open, on top of also being fully decentralized. If you’re new to it and eager to know more, you can start with this overview.

+

Another important consideration is that the SimpleX network does have a plan that would rely on users' payments for specific or tailored services, and not on some other sources of revenue or funds (ads, etc.). Building anything that users would be willing to pay for requires substantially more time and resources, hence the VC route to establish a business model that doesn’t translate to the user being the product. But any business services need to be separate from SimpleX as a public interest technology. As outlined in this recent post, I’ll be using my background in nonprofit governance structures to ensure that the SimpleX network protocols evolve under the stewardship of nonprofit entities in various jurisdictions, so that its continued evolution aligns more closely with the vision of community-driven, independent and decentralized governance. This would help create a necessary balance between different structures, in the same way many tech nonprofits also have for-profit subsidiaries to attract fee-for-service agreements to sustain their operations.

+

In summary: My decision to join Simplex Chat, despite my deep-rooted beliefs and skepticism towards VC funding, reflects a broader realization: that the fight for privacy, security, and decentralization in today’s web is multifaceted and sometimes requires us to depart from our comfort zones to explore sustainable paths for continuous growth and impact so that open source privacy tools and protocols are no longer “niche”, but universally accessible standards. As long as nothing in this journey compromises our moral principles and integrity, this will remain a very worthwhile goal to pursue.

+
+
+ + + + + + + + diff --git a/blog/20240416-dangers-of-metadata-in-messengers.html b/blog/20240416-dangers-of-metadata-in-messengers.html new file mode 100644 index 0000000000..ba82c43ebb --- /dev/null +++ b/blog/20240416-dangers-of-metadata-in-messengers.html @@ -0,0 +1,563 @@ + + + + + + + + SimpleX blog: The dangers of metadata in messengers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

The dangers of metadata in messengers

+

Published: Apr 16, 2024

+

By Esra'a al Shafei

+

In many countries around the world, phone numbers are attached to biometrics data and personal IDs. Telecommunications companies are either government owned or are heavily regulated, privately owned monopolies who comply with most government requests for backdoors or user data. The idea that today, we still need to give out our phone numbers as primary identifiers to be able to use the leading messaging apps should be frowned upon and actively challenged. It’s necessary to advocate for private alternatives in messaging that do not rely on user IDs of any kind - and yes, it’s possible.

+

Messaging is still not where it needs to be. Privacy is confused with security, when both are not synonymous, and there are major gaps in helping users understand the fundamental differences.

+ +

For example, while WhatsApp messages are end-to-end encrypted, let’s consider what you give up when you use it, per its own listings in app stores:

+
    +
  • App activity (app interactions, in-app search history, and other user-generated content)
  • +
  • Location
  • +
  • Financial information (user payment info and payment history)
  • +
  • Contacts and their phone numbers
  • +
  • Groups you’re a member of
  • +
  • When you use the app and how often you use it
  • +
  • Device and other IDs
  • +
  • Personal info (email address, user IDs, phone number)
  • +
+

This is called metadata. It reveals a wealth of information about you and your connections, and in the hands of a centralized monopoly, this can and does get misused in incredibly dangerous ways. Once such metadata is logged, it can create very detailed profiles about who you are, everywhere you’ve been, and everyone you’ve ever spoken to. In settling for apps that normalize this while giving you the illusion of privacy in their marketing, we are doing ourselves a disservice by accepting this as the default. Collectively, we aren’t doing enough to protect ourselves and our social graph from this invasive overreach.

+

When stored, aggregated and analyzed, this metadata provides ample information that could potentially incriminate someone or be submitted to authorities. When WhatsApp and Facebook Messenger enabled end-to-end encryption for messages, of course it was a welcome and widely celebrated change. But it’s important to remember that not all end-to-end encryption utilizes the same standards, some implementations are more secure than others, so it’s something that shouldn’t necessarily be accepted at face value. More importantly: collecting and storing an obscene amount of metadata should invite global scrutiny, considering this data is often combined with whatever other information companies like Meta harvest about your identity (which is a lot.)

+ +

This is one of the many reasons why we need to resist giving out our phone numbers just to access an app, especially to do something as personal and intimate as private messaging. Even though users can sometimes mask their numbers with a username, their identity on the app is still fundamentally tied to their phone number. App operators have access to this, as well as user contacts. Additionally, with a simple modification to the app's source code, the contacts may also gain access in some cases. This should raise more concerns about privacy, and it makes the need for anonymity difficult to achieve.

+

Everyone has a different threat model (and if you don’t yet, now is a good time to create one). For many users today, WhatsApp and other apps may be sufficient for their specific needs, especially in connecting with families and friends who are already on the app and unlikely to migrate elsewhere. If that suits your life and needs, and if you’re aware and consciously accept the risks, great.

+

But we also need to acknowledge that the world is becoming increasingly dangerous in the way AI is being used to supercharge surveillance, and we need to be educated and aware of the risks this is already having on our lives and what it subjects others in your network to when you choose metadata-heavy apps as your primary form of communication. Having alternatives will always be important, even if it’s not what you default to for everyday messaging. Recognize who in your social circles might require the extra privacy, anonymity and security, so that you can play a role in protecting vulnerable individuals who need it most. The messaging app you choose implicates others as well, not just yourself, and while you personally may not require complete privacy, others might have their lives depend on it.

+

End-to-end encryption is a solid start, but it's just the beginning of our pursuit for true privacy and security. True privacy means that even when legal demands come knocking, there's no useful metadata to hand over. It's not enough to just protect the content of messages; we need consistent innovation in protecting metadata too.

+

Changing ingrained habits is tough, but your privacy is always worth the fight. Although giants like WhatsApp and Telegram may dominate global messaging for now, increasing concerns about data harvesting and AI-driven surveillance are fueling demand for alternatives. SimpleX Chat aims to be one of those strong alternatives, hence its radical focus on a decentralized framework with no user identifiers (in other words, nothing that uniquely identifies users on the protocol level to their contacts or to the relays) and extra optionality (self-hosting an SMP server or XFTP server, access via Tor, chat profiles with incognito mode, etc.)

+

As of today, most messaging alternatives, including SimpleX, will have some limitations. But with the limited resources we have, we are committed to daily progress towards creating a truly private messenger that anyone can use while maintaining the features that users have come to know and love in messaging interfaces. We want to be the prime example of a messenger that achieves genuine privacy without compromising it for convenience. We need to be able to reliably move away from small and niche use cases to endorsing and enforcing global standards for privacy and making it accessible for all users regardless of their technical expertise.

+

We’re grateful for the users and donors who have been following along on this journey thus far and helping with feedback, anything from bug reports to identifying potential risks. Building in the open has always been a necessity for transparency and ongoing auditability, because we don’t want anyone to just take our word for it. See for yourself and engage in the discussions. We fully expect you to hold us accountable to our word.

+
+
+ + + + + + + + diff --git a/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html b/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html new file mode 100644 index 0000000000..6a7299d9e5 --- /dev/null +++ b/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html @@ -0,0 +1,604 @@ + + + + + + + + SimpleX blog: SimpleX network: legally binding transparency, v5.7 released with better calls and messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: legally binding transparency, v5.7 released with better calls and messages

+

Published: Apr 26, 2024

+

What's new in v5.7:

+ +

Also, we added Lithuanian interface language to the Android and desktop apps, thanks to our users and Weblate.

+

Legally binding transparency

+

We are committed to open-source, privacy and security. Here are the recent changes we made:

+
    +
  • We now have a Transparency Reports page.
  • +
  • We updated our Privacy Policy to remove undefined terms "impermissible" and "acceptable", which would allow us to remove anything we don't like, without any clarity on what that is. You can see the edits here.
  • +
  • We published a new page with Frequently Asked Questions, thanks to the guidance from users.
  • +
  • We also have a new Security Policy – we welcome your feedback on it.
  • +
+

What do we mean by “legally binding transparency?”. It includes these principles:

+
    +
  • Accountability: an empty promise or commitment to transparency that is not legally binding is just marketing, and can provide opportunities for the organizations to be misleading or not disclose important information that can affect their users privacy and security.
  • +
  • Consistency: often, there's a disconnect between marketing claims and legally binding policies. Our approach is to ensure that promises made in marketing materials or any external communications align with our legally binding documents, so that users can rely on our promises, and know exactly what to expect from us.
  • +
+

For example:

+
    +
  • we use open-source code, and we made a legally binding commitment to use the published code in all released apps and deployed preset servers.
  • +
  • we use precise and technical language in the Privacy Policy defining what data and metadata can be accessed via the preset relays.
  • +
+

If you see any inconsistency between technical parameters of SimpleX Network and what is promised in our Privacy Policy please raise it with us.

+

What's new in v5.7

+

This release focus is improving the app usability, and preparing the foundation for v5.8 that will provide an in-built protection of user IP addresses when connecting to unknown file and messaging servers, reducing the need to use Tor (which would still remain supported via SOCKS proxy, for additional privacy).

+

Quantum resistant end-to-end encryption

+ +

We wrote before about how quantum resistant encryption was added to SimpleX Chat and also about other properties of end-to-end encryption, possible attacks on its security and known mitigations.

+

Quantum resistant encryption will now be enabled by default in all direct chats. For the new conversations it will be enabled from the beginning, and for the existing conversations it will be agreed after you exchange several messages with your contacts - you will see a notice in the conversation when it happens.

+

You can still safely downgrade the app to an earlier version if needed, as v5.6 already supports quantum resistant encryption.

+

With the users who have an earlier version, the app will work using the conventional encryption, which is still very secure. It's important that we augmented the conventional encryption with post-quantum cryptographic algorithm rather than replaced it, using a hybrid construction as recommended by the cryptography experts.

+

The groups currently do not support quantum resistant encryption yet - we plan to add it in the future to small groups.

+

Forward and save messages

+

You can now save received messages to private notes and forward them to your contacts and groups. This is both more convenient than copy-pasting the messages, and also more private - you can forward files and preserve a disappearing file in your private notes without saving them outside of the app.

+

You can see and navigate to the original source of the message via the message information, but the recipient of the message can only see that it was forwarded, but not from which conversation - in this way you can show that the message was quoted from another source without revealing the source (Chatham House Rule).

+

+

In-call sounds and switching sound sources

+

This was the most frequent request of the users who use SimpleX Chat for audio and video calls - to add sound indication to the connection progress, as happens in all other apps. This release added these sounds and also vibration when call connects and disconnects.

+

You can also switch between bluetooth headphones, speakerphone and earpiece via the new button in the call.

+

Network management

+

To reduce traffic and battery usage, this release made connection timeouts dependent on which network your device uses - timeouts will be larger when you are on mobile connection and smaller when on WiFi. It also makes connection attempts very infrequent when the device is not connected to network.

+

Customizable shape of profile images

+

To customizable the interface, you can now change the shapes of profile images to anything from squares with sharp corners to circles, as before, via the Appearance menu in the app Settings. The default shape of profile images is changed to squares with rounded corners.

+

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donates to SimpleX Chat!

+

We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240516-simplex-redefining-privacy-hard-choices.html b/blog/20240516-simplex-redefining-privacy-hard-choices.html new file mode 100644 index 0000000000..9a4a2487c9 --- /dev/null +++ b/blog/20240516-simplex-redefining-privacy-hard-choices.html @@ -0,0 +1,571 @@ + + + + + + + + SimpleX blog: SimpleX: Redefining Privacy by Making Hard Choices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX: Redefining Privacy by Making Hard Choices

+

Published: May 16, 2024

+

When it comes to open source privacy tools, the status quo often dictates the limitations of existing protocols and structures. However, these norms need to be challenged to radically shift how we approach genuinely private communication. This requires doing some uncomfortable things, like making hard choices as it relates to funding, alternative decentralization models, doubling down on privacy over convenience, and more.

+

There will always be questions on why the SimpleX Chat and network makes the choices it makes, and that’s good! It’s important to question us and to understand the reasoning behind each decision, whether it’s technical, structural, financial or any other.

+

In this post we explain a bit more about why SimpleX operates and makes decisions the way it does.

+

No user accounts

+

Within SimpleX network there are no user accounts, and more importantly, no user profile identifiers whatsoever at the protocol level, not even random numbers or cryptographic keys used to identify the users. This means there is absolutely nothing that uniquely links users to their contacts or to the network relays. While it's accurate to say, "You need an address to send something," it's crucial to understand that this "address" serves merely as a transient delivery destination, and not as a user profile identifier in any sense.

+

You can read more about how SimpleX works here.

+

Privacy over convenience

+

One of the main considerations often ignored in security and privacy comparisons between messaging applications is multi-device access. For example, in Signal’s case, the Sesame protocol used to support multi-device access has the vulnerability that is explained in detail here:

+

"We present an attack on the post-compromise security of the Signal messenger that allows to stealthily register a new device via the Sesame protocol. [...] This new device can send and receive messages without raising any ‘Bad encrypted message’ errors. Our attack thus shows that the Signal messenger does not guarantee post-compromise security at all in the multi-device setting".

+ +

Solutions are possible, and even the quoted paper proposes improvements, but they are not implemented in any existing communication solutions. Unfortunately this results in most communication systems, even those in the privacy space, having compromised security in multi-device settings due to these limitations. That's the reason we are not rushing a full multi-device support, and currently only provide the ability to use mobile app profiles via the desktop app, while they are on the same network.

+

Another choice that compromises privacy for convenience and usability is 3rd party push notifications. At SimpleX, we take a slow path of optimizing the network and battery consumption in the app, rather than simply hiding inefficiencies behind the quick fix solution of 3rd party push notifications that increases vulnerability, a path Signal and others chose. Like other choices, it has usability and optimization trade offs, but ultimately it’s the right thing to continue progressing towards a better solution as we explain here.

+

Whenever possible, we strive to achieve significantly higher levels of privacy and security. For example, unlike most, if not all, applications (including Signal), we encrypt application files with per-file unique key. Consequently, once a message is deleted, there's no means to open a file that someone may have stolen in hopes of acquiring the key later. Similarly, apps like Session have done away with forward secrecy, a decision which caused them not to be recommended for "long-term or sensitive communications". And misinformation around this makes it dangerous and irresponsible to recommend without such necessary disclosures for people’s awareness.

+

Session’s decision was based on the incorrect statements about double ratchet being impossible in decentralized networks, and underplayed importance of forward secrecy, break-in recovery and deniability - the absence of these crucial qualities makes Session a much weaker choice for private messaging. For transparency, this was something that was debated with their team here. We also made a separate post about these qualities of end-to-end encryption and their presence in different messengers, to show that not all end-to-end encrypted apps offer the same level of protections.

+

Network decentralization

+ +

It's important to recognize that a model of decentralization where all servers are openly known and accessible to all clients, that some users ask for, actually results in a less decentralized network, and as the network grows it often requires an introduction of a central authority to protect from bad actors with malicious intent. Therefore, we've deliberately opted for a slower path towards achieving a higher degree of decentralization where there is no central server registry or network authority. For example, p2p designs may offer higher initial decentralization but often compromise on privacy and eventual decentralization. In essence, our approach prioritizes a balance between initial decentralization, privacy, and higher degree of decentralization down the line.

+

Additionally, while it's true that we haven't yet established a model to incentivize other network operators, it's certainly on the roadmap. We see the decentralization of network operators offered within the app as a top priority.

+

Where it stands today, users have the freedom to select their preferred servers within the SimpleX network by configuring the app, with thousands of self-hosted servers in operation. Moreover, numerous third-party applications rely on our code for their in-app communications, operating independently of our servers, many of which we may not even be aware of.

+

Decentralization is an ongoing journey, and we strive to proceed at a measured pace to ensure its proper implementation. While the immediate results may not always appear ideal, prioritizing a careful approach ensures that in the long run, the decisions made in this area align with our ultimate objectives of a private, efficient, reliable and fully decentralized network.

+

Funding and profitability

+

We explain our rationale for funding here. Funding sources is always one of the most difficult choices to make, and it’s important to underline that VC models don’t necessarily translate to a quest for control, interference of any kind, or overall influence on product roadmap and strategy. The vast majority of investors seek profitability. Irrespective of the organization type profitability is essential for a sustainable operation, and it can and should be done while adhering to the highest possible standards for privacy. For-profit vs. nonprofit is also not an accurate metric to measure a commitment towards privacy and open standards, which is further explained here.

+

To make a profit, satisfying customers is the key. Unlike the many companies that profit from selling customer data, we put user privacy first. Doing this at scale requires investments. If the investors don’t own or control a company, their participation becomes merely about profit for them, and not about how this profit is obtained. With the investors we have, we are completely aligned on this - they are betting on the future where privacy is the norm. They do not dictate on anything related to our model. We build SimpleX chat, protocols and network the way Internet should have been built if we as developers always put the privacy and empowerment of users first.

+

Company jurisdiction

+ +

With regards to jurisdictions, nowhere is perfect. For that reason we plan to establish the foundations for protocol governance in various jurisdictions.

+

But we’d like to clarify some misconceptions about the UK, where SimpleX Chat Ltd. is registered, and the UK legislation.

+

For example, the Online Safety Act (OSA). Some people believe that it applies only to UK companies. But the OSA applicability isn’t determined by the company’s jurisdiction - it applies based on the nature and characteristics of the business and its services, as well as the number of its users in the UK. In case of SimpleX network, the OSA doesn’t apply for both of these reasons.

+

The UK’s position on communication encryption, and more specifically, on end-to-end encrypted messaging, remains the subject of political debates. But with the OSA, the legislative intent was to propose technical measures to block CSAM, and it was trying to explore ways to do this via client-side scanning, which of course would undermine the encryption. However, and thanks to the hard work of privacy experts, researchers, academics and rights organizations throughout the UK and the rest of the world, the Online Safety Bill did not prohibit end-to-end encrypted apps without such scanners. It is an open question whether such technology will ever be possible, and the UK government made a public commitment that client-side scanning won't be required until it is.

+

For now, strong end-to-end encryption remains permissible and protected, and we hope to also add to the privacy advocacy and debates as a UK-based company to keep it legally protected.

+

Overall, we view the UK as being better jurisdiction for privacy than many alternatives - there are some trade-offs everywhere.

+

Looking ahead

+

The future of the Internet should be based on decentralized infrastructure operated by commercially viable organizations. These operators need to possess minimal user data, so that users have genuine control over their identities, and free from lock-in by the operators, to support fair competition. This requires a drastic re-imagining of the current norms and newer, more privacy-minded protocols. All in all, private messaging is surrounded by very difficult challenges but it’s worth it to keep pushing the industry forward and not settle for the status quo and current trade offs, protocol limitations and vulnerabilities. The Internet deserves better standards, and so do users.

+
+
+ + + + + + + + diff --git a/blog/20240601-protecting-children-safety-requires-e2e-encryption.html b/blog/20240601-protecting-children-safety-requires-e2e-encryption.html new file mode 100644 index 0000000000..3cb1272e27 --- /dev/null +++ b/blog/20240601-protecting-children-safety-requires-e2e-encryption.html @@ -0,0 +1,548 @@ + + + + + + + + SimpleX blog: Protecting Children's Safety Requires End-to-End Encryption + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Protecting Children's Safety Requires End-to-End Encryption

+

As lawmakers grapple with the serious issue of child exploitation online, some proposed solutions would fuel the very problem they aim to solve. Despite expert warnings, the Belgian Presidency persists in pushing for the implementation of client-side scanning on encrypted messaging services, rebranding the effort as "upload moderation". Their latest proposal mandates that providers of private communication services obtain user consent for AI-based scanning of their private chats. If users do not consent, they will be prohibited from sharing images, videos, and URLs.

+

Privacy critics have long pushed for measures like centralized scanning of private photos and messaging data, arguing it could detect illicit content. However, invasive monitoring of private communications would create detrimental risks that far outweigh any perceived benefits.

+

Why we’re taking action

+

SimpleX Chat signed a joint statement about the dangers of the EU compromise proposal on EU CSAM because maintaining end-to-end encryption is crucial for protecting privacy and security for everyone, including and especially children.

+

We urge the Ministers in the Council of the EU to stand firm against any scanning proposals that undermine end-to-end encryption, which would enable mass surveillance and misuse by bad actors, whether framed as client-side scanning, upload moderation, or any other terminology. Compromising this basic principle opens the door to devastating privacy violations. We also urge any organizations or individuals reading this to write to their representatives and voice their concerns. European Digital Rights has outlined these issues in greater detail for anyone seeking more information.

+

Why compromising privacy endangers children

+

The core issue is that compromising encryption and privacy makes innocent people vulnerable to malicious hackers and criminals seeking to exploit users data. Centralized scanning systems become a tempting target, potentially exposing millions of private family photos when breached. This would easily open up avenues for blackmail, abuse, and victimization of children. A case in point is the recent criminal charges against Meta in New Mexico, which highlights how the tech giant's algorithms enabled child exploitation by encouraging connections between minors and sexual predators. Privacy-eroding initiatives like client-side scanning would play into the hands of malicious actors by making more sensitive information accessible and weaponized in the same way that it has been on Meta platforms.

+

What should be done

+

Rather than undermining privacy, to achieve child safety online users should be empowered with high standards for encryption and data control. For example, adopting a model where children (and users in general) cannot be discovered or approached on networks unless they or their parents permit it, similar to the SimpleX network privacy model. Intelligent multi-device synchronization could enable this oversight without compromising end-to-end encryption overall. It’s always possible to protect children without opening everyone, especially children themselves, to greater vulnerabilities due to such proposals.

+

However, some recent legislative efforts have bizarrely moved in the opposite direction by seeking to limit parental access. The chilling truth is that the least private platforms have been major enablers of child exploitation. Eroding privacy protections on other services will only aid criminals further, not protect children. Preserving strong encryption and user privacy must be the foundation for any credible effort to combat online child exploitation. Initiatives trading privacy for supposed safety are not just technically flawed, but would achieve the exact opposite of their stated intent. We must avoid being gaslighted by narratives that defy logic, and instead provide users with the highest possible standards for privacy protections as a core principle.

+

Protecting end-to-end encryption without carving out backdoors or vulnerabilities should be non-negotiable for children's and everyone’s safety. It is critical to redirect the discourse to focus on taking genuine privacy further by protecting against metadata hoarding and other means by which people’s data can be abused or subjected to surveillance.

+
+
+ + + + + + + + diff --git a/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html b/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html new file mode 100644 index 0000000000..8794c78cd9 --- /dev/null +++ b/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html @@ -0,0 +1,637 @@ + + + + + + + + SimpleX blog: SimpleX network: private message routing, v5.8 released with IP address protection and chat themes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: private message routing, v5.8 released with IP address protection and chat themes

+

Published: June 4, 2024

+

What's new in v5.8:

+ +

Also, we added Persian interface language to the Android and desktop apps, thanks to our users and Weblate.

+

Private message routing

+

What's the problem?

+ +

SimpleX network design has always been focussed on protecting user identity on the messaging protocol level - there is no user profile identifiers of any kind in the protocol design, not even random numbers or cryptographic keys.

+

Until this release though, SimpleX network had no built-in protection of user transport identities - IP addresses. As previously the users could only choose which messaging relays to use to receive messages, these relays could observe the IP addresses of the senders, and if these relays were controlled by the recipients, the recipients themselves could observe them too - either by modifying server code or simply by tracking all connecting IP addresses.

+

To work around this limitation, many users connected to SimpleX network relays via Tor or VPN - so that the recipients' relays could not observe IP addresses of the users when they send messages. Still, it was the most important and the most criticized limitation of SimpleX network for the users.

+

Why didn't we just embed Tor in the app?

+

Tor is the best transport overlay network in existence, and it provides network anonymity for millions of Internet users.

+

SimpleX Chat has many integration points with Tor:

+
    +
  • it allows dual server addresses, when the same messaging relay can be reached both via Tor and via clearnet.
  • +
  • it utilises Tor's SOCKS proxy "isolate-by-auth" feature to create a new Tor circuit for each user profile, and with an additional option - for each contact. Per-contact transport isolation is still experimental, as it doesn't work if you connect to groups with many members, and it's only available if you enable developer tools.
  • +
+

Many SimpleX network design ideas are borrowed from Tor network design:

+
    +
  • mitigation of MITM attack on client-server connection is done in the same way as Tor relays do it - the fingerprint of offline certificate is included in server address and validated by the client.
  • +
  • the private routing itself uses the approach similar to onion routing, by adding encryption layers on each hop.
  • +
  • we are also considering to implement Tor's Proof-of-work DoS defence mechanism.
  • +
+

So why didn't we just embed Tor into the messaging clients to provide IP address protection?

+

We believe that Tor may be the wrong solution for some users for one of the reasons:

+
    +
  • much higher latency, error rate and resource usage.
  • +
  • people who want to use Tor are better served by specialized apps, such as Orbot.
  • +
  • Tor usage is restricted in some networks, so it would require complex configuration in the app UI.
  • +
  • some countries have legislative restrictions on Tor usage, so embedding Tor would require supporting multiple app versions, and it would leave the original problem unsolved in these countries.
  • +
+

Also, while Tor solves the problem of IP address protection, it doesn't solve the problem of meta-data correlation by user's transport session. When the client connects to the messaging relays via Tor, the relays can still observe which messaging queues a user sends messages to via a single TCP connection. The client can mitigate it with per-contact transport isolation, but it uses too much traffic and battery for most users.

+

So we believed we would create more value to the users of SimpleX network with private message routing. This new message routing protocol provides IP address and transport session protection out of the box, once released. It can also be extended to support delayed delivery and other functions, improving both usability and transport privacy in the future.

+

At the same time, we plan to continue supporting Tor and other overlay networks. Any overlay network that supports SOCKS proxy with "isolate-by-auth" feature will work with SimpleX Chat app.

+

What is private message routing and how does it work?

+

Private message routing is a major milestone for SimpleX network evolution. It is a new message routing protocol that protects both users' IP addresses and transport sessions from the messaging relays chosen by their contacts. Private message routing is, effectively, a 2-hop onion routing protocol inspired by Tor design, but with one important difference - the first (forwarding) relay is always chosen by message sender and the second (destination) - by the message recipient. In this way, neither side of the conversation can observe IP address or transport session of another.

+

At the same time, the relays chosen by the sending clients to forward the messages cannot observe to which connections (messaging queues) the messages are sent, because of the additional layer of end-to-end encryption between the sender and the destination relay, similar to how onion routing works in Tor network, and also thanks to the protocol design that avoids any repeated or non-random identifiers associated with the messages, that would otherwise allow correlating the messages sent to different connections as sent by the same user. Each message forwarded to the destination relay is additionally encrypted with one-time ephemeral key, to be independent of messages sent to different connections.

+

The routing protocol also prevents the possibility of MITM attack by the forwarding relay, which provides the certificate the session keys of the destination server to the sending client that are cryptographically signed by the same certificate that is included in destination server address, so the client can verify that the messages are sent to the intended destination, and not intercepted.

+

The diagram below shows all the encryption layers used in private message routing:

+
-----------------             -----------------  -- TLS --  -----------------             -----------------
+|               |  -- TLS --  |               |  -- f2d --  |               |  -- TLS --  |               |
+|               |  -- s2d --  |               |  -- s2d --  |               |  -- d2r --  |               |
+|    Sending    |  -- e2e --  |    sender's   |  -- e2e --  |  recipient's  |  -- e2e --  |   Receiving   |
+|    client     |  message -> |  Forwarding   |  message -> |  Destination  |  message -> |    client     |
+|               |  -- e2e --  |     relay     |  -- e2e --  |     relay     |  -- e2e --  |               |
+|               |  -- s2d --  |               |  -- s2d --  |               |  -- d2r --  |               |
+|               |  -- TLS --  |               |  -- f2d --  |               |  -- TLS --  |               |
+-----------------             -----------------  -- TLS --  -----------------             -----------------
+
+

e2e - two end-to-end encryption layers between sending and receiving clients, one of which uses double ratchet algorithm. These encryption layers are present in the previous version of message routing protocol too.

+

s2d - encryption between the sending client and recipient's destination relay. This new encryption layer hides the message metadata (destination connection address and message notification flag) from the forwarding relay.

+

f2d - additional new encryption layer between forwarding and destination relays, protecting from traffic correlation in case TLS is compromised - there are no identifiers or cyphertext in common between incoming and outgoing traffic of both relays inside TLS connection.

+

d2r - additional encryption layer between destination relay and the recipient, also protecting from traffic correlation in case TLS is compromised.

+

TLS - TLS 1.3 transport encryption.

+

For private routing to work, both the forwardig and the destination relays should support the updated messaging protocol - it is supported from v5.8 of the messaging relays. It is already released to all relays preset in the app, and available as a self-hosted server. We updated the guide about how to host your own messaging relays.

+

Because many self-hosted relays did not upgrade yet, private routing is not enabled by default. To enable it, you can open Network & servers settings in the app and change the settings in Private message routing section. We recommend setting Private routing option to Unprotected (to use it only with unknown relays and when not connecting via Tor) and Allow downgrade to Yes (so messages can still be delivered to the messaging relays that didn't upgrade yet) or to When IP hidden (in which case the messages will fail to deliver to unknown relays that didn't upgrade yet unless you connect to them via Tor).
+See F.A.Q. section for answers about private message routing.

+

Read more about the technical design of the private message routing in this document and in the messaging protocol specification.

+

Server transparency

+ +

Even with very limited information available to the messaging relays, there are several things that would reduce users' privacy that a compromised relay can do.

+

We wrote previously that it is important that server operators commit to running unmodified server code or disclose any code modifications, and also disclose server ownership and any other relevant information.

+

While we cannot require the operators of self-hosted and private servers to disclose any information about them (apart from which server code they use - this is the requirement of the AGPLv3 license to share this information with users connecting to the server), as we add other server operators to the app, it is important for the users to have all important information about these operators and servers location.

+

This server release adds server information page where all this information can be made available to the users. For example, this is the information about one of the servers preset in the app.

+

The updated server guide also includes the instruction about how to host this page for your server. It is generated as a static page when the server starts. We recommend using Caddy webserver to serve it.

+

More new things in v5.8

+

Protect IP address when downloading files & media

+

This version added the protection of your IP address when receiving files from unknown file servers without Tor. Images and voice messages won't automatically download from unknown servers too until you tap them, and confirm that you trust the file server where they were uploaded.

+

Chat themes

+

+

In Android and desktop app you can now customize how the app looks by choosing wallpapers with one of the preset themes or choose your own image as a wallpaper.

+

But this feature is not only about customization - it allows to set different colors and wallpaper for different user profiles and even specific conversations. You can also choose different themes for different chat profiles.

+

In case you use different identities for different conversations, it helps avoiding mistakes.

+

Group improvements

+

This version adds additional group configuration options to allow sending images, files and media, and also SimpleX links only to group administrators and owners. So with this release group owners can have more control over content shared in the groups.

+

We also stopped unnecessary traffic caused by the members who became inactive without leaving the groups - it should substantially reduce traffic and battery consumption to the users who send messages in large groups.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Help us with donations

+

Huge thank you to everybody who donates to SimpleX Chat!

+

We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.

+

We are prioritizing users privacy and security - it would be impossible without your support.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20240704-future-of-privacy-enforcing-privacy-standards.html b/blog/20240704-future-of-privacy-enforcing-privacy-standards.html new file mode 100644 index 0000000000..1559cb58a0 --- /dev/null +++ b/blog/20240704-future-of-privacy-enforcing-privacy-standards.html @@ -0,0 +1,561 @@ + + + + + + + + SimpleX blog: The Future of Privacy: Enforcing Privacy Standards + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

The Future of Privacy: Enforcing Privacy Standards

+

Published: Jul 4, 2024

+

Recent anti-privacy legislations and proposals in Europe, the US and Australia threaten to infringe our fundamental right to privacy and to create grave risks to the safety of children and vulnerable people. It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a right users must constantly fight to protect, and not something that users can be asked to consent away as a condition of access to a service.

+

Tech giants are trying to normalize surveillance capitalism, often with little to no consequences globally. These companies are contributing to a growing ecosystem where opting out of invasive data hoarding practices is becoming increasingly challenging, if not outright impossible. We are being gaslit by the technology executives who try to justify profiteering from AI theft, from Microsoft claiming all our content is fair game for their exploitation to unethical startups like Perplexity turning the word “privacy” into a marketable farce.

+

The AI Hype’s Impact on Privacy

+

The exaggeration of AI’s actual capabilities and the continuous promotion of its “intelligence” is creating a rat race where tech companies and well-funded startups are evading accountability, as they eagerly collect and exploit more data than ever.

+

They're prioritizing AI development over user privacy and rights, setting a dangerous precedent for current and future online engagements. They've already normalized the use of AI to scan and analyze supposedly private communications - from emails to instant messages - repackaging this intrusion as "productivity tools”. Meanwhile, most consumers actually want more data privacy, not less, and are increasingly concerned by the lack of it.

+

The legal push towards “client-side scanning”, attacks on end-to-end encryption and the support for pro-surveillance legislation gives credibility to these highly intrusive practices that literally endanger lives. And we know that moral obligations mean nothing to corporations benefiting from these exploitative models, so we have to ensure that our demands for privacy are legally enforceable and non-negotiable.

+ +

We are encouraged to see more legal pressure on companies that exploit user data on a daily basis. For example, the European Center for Digital Rights’ (Noyb) complaints against Meta’s abuse of personal data to train their AI and, and the demands from the Norwegian Consumer Council to data protection authority to ensure that applicable laws are enforced against Meta considering there is “no way to remove personal data from AI models once Meta has begun the training”.

+

Noyb is taking a strong stance against other companies with similar exploitative models, including facial recognition surveillance tools often misused by law enforcement agencies. Consider supporting their ongoing efforts — we strongly believe legal action is one of the most effective means to hold these companies accountable for their persistent abuses, which are otherwise shielded by heavily funded self-serving lobby groups.

+ +

We must shift from a defensive stance to a proactive one by proposing privacy legislation that puts users in direct control of their private data.

+

This legislation should:

+
    +
  1. Establish non-negotiable provider duties for protecting user privacy, with hefty fines and consequences for service operators who do not comply.
  2. +
  3. Prevent providers from circumventing these duties through user consent clauses — it should be legally prohibited to ask for a consent to share user data or to use it for anything other than providing a service.
  4. +
  5. Prevent providers from asking for any more personal information from the users than technically necessary and legally required. For example, asking for a phone number as a condition of access to a service should be made illegal in most cases — it does not provide a sufficient security, exposes users' private information and allows simple aggregation of users' data across multiple services.
  6. +
  7. Create a strong legal framework that cannot be resisted or modified
  8. +
+

By codifying these principles into law, we can establish a strong technological framework that is built to create more value for end users, while protecting their privacy against data exploitation, criminal use and identity theft. We will continue the fight against illogical legislative proposals designed to normalize mass surveillance, but our efforts should equally gear towards creating and supporting new models and technological foundations that bring us far closer to the reality we urgently need.

+

Collective Action

+

There is great work being done by advocacy organizations, and service providers need to contribute to this fight as well by shifting the narrative and reclaiming the term “privacy” from the tech giants who co-opted and corrupted it. We must play a bigger role in supporting users in setting stronger boundaries, making demands, and refusing anything less than genuine privacy and data ownership, while getting comfortable with holding providers accountable for any violations.

+

Privacy should be seen as a fundamental obligation of technology providers, and legislators must actively enforce this expectation. The more consumers make this demand, the more pressure we put on anti-privacy lobbyists with rogue motives, the easier it will be to hold abusers accountable, and the more likely we can collectively ensure that a privacy-first web becomes a reality.

+

You can support privacy today by signing the petition prepared by Global Encryption Coalition in support of communication privacy. You can also write to your elected representatives, explaining them how data privacy and encrypted communications protect children safety and reduce crime.

+
+
+ + + + + + + + diff --git a/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html b/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html new file mode 100644 index 0000000000..c12ed89ac7 --- /dev/null +++ b/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html @@ -0,0 +1,697 @@ + + + + + + + + SimpleX blog: SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing.

+

Published: Aug 14, 2024

+

SimpleX Chat: vision and funding 2.0:

+
    +
  • The past: investment from Village Global.
  • +
  • The present: announcing the investment from Jack Dorsey and Asymmetric Capital Partners.
  • +
  • The future: faster development and the path to non-profit governance.
  • +
+

What's new in v6.0:

+ +

* New for iOS app.

+

** Android and desktop apps.

+

SimpleX Chat: vision and funding 2.0

+

The past: investment from Village Global

+

Last year we announced pre-seed funding from several angel investors and Village Global. Some of our users were very excited that we have funds to continue developing SimpleX network. But as some of Village Global LPs (Limited Partners) are the founders of very large technology companies, some of our users were worried about any negative influence this investment might have on the project.

+

Ben Casnocha, the founder and general partner of Village Global, commented on their investment:

+
+

I believe in SimpleX Chat vision and team’s ability to execute it. The growing number of Internet users who demand privacy of their data and contacts will make SimpleX Chat profitable, which is critically important for any sustainable organization.

+

We are fortunate to have LPs who founded many iconic Internet ventures. But they don’t have any influence on the 400+ companies we invested in. They are financial investors in our fund and exert no control or influence on any of the underlying portfolio companies.

+

What's more, we believe that founders should lead their ventures, as it yields better results – our investment in SimpleX Chat has no control provisions. We are happy to help, but we don’t control any decisions nor have a board seat. Evgeny runs the company independently.

+
+

Ben, thank you for believing in our vision – without it SimpleX Chat would simply not exist, as most other investors at the time did not believe that privacy could ever escape the niche of privacy enthusiasts – and we already see the first signs of it happening.

+

The present: announcing the investment from Jack Dorsey and Asymmetric

+

The Android app recently hit 100,000 downloads on Google Play Store, and our users naturally ask for improved reliability, privacy, security, better user experience and design – all at the same time, and as soon as possible. This requires more funding.

+

We are very happy to announce that we now have funds to move faster – we raised a $1.3 million pre-seed round led by Jack Dorsey, with participation of Asymmetric Capital Partners (ACP) VC fund.

+

When Jack discovered SimpleX Chat last year, he posted on Twitter:

+
+

Better than Signal? Looks promising.
+A few bugs and UX issues but great foundation. Love that it’s public domain.

+
+

And on Nostr:

+
+

A full day with @SimpleX Chat. Solid overall. TestFlight is not recommended. There are some scaling issues today. And not the most intuitive onboarding for everyone. Name still reminds everyone of herpes. All fixable. It’s fast and doesn’t require a phone number or email and I do believe people will eventually see the value of that. Finally, some competition for Signal, and in a permissionless way. And def a solid path so apps don’t have to build their own DM experiences.

+
+

Jack, we are super lucky to have your support and investment – thank you for believing in our ability to build a better messaging network! It is a hard work, and we’ve made a lot of progress since your note was written, and a lot of work is ongoing!

+

The ACP investment is strategically important – it is a fund that only invests in B2B startups, and SimpleX Chat currently is mostly used by individual users. Making a private communication network sustainable requires its adoption by businesses, and we already see a growing usage by the small teams.

+

Rob Biederman and Sam Clayman, the partners of ACP, commented:

+
+

We believe that SimpleX Chat network can grow into a de facto Internet standard for private and secure communications for both businesses and individual users, unifying instant and email-like messaging into a single product.

+

Emails no longer provide privacy and security that businesses require, particularly given the emerging threat of AI-led phishing and social engineering attacks. We look forward to SimpleX network providing a secure alternative.

+
+

I was lucky to have met Rob, Sam and the ACP team when I was presenting SimpleX Chat in London – thank you all for your support and believing that the future of communication requires a single product, both for businesses and individual users.

+

The future: faster development and the path to non-profit governance

+

Jack Dorsey and ACP support enable us to make huge product improvements, thanks to a bigger team, and provide us with medium-term funding to get to the next stage of product and business evolution. Like with Village Global, this is a financial investment, without control or board seat provisions – so the users can be certain that SimpleX remains true to our vision of privacy first communication network.

+

We already added two great engineers to the team and are about to hire a UX/UI designer.

+

Trail of Bits has just completed the protocols design security review and will be doing implementation security review in the end of the year. We will publish the first report soon.

+

This year we will launch group improvements that we presented in the live-stream last year. While the main problem explained in this video was solved with the current design, the issue of group scalability remains – to send a message to a group your client needs to send it to each member, creating substantial traffic.

+

We will also launch long-form email-like messaging over SimpleX network this year, together with optional short public addresses that show profile you are connecting to before the connection – this is important for any public users and businesses.

+

The last but not the least, we started the work with Heather Meeker, a great legal expert on intellectual property matters and one of the earliest advocates of the open-source software development in businesses, to setup open-source governance model, to some extent similar to how Matrix did it. We believe, and our investors agree, that it would both increase the company value and also create more value for the users community.

+

What's new in v6.0

+

v6.0 is one of our biggest releases ever, with a lot of focus on UX and stability improvements, and the new features the users asked for.

+

The private message routing we announced before is now enabled for all users by default – it protects users IP addresses and sessions from the destination servers.

+

New chat experience

+

Connect to your friends faster

+

This version includes messaging protocol improvements that reduce twice the number of messages required for two users to connect. Not only it means connecting faster and using less traffic, this change allows to start sending messages sooner, so you would see "connecting" in the list of the chats for a much shorter time than before.

+

It will be improved further in the next version: you will be able to send messages straight after using the invitation link, without waiting for your contact to be online.

+

New reachable interface

+ +

Like with the most innovative mobile browsers (e.g., Safari and Firefox), SimpleX Chat users now can use the app with one hand by moving the toolbar and search bar to the bottom of the screen, and ordering the chats with the most recent conversations in the bottom too, where they can be more easily reached on a mobile screen.

+

This layout is enabled by default, and you can disable it right from the list of chats when you install the new version if you prefer to use conventional UI.

+

Give it a try – our experience is that that after less than a day of using it, it starts feeling as the only right way. You can always toggle it in the Appearance settings.

+

Archive contacts to chat later

+

 

+

Now you have two new options when deleting a conversation:

+
    +
  • only delete conversation, and archive contact. We will add archiving conversation without clearing it in the next version, as some users of our beta version asked.
  • +
  • delete contact but keep the conversation.
  • +
+

Also, deleting a contact now requires double confirmation, so you are less likely to delete the contact accidentally. This deletion is irreversible, and the only way to re-connect would be using a new link.

+

New way to start chat

+ +

When you tap pencil button, you will see a large New message sheet, that adds new functions to the options you had before.

+

Old options:

+
    +
  • Add contact to create a new 1-time invitation link,
  • +
  • Scan / paste link: to use the link you received. It can be 1-time invitation, a public SimpleX address, or a link to join the group.
  • +
  • Create group
  • +
+

New options:

+
    +
  • Open archived chats.
  • +
  • Accept pending contact requests.
  • +
  • Connect to preset public addresses (we will add an option to add your own addresses here too).
  • +
  • Search for your contacts.
  • +
+

New chat themes

+

We released the new themes for Android and desktop apps in the previous version, and now they are available for iOS too.

+

You can set different themes for different chat profiles you have, and for different conversations – it can help avoid mistakes about which conversation you are in.

+

Also, these themes are compatible between platforms, so you can import the theme created on Android into iOS app and vice versa.

+

Moderate like a pro

+ +

As much as we disagree with the attacks on the freedom of speech on the society level – all people must be able to express their opinions – we also believe that the small community owners should have full control over which content is allowed and which is not. But as communities grow, bad actors begin to join in order to disrupt, subvert and troll the conversations. So, the moderation tools are critical for small public communities to thrive.

+

SimpleX Chat already has several moderation tools available for community owners:

+
    +
  • Moderate individual messages.
  • +
  • Set the default role of the new members to "observer" — they won't be able to send messages until you allow it. In addition to that, by enabling default messages for admins and owners only you can reach out to the new members and ask some questions before allowing to send messages.
  • +
  • Block messages of a member for yourself only.
  • +
  • Block a member for all other members — only admins and group owners can do that.
  • +
+

With this version you can now select multiple messages at once and delete or moderate them, depending on your role in the community. The current version limits the number of messages that can be deleted to 20 — this limit will be increased to 200 messages in the next version.

+

Also, this version makes profile images of the blocked members blurred, to prevent the abuse via inappropriate profile images.

+

Increase font size

+

Android and desktop apps now allow to increase font size inside the app, without changing the system settings. Desktop app also allows to zoom the whole screen — it can be helpful on some systems with a limited support of high density displays.

+

These settings can be changed via Appearance settings.

+

New media options

+

Play from the chat list

+ +

Now you can interact with the media directly from the list of the chats.

+

This is very convenient – when somebody sends you a voice message or a video, they can be played directly from the list of chats, without opening a conversation. Similarly, an image can be opened, a file can be saved, and the link with preview can be opened in the browser.

+

And, in some circumstances, this is also more private, as you can interact with the media, without opening the whole conversation.

+

We will add the option to return missed calls from the chat list in the next version.

+

Blur for better privacy

+

You can set all images and videos to blur in your app, and unblur them on tap (or on hover in desktop app). The blur level can be set in Privacy and security settings.

+

Share from other apps

+ +

Not much to brag about, as most iOS messaging apps allow it, and users expected it to be possible since the beginning.

+

But iOS makes it much harder to develop the capability to share into the app than Android, so it's only in this version you can share images, videos, files and links into SimpleX Chat from other apps.

+

Improved networking and reduced battery usage

+

This version includes the statistics of how your app communicates with all servers when sending and receiving messages and files. This information also includes the status of connection to all servers from which you receive messages — whether the connection is authorized to push messages from server to your device, and the share of these active connections.

+

Please note, that when you send a message to a group, your app has to send it to each member separately, so sent message statistics account for that — it may seem to be quite a large number if you actively participate in some large groups. Also, message counts not only include visible messages you receive and send, but also any service messages, reactions, message updates, message deletions, etc. — this is the correct reflection of how much traffic your app uses.

+

This information is only available to your device, we do NOT collect this information, even in the aggregate form.

+

While the main reason we added this information is to reduce traffic and battery usage, to be able to identify any cases of high traffic, this version already reduced a lot battery and traffic usage, as reported by several beta-version users.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

You might ask: Why do you need donations if you've just raised the investment?

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html b/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html new file mode 100644 index 0000000000..e5f4a1353d --- /dev/null +++ b/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html @@ -0,0 +1,644 @@ + + + + + + + + SimpleX blog: SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: security review of protocols design by Trail of Bits, v6.1 released with better calls and user experience.

+

Published: Oct 14, 2024

+

New security audit:

+ +

What's new in v6.1:

+ +

SimpleX cryptographic design review by Trail of Bits

+ +

It's been almost two years since Trail of Bits did the first security assessment of SimpleX Chat.

+

Since then SimpleX Chat grew a lot, both in the number of users and in its functionality. We added XFTP — a protocol for sending files, — and XRCP — the protocol for using a mobile app profile from a desktop app. Messaging protocols also evolved a lot, adding private message routing and quantum resistant encryption.

+

Trail of Bits reviewed the design of protocols used in SimpleX network and applications in July 2024. Even though there are no critical issues, we made some security improvements based on this report.

+

Trail of Bits is a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects. Its engineers reviewed the cryptographic design of the protocols used in SimpleX network and applications over a week:

+
    +
  • SimpleX Messaging Protocol (SMP), including a formal verification of currently used message queue negotiation protocol,
  • +
  • the SMP agent protocol,
  • +
  • the push notification system,
  • +
  • the file transfer protocol (XFTP),
  • +
  • the remote control protocol (XRCP),
  • +
  • and the chat protocol.
  • +
+

There are 3 medium and 1 low severity findings, all of which require a high difficulty attack to exploit — the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. Additionally, there are 3 informational findings.

+

3 of these issues are improved in v6.1, and the remaining issues are accepted. Below we are commenting on these findings in detail, and also on the released improvements.

+

The full cryptographic design review is available here.

+

We are very thankful to Trail of Bits and their engineers for their work identifying these issues and helping us make SimpleX Chat more secure.

+

Review findings, our comments and improvements

+

Protocols specifications (informational)

+

The review finding #1 is that the protocols specification is informal. We addressed reported inconsistencies, and we accept that we need to improve specification beyond verbose descriptions and ABNF syntax specification, and add algebraic notations and sequence diagrams. Having said that, the current specification correctly describes the implemented protocol, without any contradictions.

+

User-correlating attacks via introduced latency or via GET command of messaging protocol (medium and low severity)

+

These two findings #7 and #2 of the report relate to the attacks confirming that two known users communicate via observing their internet traffic.

+

The first attack is possible for a party that can introduce the latency in the network traffic. This attacker has to control some network node that passes the traffic of the sender — for example, it could be the sender's ISP, VPN provider, Tor entry node operator, the operator of the forwarding SMP server or a server hosting provider, etc. Such attacker can correlate delays in sender's traffic and the suspected recipient's traffic to confirm that they communicate.

+

The second attack relates to GET command used by iOS clients receiving notifications — depending on whether the server has the message, there will be a different number of packets sent, allowing the observer to determine if there was the message. While this comment is correct, in practice iOS clients only send GET commands when they receive notification, which also happens only when there is a message on the server, so in absolute majority of cases the number of packets will be the same.

+

These are not new findings — this type of attacks is covered in threat model: a passive adversary able to monitor a set of senders and recipients can perform traffic correlation attacks against senders and recipients and correlate senders and recipients within the monitored set, frustrated by the number of users on the servers.

+

As threat model states, this attack is more likely to be successful with the less busy servers, and also for the users with few connections.

+

The recommendation of the review is to add optional randomized latency to message delivery that would reduce the opportunities for traffic correlation attacks — we consider adding it in the future.

+

A compromised transport protocol allows more efficient correlation attacks (medium severity)

+

The finding #3 is about the incorrect statement in threat model for SMP and XFTP protocols: a passive adversary, able to monitor a set of senders and recipients, cannot, even in case of a compromised transport protocol perform traffic correlation attacks with any increase in efficiency over a non-compromised transport protocol.

+

For protocols prior to v6.1 it is only partially correct, as responses to the commands that create a messaging queue or a file chunk include the identifiers both for senders and for the recipients, so if any observers were to compromise transport protocol (TLS) and record these identifiers, then they were able to correlate message senders with the recipients (and file recipients with the file senders).

+

The solution to make this correlation impossible even in case of compromised TLS is to encrypt these identifiers, as proposed in the review, or, better, encrypt the whole transmission inside TLS.

+

However unlikely is TLS being compromised, we added additional transport encryption layer in SMP protocol, where it can be more important, and we are going to add the same layer of encryption in XFTP protocol later, where we amended the threat model.

+

XRCP protocol recommendations (informational)

+

XRCP protocol is used for connecting desktop and mobile. There are two findings in the review:

+
    +
  • SHA256 was used as a KDF in XRCP (#4).
  • +
  • there was no forward secrecy or break-in recovery between sessions (#5).
  • +
+

SHA256 is now replaced with SHA3-256, as was recommended by the internet draft about hybrid key agreement that XRCP uses.

+

Even though XRCP sessions are short lived, and usually the connection happens over local network, we added forward secrecy to XRCP sessions here and here — each request from desktop app to mobile app is now encrypted with a new key derived from chain ratchets. This improves security of this connection.

+

We believe that it is unnecessary to have in-session break-in recovery in XRCP protocol, as there is break-in recovery between the sessions.

+

Device compromise can be hidden in some scenarios (medium)

+

The finding #6 in the report is about an attacker who was not only able to break into the device and get a copy of the database, which would be mitigated by break-in recovery in double ratchet protocol, but also was able to modify the state of the app database and to substitute the addresses and cryptographic keys of the messaging queues used with some contact with other message queues that the attacker controls.

+

Even though this is a very hard attack, if successful, it would allow the attacker intercepting all messages with this contact.

+

Effectively, it is a man-in-the-middle attack, where an intermediary is inserted via the app database modification. Such attack can be mitigated by periodic verification of security codes. Although, the attacker who was able to modify the state of the device, could have also modified the app itself, making it show the same security code as the compromised contact has, thus avoiding detection.

+

We accept that such an attack is possible, and we don't believe there is any viable defense against the attacker who can modify the device state. We may consider adding the measures to validate the database integrity, but they may be ineffective in case the app and/or operating system are compromised.

+

Next: security audit in 2025

+

We are planning the implementation security assessment with Trail of Bits in the beginning of 2025. It will be a twice bigger assessment than we did in 2022 — it will cover both the core of the app and the handling of cryptographic secrets in the mobile applications.

+

What's new in v6.1

+

This release has many user experience and stability improvements.

+

Better calls

+ +

This release improves reliability and usability of the calls. Now you can enable the camera and share the screen from the desktop app even if the call started as a voice call. We've also fixed several issues that prevented calls from connecting.

+

This is a substantial change, and some issues may have been introduced - please report them.

+

We will be further improving the calls interface in the app in the next versions.

+

Better iOS notifications

+

iOS notifications were added more than 2 years ago, based on this system design. Until recently we made almost no improvements to them. As the number of iOS users is growing, their reliability is insufficient. In addition to that, once we started the work on improving them, we have found several important issues, one of which was introduced recently, when we improved the speed of creating new connections.

+

This release fixes many important issues with iOS notifications delivery in iOS app, improves app performance and reduces traffic required to manage notifications.

+

We also fixed several notification server issues, made change that almost completely prevents losing notifications when notification servers are restarted, and added real-time monitoring to diagnose any issues with iOS notifications delivery.

+

This work is not over – iOS notifications in a decentralized network are complex and require more work. We will be further improving both client apps and servers to make their delivery stable.

+

Better user experience

+

New conversation layout and customizable messages

+ +

Messages are now grouped when they are sent sequentially, with less than 60 seconds between them. We also made message shapes configurable, and separated the messages in different days. When you scroll conversation quickly, there will be a floating date indication, allowing to find messages faster.

+

Improved switching between user profiles

+

+

Another improvement relates to switching between chat profiles. Previously, when you added multiple chat profiles to the app, there were two problems:

+
    +
  • you had to tap twice to get to some important functions in the app,
  • +
  • anybody who could see your screen, could also see all your chat profiles.
  • +
+

We changed this design by making important functions available after tapping profile image once, and by only showing the previously used profile image to switch to it quickly, while switching to other profiles now requires scrolling to them or opening Your chat profiles screen.

+

You also can switch chat profile when creating a one-time invitation link.

+

Faster deletion, moderation and forwarding of messages

+ +

You now can forward multiple messages at once - up to 20. If you are forwarding messages with files or media, and they were not received, the app will offer you to download them, and it will also allow forwarding messages without files. These messages will be "packed" into the smallest number of sent messages as possible. If there are no images and messages are not too large, it will be just one sent message containing all forwarded messages.

+

The previous version allowed deleting and moderating multiple messages. As most users now upgraded the app, we increased the maximum number of messages that can be deleted or moderated to 200 messages - in most cases all these deletions will be packed into one sent message.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20241016-wired-attack-on-privacy.html b/blog/20241016-wired-attack-on-privacy.html new file mode 100644 index 0000000000..571d9deeb4 --- /dev/null +++ b/blog/20241016-wired-attack-on-privacy.html @@ -0,0 +1,556 @@ + + + + + + + + SimpleX blog: Wired’s Attack on Privacy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Wired’s Attack on Privacy

+

Published: Oct 16, 2024

+ +

The Wired article by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in privacy policy is biased and misleading. By cherry-picking information from the report by the Institute for Strategic Dialogue (ISD), Wired fails to mention that SimpleX network design prioritizes privacy in order to protect human rights defenders, journalists, and everyday users who value their privacy — many people feel safer using SimpleX than non-private apps, being protected from strangers contacting them.

+

Yes, privacy-focused SimpleX network offers encryption and anonymity — that’s the point. To paint this as problematic solely because of who may use such apps misses the broader, critical context.

+

SimpleX’s true strength lies in protection of users' metadata, which can reveal sensitive information about who is communicating, when, and how often. SimpleX protocols are designed to minimize metadata collection. For countless people, especially vulnerable groups, these features can be life-saving. Wired article ignores these essential protections, and overlooks the positive aspects of having such a unique design, as noted in the publication which they link to:

+
+

“SimpleX also has a significant advantage when it comes to protecting metadata — the information that can reveal who you’re talking to, when, and how often. SimpleX is designed with privacy at its core, minimizing the amount of metadata collected and ensuring that any temporary data necessary for functionality is not retained or linked to identifiable users.”

+
+

Both publications referenced by Wired also explore how SimpleX design actually hinders extremist groups from spreading propaganda or building large networks. SimpleX design restricts message visibility and file retention, making it far from ideal for those looking to coordinate large networks. Yet these important qualities are ignored by Wired in favor of fear-mongering about encryption — an argument we've seen before when apps like Signal faced similar treatment. Ironically, Wired just a month earlier encouraged its readers to adopt encrypted messaging apps, making its current stance even more contradictory.

+

The vilification of apps that offer critically important privacy, anonymity, and encryption must stop. That a small share of users may abuse these tools doesn’t justify broad criticism. Additionally, the lobbying for client-side scanning, which Wired’s article seems to indirectly endorse, is not only dangerous but goes against fundamental principles of free speech and personal security. We strongly oppose the use of private communications for any kind of monitoring, including AI training, which would undermine the very trust encryption is designed to build.

+

It’s alarming to see Wired not only criticize SimpleX for its strong privacy protections but also subtly blame the European Court of Human Rights for upholding basic human rights by rejecting laws that would force encrypted apps to scan and hand over private messages before encryption. Wired writes:

+
+

…European Court of Human Rights decision in February of this year ruled that forcing encrypted messaging apps to provide a backdoor to law enforcement was illegal. This decision undermined the EU’s controversial proposal that would potentially force encrypted messaging apps to scan all user content for identifiers of child sexual abuse material.

+
+

This commentary is both inappropriate and misguided — it plays into the hands of anti-privacy lobbyists attempting to criminalize access to private communications. Framing privacy and anonymity as tools for criminals ignores the reality that these protections are essential for millions of legitimate users, from activists to journalists, to ordinary citizens. Client-side scanning can't have any meaningful effect on reducing CSAM distribution, instead resulting in increase of crime and abuse when criminals get access to this data.

+

We need to correct this narrative. The real danger lies not in protecting communication, but in failing to do so. Privacy apps like SimpleX are crucial, not just for those resisting mass surveillance, but for everyone who values the right to communicate without fear of their conversations being monitored or misused. This is a right we must defend and incorporate into law, as we wrote before.

+

Wired could have stood on the right side of this battle and helped normalize the demand for privacy, genuinely protecting people from criminals and from the exploitation of the increasingly AI-enabled mass surveillance. Instead they chose the path of spreading fear and uncertainty of encrypted messaging and tools that enable privacy and anonymity.

+

Spreading misinformation about privacy and security undermines trust in the tools that protect us, making it easier to justify more invasive surveillance measures that chip away at our civil liberties.

+

Wired did not respond to our request for comment.

+
+
+ + + + + + + + diff --git a/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html b/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html new file mode 100644 index 0000000000..211302e10f --- /dev/null +++ b/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html @@ -0,0 +1,646 @@ + + + + + + + + SimpleX blog: Servers operated by Flux - true privacy and decentralization for all users + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Servers operated by Flux — true privacy and decentralization for all users

+

Published: Nov 25, 2024

+ +

Welcome, Flux – the new servers in v6.2-beta.1!

+ +

Flux is a decentralized cloud infrastructure that consists of user-operated nodes [1]. With this beta release all SimpleX Chat users can use pre-configured Flux servers to improve metadata privacy and decentralization.

+

We are very grateful to Daniel Keller, CEO and co-founder of Flux, for supporting SimpleX network, and betting on our vision of extreme decentralization of communication. Flux investing their infrastructure in our vision is a game changer for us and our users.

+

Download new mobile and desktop SimpleX apps from TestFlight (iOS), Play Store, our F-Droid repo or GitHub.

+

Read on to learn why it is important and how using several operators improves metadata privacy.

+

What's the problem?

+

SimpleX network is fully decentralized, without any central component or bootstrap nodes — you could use your own servers from day one. While there is no full list of SimpleX network servers, we see many hundreds of servers in public groups.

+

But a large number of SimpleX app users use the servers pre-configured in the app. Even though the app randomly chooses 4 servers in each connection to improve privacy and security, prior to v6.2 for these users the servers were operated by the same company — ourselves.

+

Our open-source code that we are legally bound to use doesn't provide any metadata that could be used to learn who connects to whom. But the privacy of users' connections still depends on us honouring our promises and privacy policy. Flux servers in the app improve that.

+

Using two operators improves connection privacy

+ +

To ensure that the users' metadata from different servers cannot be combined to discover who talks to whom, the servers in each connection have to be operated by different independent organizations.

+

Before this version the app was choosing servers randomly. Now, when both SimpleX Chat and Flux servers are enabled it will always choose servers of different operators in each connection to receive messages and for private message routing, increasing metadata privacy for all users.

+

Flux servers are configured as opt-in, and the privacy policy and conditions of use that apply to Flux servers are the same as for SimpleX Chat servers, to make it simple for the users.

+

To improve connection privacy by using Flux servers all you have to do is to enable Flux once the app offers it, or later, via Network & servers settings, and accept that the same conditions apply.

+ +

By default, if both Flux and SimpleX servers are enabled in this version, you will be using SimpleX Chat servers to receive messages, Flux servers to forward messages to SimpleX Chat servers, and the servers of both to forward messages to unknown servers. We will enable Flux to receive messages by default a bit later, or you can change it now via settings.

+

Any additional servers you add to app configuration are treated as belonging to another operator, so they will also be used to improve connection privacy, together with pre-configured servers, unless you disable them.

+

SimpleX decentralization compared with Matrix, Session and Tor

+

SimpleX network decentralization model is different from other decentralized networks in several important aspects.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Communication networkSimpleXMatrixSessionTor-based
Full decentralization---
No user profile identity---
Connection privacy-
Server operator transparency--
+

Full decentralization

+

Fully decentralized networks do not have a central component, bootstrap nodes or any global shared state, like in cryptocurrency/blockchain-based communication networks. The presence of any central component or shared state introduces an attack vector that undermines privacy and security of the network.

+

No user profile identity

+

User profile identities, even if it is only a random number or a long-term key, undermine privacy of users connections, because in some cases they may allow network operators, observers and users to find out who talks to whom.

+

Most communication networks rely on fixed user profile identities. It includes Matrix and communication networks with onion routing.

+

SimpleX network design avoids the need for profile identities or keys, while still allowing optional long-term addresses for users and groups for convenience. It protects users from being discovered and approached by malicious parties, and many family users chose to use SimpleX with children because of it.

+

Connection privacy

+

SimpleX network has private message routing (2-hop onion routing) — it prevents server operators from discovering who connects to whom via network traffic metadata. Onion routing used in Tor-based messengers and in Session also hides it. But because neither Tor nor Session users have knowledge about who operates servers, in some cases the clients may connect via the servers controlled by one entity, that may learn the IP addresses of both parties.

+

Statistically, if traffic metadata from 2% of onion network servers is available to an attacker, and the client chooses servers randomly, after about 1750 of such choices the probability of choosing attacker's servers as both entry and exit nodes, and connection privacy being compromised becomes over 50% [2].

+

Matrix network does not provide connection privacy, as not only user identity exists, it is tied to a specific server that knows all user connections and a part of user's contacts connections. What is worse, Element — the most widely used Matrix app — offers the servers of only one organization to create an account, resulting in some degree of network centralization.

+

Server operator transparency

+

Operator transparency means that network users know who operates the servers they use.

+

You may argue that when the operators are known, the servers data can be requested by the authorities. But such requests, in particular when multiple operators are used by all users, will follow a due legal process, and will not result in compromising the privacy of all users.

+

With Tor and Session networks such legal process becomes impossible, and some users may see it as advantage. But nothing prevents the attackers, both criminal and corporate- or state-funded, to compromise the privacy of Tor or Session users by running many servers, or by purchasing traffic metadata from the existing server owners — there are no legal conditions that prohibit server owners of these networks to share or sell traffic data.

+

Because of that, we see operator transparency in SimpleX network as a better trade-off for privacy of most users than operator anonymity provided by Session and Tor. You can see privacy of network participants as a zero sum game — for the end users to have it, server operators should be known.

+

What's next for SimpleX network decentralization

+

SimpleX network is designed for extreme decentralization — not only users are distributed across network operators, as happens with federated networks, but each conversation will be relying on servers of 4-6 independent operators, and these operators will be regularly and automatically changed in the near future.

+

We believe that the only viable commercial model is freemium — a small share of paying users, who have better service quality and additional features, sponsors free users. This model doesn't have downsides of exploitative "provide service, sell data" approaches, that technology monopolies practice, and it also doesn't have problems of cryptocurrency blockchains, that have shared and immutable state, and also have regulatory problems.

+

To provide this extreme decentralization with freemium model we will create the system of payments allowing server operators to receive money for infrastructure certificates that will be used with any other participating network operators without compromising privacy of the paying users. You can read about this model here. We will be writing more about it as this development progresses.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+

[1]: You can also to self-host your own SimpleX servers on Flux decentralized cloud.

+

[2]: The probability of connection being de-anonymized and the number of random server choices follow this equation: (1 - s ^ 2) ^ n = 1 - p, where s is the share of attacker-controlled servers in the network, n is the number of random choices of entry and exit nodes for the circuit, and p is the probability of both entry and exit nodes, and the connection privacy being compromised. Substituting 0.02 (2%) for s, 0.5 (50%) for p, and solving this equation for n we obtain that 1733 random circuits have 50% probability of privacy being compromised.

+

Also see this presentation about Tor, specifically the approximate calculations on page 76, and also Tor project post about the changes that made attack on hidden service anonymity harder, but still viable in case the it is used for a long time.

+
+
+ + + + + + + + diff --git a/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html b/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html new file mode 100644 index 0000000000..ac1847adc1 --- /dev/null +++ b/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html @@ -0,0 +1,601 @@ + + + + + + + + SimpleX blog: SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps

+

Published: Dec 10, 2024

+

What's new in v6.2:

+ +

What's new in v6.2

+

SimpleX Chat and Flux improve metadata privacy in SimpleX network

+

+

SimpleX Chat and Flux (Influx Technology Limited) made an agreement to include messaging and file servers operated by Flux into the app.

+

SimpleX network is decentralized by design, but in the users of the previous app versions had to find other servers online or host servers themselves to use any other servers than operated by us.

+

Now all users can choose between servers of two companies, use both of them, and continue using any other servers they host or available online.

+

To use Flux servers enable them when the app offers it, or at any point later via Network & servers settings in the app.

+

When both SimpleX Chat and Flux servers are enabled, the app will use servers of both operators in each connection to receive messages and for private message routing, increasing metadata privacy for all users.

+

Read more about why SimpleX network benefits from multiple operators in our previous post.

+

You can also read about our plan how network operators will make money, while continuing to protect users privacy, based on network design rather than on trust to operators, and without any cryptocurrency emission.

+

Business chats

+ +

We use SimpleX Chat to provide support to SimpleX Chat users, and we also see some other companies offering SimpleX Chat as a support channel.

+

One of the problem of providing support via general purpose messengers is that the customers don't see who they talk to, as they can in all dedicated support systems.

+

It is not possible in most messengers, including SimpleX Chat prior to v6.2 - every new customer joins a one-to-one conversation, where the customers see that they talk to a company, not knowing who they talk to, and if it's a bot or a human.

+

The new business chats in SimpleX Chat solve this problem: to use them enable the toggle under the contact address in your chat profile. It is safe to do, and you can always toggle it off, if needed - the address itself does not change.

+

Once you do it, the app will be creating a new business chat with each connecting customer where multiple people can participate. Business chat is a hybrid of one-to-one and group conversation. In the list of chats you will see customer names and avatars, and the customer will see your business name and avatar, like with one-to-one conversations. But inside it works as a group, allowing customer to see who sent the message, and allowing you to add other participants from the business side, for delegation and escalation of customer questions.

+

This can be done manually, or you can automate these conversations using bots that can answer some customer questions and then add a human to the conversation when appropriate or requested by the customer. We will be offering more bot-related features to the app and a simpler way to program bots very soon - watch our announcements.

+

Better user experience

+ +

Chat navigation

+

This has been a long-standing complaint from the users: why does the app opens conversations on the last message, and not on the first unread message?

+

Android and desktop apps now open the chat on the first unread message. It will soon be done in the iOS app too.

+

Also, the app can scroll to the replied message anywhere in the conversation (when you tap it), even if it was sent a very long time ago.

+

See who reacted!

+

This is a small but important change - you can now see who reacted to your messages!

+

Improving notifications in iOS app

+

iOS notifications in a decentralized network is a complex problem. We support iOS notifications from early versions of the app, focussing on preserving privacy as much as possible. But the reliability of notifications was not good enough.

+

We solved several problems of notification delivery in this release:

+
    +
  • messaging servers no longer lose notifications while notification servers are restarted.
  • +
  • Apple can drop notifications while your device is offline - about 15-20% of notifications are dropped because of it. The servers and the new version of the app work around this problem by delivering several last notifications, to show notifications correctly even when Apple drops them.
  • +
+

With these changes the iOS notifications remained as private and secure as before. The notifications only contain metadata, without the actual messages, and even the metadata is end-to-end encrypted between SimpleX notification servers and the client device, inaccessible to Apple push notification servers.

+

There are two remaining problems we will solve soon:

+
    +
  • iOS only allows to use 25mb of device memory when processing notifications in the background. This limit didn't change for many years, and it is challenging for decentralized design. If the app uses more memory, iOS kills it and the notification is not shown – approximately 10% of notifications can be lost because of that.
  • +
  • for notifications to work, the app communicates with the notification server. If the user puts the app in background too quickly, the app may fail to enable notification for the new contacts. We plan to change clients and servers to delegate this task to messaging servers, to remove the need for this additional communication entirely, without any impact on privacy and security. This will happen early next year.
  • +
+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html b/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html new file mode 100644 index 0000000000..957723d46c --- /dev/null +++ b/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html @@ -0,0 +1,570 @@ + + + + + + + + SimpleX blog: Oppose digital IDs – they break the law and lead to mass scale surveillance + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

Oppose digital IDs – they break the law and lead to mass scale surveillance

+

Published: Dec 18, 2024

+ +

Starting next year, the UK government plans to introduce digital ID cards for the young people to prove their age when visiting pubs. While officials claim this system will remain optional, it's part of a broader government initiative to move more state functions online so that people can prove their identity for everything from paying taxes to opening a bank account using the government-backed app. This will be a step toward a society where every pub visit, purchase, and social interaction becomes a permanent digital record linked to a government-issued ID – a step to normalizing mass surveillance at scale.

+

Digital IDs are promoted as a way to fight law violations, and some politicians support them as a way to tackle illegal immigration. But digital IDs themselves break the law. Article 8 of the European Convention of Human Rights says: “Everyone has the right to respect for his private and family life”. It means that not only our right to privacy is enshrined in the law, but the right to have our privacy respected is also part of the law. Asking to present a digital ID when visiting a pub, even if it is optional, disrespects our privacy, and is therefore illegal.

+

Digital IDs would not stop people who decide to break laws. Pubs already can refuse to serve alcohol to young people and require the ID in case the age is in doubt. And illegal immigration can also be reduced without any digital IDs. But introducing digital IDs and collecting our actions, names and locations in one government-controlled database will result in making this information easier to access for criminals, and being exploited for financial and identity crimes.

+

What starts as a "convenient option" is likely to end as a mandatory requirement. The digital ID systems being pushed by governments and corporations aren't about making our lives easier. They're about tracking, monitoring, and controlling every move we make. And we can see where this road leads in China, when IDs and social scores created for convenience are used to prevent access to basic services and bank accounts as a punishment for legal social media posts that the government disagrees with. What started as a convenience, is now trialed to track the duration of public toilet visits.

+

The United Kingdom is a democratic country, and the law protects our right to privacy and freedom of speech. If we accept digital IDs as something required for simple things, like buying a drink, it leaves the door wide open to a range of privacy violations.

+

We call on everyone to oppose the digital ID systems. Do not use them. Do not install these systems in your pub, for as long as it is not legally required. Support local businesses that don’t use them. Protect your privacy and freedom by using software that respects them. Demand that your privacy is respected, as required by law.

+

To make your voice heard, email your MP expressing your rejection of digital IDs as a violation of European Convention of Human Rights in three simple steps:

+
    +
  1. Copy the text below or click this link to copy it into email app:
  2. +
+

Dear …,

+

I object to the introduction of digital IDs in pubs or any other public places for these reasons:

+
    +
  1. It violates the European Convention of Human Rights, article 8: “Everyone has the right to respect for his private and family life” (https://fra.europa.eu/en/law-reference/european-convention-human-rights-article-8-0).
    +Asking to present digital IDs when proof of identity is not legally required, even if it is optional, disrespects our privacy, and is therefore illegal.
  2. +
  3. It will not be an effective measure in reducing the violations of the law. People who want to circumvent it, will find a way.
  4. +
  5. It will increase crime, because combining a large amount of private information in a single system increases the risks of this information becoming available to criminals, who will exploit it for financial crimes and identity theft.
  6. +
+

I kindly ask you to oppose this plan, both publicly and during any discussions in the UK Parliament.

+

Sincerely yours,
+

+
    +
  1. +

    Find the email address of your MP and copy it to the email.

    +
  2. +
  3. +

    Fill in the blanks, edit the text if needed, and send it!

    +
  4. +
+

Public opposition changed government decisions in many cases.

+

It is your opportunity to tell the government which country you want to live in — please use it!

+
+
+ + + + + + + + diff --git a/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html b/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html new file mode 100644 index 0000000000..bee7818efc --- /dev/null +++ b/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html @@ -0,0 +1,623 @@ + + + + + + + + SimpleX blog: SimpleX network: large groups and privacy-preserving content moderation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: large groups and privacy-preserving content moderation

+

Published: Jan 14, 2025

+ +

Many people believe that it is impossible to moderate and prevent abuse in end-to-end encrypted conversations. This belief is incorrect — there is a way to prevent abuse and distribution of illegal content without any compromises to users' privacy and security of end-to-end encryption.

+

Anti-privacy lobbyists use this incorrect belief to advocate for scanning of private communications, which not only would fail to prevent abuse, but would make it worse — because our private data will become available to criminals.

+

So it's very important to understand how privacy preserving content moderation works, and educate the politicians who you voted for, and who is currently in the office, that we do not need to compromise privacy and security in any way to substantially reduce online crime and abuse.

+

This post answers these questions:

+ +

Large groups on SimpleX network

+

When we designed groups, we expected them to be used primarily for small groups where people know each other, with not more than 100 or so members.

+

But we learnt that people want to participate in public discussions remaining anonymous — it protects their freedom of speech. As an experiment, we are curating a small directory of groups that currently has almost 400 public groups, with the largest ones having thousands of members. You can connect to this experimental directory via SimpleX chat address.

+

Can large groups scale?

+

Currently the groups are fully decentralized, and every time you send the message to some group your client has to send it to each group member, which is very costly for traffic and battery in large groups.

+

We are currently working on the new group architecture when dedicated group members that run their clients on the server or on desktop with good internet connection will re-broadcast messages to all members — these members are "super-peers".

+

We will be offering pre-configured super-peers via the app, and you will be able to use your own super-peers, in case you are hosting a large private group, and to have a better control and ownership of the group — e.g., if we decide to remove our super peer from the group, it will continue to function thanks to your super-peer re-broadcasting messages.

+

This new design improves both privacy of group participation and censorship resistance of the groups, and also makes abusing the group harder.

+

Preventing abuse with anonymous participation

+

All public discussions are abused by spammers and trolls, whether anonymous or not. We have been evolving ability of group owners to moderate conversations by allowing to remove inappropriate and off-topic messages, to block members who send spam, and to make all new members who join their group unable to send messages until approved.

+

As support for large groups improves, we expect that the attempts to abuse may increase too, unless we add better moderation capabilities in advance.

+

v6.3 will add ability of the group members to send reports to the group owners and administrators — the beta version we just released adds ability to manage these reports, so group admins won't miss reports when members start sending them.

+

Other features that we plan to add this year to improve both usability and safety of the groups:

+
    +
  • message comments — some groups may choose to allow only comments, when ability to send messages is restricted to group owners or admins.
  • +
  • ability to limit the maximum number of messages the members can send per day.
  • +
  • ability to pre-moderate messages before they can be seen by all members.
  • +
  • "knocking" — approving new members before they can join the group.
  • +
  • sub-groups — smaller conversations with the same members.
  • +
+

Preventing server abuse without compromising e2e encryption

+

Some categories of content may be prohibited by servers operators. An extreme case would be child sexual abuse materials (CSAM).

+

Many people believe that when conversation is end-to-end encrypted, the problem is unsolvable. This incorrect belief is used by unscrupulous lobbyists and politicians who attempt to mandate various types of content scanning under the guise of preventing CSAM distribution.

+

We wrote before about how such measures not only would fail to solve the problem, but would make it worse. If our private photos become available to service providers, they will eventually become available to criminals too, and will be used to abuse and exploit the users and their children.

+

An absolute majority of CSAM distributed online is publicly accessible. Many large tech companies failed to act on it and to remove CSAM from their services before it became an epidemic. We see it as a very important objective to eliminate the possibility to distribute CSAM from publicly accessible groups, even if it hurts network growth.

+

When we receive a user complaint about CSAM shared in any group, we remove the files and, in some cases, the links to join the group from our servers. Our approach to moderation preserves user privacy and security of end-to-end encryption.

+

How does it work? Let's go over the process step by step.

+
    +
  1. +

    A user discovered the link to join the group that distributes CSAM and sent a complaint to our support email address or via the app to SimpleX Chat team contact.

    +
  2. +
  3. +

    Once we received the link to join the group, we instruct our automated bot to join it. If the complaint is confirmed as valid, the bot sends the information about the files sent in this group to the servers that store these files.

    +
  4. +
  5. +

    Once the servers receive the file identifiers from the bot, they block the files.

    +
  6. +
+

File servers cannot look inside end-to-end encrypted files, and they don't even know file sizes — they are securely locked, and sent in chunks, across multiple servers. But if the bot that joined the group provides the address of the particular file, the server can delete this file. It doesn't allow the servers to access any other files.

+

In this way, the moderation is possible without any content scanning, and it preserves privacy and security of end-to-end encryption.

+

Privacy-preserving content moderation

+

Right now, when we act on user complaints, we delete uploaded files or the links to join the groups from our servers, and to the users it looks as if something stopped working.

+

We are currently rolling out the change to the servers that would mark these files and group links as blocked, so that users who try to download them or to join blocked groups can see that they were blocked for violating server operator conditions of use. This will improve transparency of moderation and reliability of the network.

+

Later this year we plan to do more than that — client-side restrictions on the clients that violated conditions of use by uploading prohibited content.

+

How would it work? When the client discovers that the uploaded file was blocked, it may, optionally, depending on the information in the blocking record, disable further uploads from the app to the servers of the operator that blocked the file. Also, when the client that tried to receive the file sees that the file is blocked, it may also refuse to receive further files from the same group member via the same servers.

+

In this way, the servers can restrict the future actions of the users who violate the conditions of use, while preserving privacy and security of the users and content – even of those users who violated the conditions.

+

We discussed this plan with the users, and we really appreciate their feedback. The current plan is quite different from our initial ideas, the users had a real impact. Users asked the questions below.

+

Can't users modify their clients code to circumvent these restrictions?

+

Yes, they can, but for this to work both sender and recipient would have to modify their clients. It's technically complex, so most users won't do it, and it is also hard to coordinate between users who don't know and don't trust each other.

+

So these measures would be effective, even though they can be in theory circumvented, as any restrictions can be.

+

Other services that identify users reduce abuse by blocking the user account. It is even easier to circumvent than changing the client code, and yet these measures reduce abuse.

+

Can't users use other servers?

+

Yes, they can. But in the same way as web browser is not responsible for the content you can access, SimpleX app should not restrict your communications with other servers based on blocking action from just one server.

+

That approach allows different server operators to have different content policies, depending on their jurisdiction and other factors. It also prevents the possibility of abuse by server operators.

+

Wouldn't these measures be abused?

+

With the proposed changes, server operators will only be able to prevent uploads to their own servers, which prevents any impact on other communications.

+

In the future we plan to increase the resilience to any server malfunction or abuse by using multiple different servers with each contact.

+

If servers were to apply any upload restrictions unreasonably, the users would simply stop using them.

+

At the same time, server operators need to have technical means to protect their servers from users' abuse, and the proposed client-side restrictions achieve it.

+

What additional measures are considered?

+

We published other technical ideas that could be used to prevent distribution of illegal content in this document. None of these measures compromise users' privacy or end-to-end encryption, and they can (and should) only be applied to publicly accessible content that other users complained about.

+

We technically cannot, and we won't scan all content. We actively campaign against any content-scanning proposals, because it violates our right to privacy, and it would result in huge increase of online crime.

+

The belief that it is impossible to moderate conversations when they are e2e encrypted is incorrect. It is possible when users themselves share conversation contents with server operators, in which case the operators can identify and, if necessary, remove this content. It is also possible to moderate conversations that users made publicly accessible.

+

Send us comments and questions

+

Let us know any comments and feedback to the proposed measures. This is still an evolving design, and it won't be implemented until later this year.

+

Your comments will help to find the right balance between users' and server operators' requirements.

+

Privacy and security improvements we plan this year

+

To increase privacy and security we plan to add this year:

+
    +
  • quantum-resistant e2e encryption in small groups.
  • +
  • receiving proxy for files, to protect users IP addresses and other transport metadata from file senders' servers.
  • +
+

We see privacy and security as necessary for online safety, and prevention of abuse. If you don't already use SimpleX network, try it now, and let us know what you need to make it better.

+
+
+ + + + + + + + diff --git a/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html b/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html new file mode 100644 index 0000000000..5cde90373e --- /dev/null +++ b/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html @@ -0,0 +1,637 @@ + + + + + + + + SimpleX blog: SimpleX Chat v6.3: new user experience and safety in public groups + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v6.3: new user experience and safety in public groups

+

Published: Mar 8, 2025

+

What's new in v6.3:

+ +

Also, we added Catalan interface language to Android and desktop apps, thanks to our users and Weblate.

+

The last but not the least - server builds are now reproducible.

+

What's new in v6.3

+

Preventing spam and abuse in public groups

+

We wrote before: as the network grows, it becomes more attractive to attackers. This release adds several features that reduce the possibility of attacks and abuse.

+

Spam in groups that are listed in our group directory

+

There is no built-in group discovery in SimpleX Chat apps. Instead, we offer an experimental chat bot that allows to submit and to discover public groups. Not so long ago, spammers started sending messages via bots attempting to disrupt these groups.

+

We released several changes to the groups directory to protect from spam attacks.

+

Optional captcha verification

+ +

Group owners can enable the requirement to pass captcha challenge before joining the group. Captcha is generated in the directory bot itself, without any 3rd party servers, and is sent to the joining member. The new member must reply with the text in the image to be accepted to the group. While not a perfect protection, this basic measure complicates programming automatic bots to join public groups. It also provides a foundation to implement "knocking" - a conversation with dedicated group admins prior to joining the group. We plan to release support for knocking in March.

+

Profanity filter for member names

+

While group settings support giving all joining member an "observer" role - that is, without the right to send messages - the attackers tried spaming groups by joining and leaving. We added an optional filter for member names that group owners can enable for groups listed in directory - if a member name contains profanity, they will be rejected. Further improvements will be released in March as well.

+

The current SimpleX directory chatbot is a hybrid of future chat relays (a.k.a. super-peers) we are now developing to support large groups, and of a directory service that will be embedded in the app UI later this year, allowing to search and to discover public groups. Anybody is able to run their own directory bots now, and there will be possibility to use third party directories via the app UI in the future too.

+

Read more about SimpleX group directory, how to submit your groups, and which groups we now accept. Currently we accept groups related to a limited list of topics that will be expanded once we have better moderation functionality for the groups.

+

More power to group owners and moderators

+

This release includes two new features to help group moderators.

+ +

Private reports

+

Group members can privately bring to group moderators attention specific messages and members, even if the group does not allow direct messages. The simply need to choose report in the message context menu and choose the report reason. This report will be visible to all group owners and moderators, but not to other members.

+

Group moderators can see all member reports in a separate view, and quickly find the problematic messages, making moderation much easier in public groups. These reports are private to groups, they are not sent to server operators.

+

Please note: in the groups listed in our directory, the directory bot acts as admin, so it will receive all reports as well.

+

Acting on multiple members at once

+

When attackers come, they often use multiple profiles. This version allows selecting multiple members at once and perform these actions on all selected members:

+
    +
  • switch members role between "observer" and "member".
  • +
  • block and unblock members - this is a "shadow" block, so when you block multiple members who you believe are attackers, their messages will be blocked for all other members but not for them.
  • +
  • remove members from the group.
  • +
+

The next version will also allow to remove members together with all messages they sent - for example, if a spam bot joined and sent a lot of spam, but nothing of value.

+

Group improvements

+

Mention other members and get notified when mentioned

+ +

This feature allows you to mention other members in the group in the usual way - type @ character, and choose the member you want to mention from the menu. Even that there is no user accounts and persistent identities we made it work by referencing members by their random group ID that is also used for replies and all other interactions in the group.

+

You can also now switch message notifications in the group to "mentions only" mode. You will be notified only when you are mentioned in a message, or when somebody replies to your message. Simply choose "Mute" in the context menu of the group in the list of chats to switch group notifications to "mentions only" mode. After that you can choose "Mute all" to disable all notifications, including mentions.

+

Better group performance

+

Send messages faster

+

We didn't reduce the required network traffic to send messages to large groups yet - your client still has to send message to each member individually. But we redesigned the process of sending a message, reducing temporary storage required to schedule the message for delivery by about 100x. This creates a significant storage saving - e.g, to send one message to a group of 1,000 members previously required ~20Mb, and now it is reduced to ~200kb. It also reduces the time and battery used to send a message.

+

Faster group deletion

+

When you leave the group, the app preserves a copy of all your communications in the group. You can choose to keep it or to delete it completely. This final group deletion was very slow prior to this release - depending on the number of groups on your device it could sometimes take several minutes.

+

This release solved this problem – the time it takes to delete the group is reduced to seconds, and even in cases when the app is terminated half-way, it either rolls back or completes, but it cannot leave the group in a partially deleted state. It improves both user experience and privacy, as gives you better control over your data.

+

Better chat navigation

+

Organize chats into lists

+ +

It is a common feature in many messengers – it helps organizing your conversations.

+

The lists also show a blue mark when any chat in the list has new messages.

+

There are several preset lists: contacts, groups, private notes, business chats, favourite chats and also groups with member reports - the last list is automatically shown if members of any groups where you are the moderator or the owner sent private reports, until these reports are acted on or archived.

+

Jump to found and forwarded messages

+

This version allows to quickly navigate from message in the search results to the point in the conversation when it was sent.

+

You can also navigate from the forwarded message (or from the message saved to private notes) to the original message in the chat where it was forwarded or saved from.

+

Privacy and security improvements

+

Set message retention period in chats

+

Before this version, you could enable message retention period for all chats in your profile. While helpful in some cases, many of us have conversations that we want to keep for a long time, and some other conversations that we want to remove quicker.

+

This version allows it - you can set different retention periods in different conversations. It can be 1 day, 1 week, 1 month or 1 year. We may allow custom retention time in the future.

+

Private media file names

+

Previously there were scenarios when original media file names were preserved - e.g., when sending a video file or when forwarding any media file. The latter problem was worse, as media file name is generated automatically, and includes timestamp. So the same name could have been used to correlate files between conversations, as one of our users pointed out.

+

This version fixes this problem - media file name is now changed when forwarding it to match the time of forwarding, so no additional metadata is revealed.

+

Please also note:

+
    +
  • the apps remove metadata from all static images,
  • +
  • iOS app removes metadata from videos, but android and desktop apps do not do it yet,
  • +
  • animated images are sent as is,
  • +
  • other file types are sent as is, and their names are left unchanged - we believe that for ordinary files their name is part of their content.
  • +
+

We plan further improvements to reduce metadata in files in the near future – please let us know what you believe is the most important to reduce first.

+

Reproducible server builds

+

Starting from v6.3 server releases are reproducible!

+

Why it is important

+

With reproducible builds anybody can build servers from our code following the same process, and the build would produce identical binaries.

+

This also allows us to sign releases, as we reproduce GitHub builds ourselves and by signing them we attest that our builds resulted in identical binaries.

+

How to reproduce builds

+

You can reproduce our builds on Linux with x86 CPU in docker container - please follow the instructions here.

+

We are looking for support from open-source contributors or security researchers who would also reproduce and sign our releases.

+

How to verify release signature

+

Please see the instructions here.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html b/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html new file mode 100644 index 0000000000..a5fdef02e5 --- /dev/null +++ b/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html @@ -0,0 +1,669 @@ + + + + + + + + SimpleX blog: SimpleX network: new experience of connecting with people &mdash; available in SimpleX Chat v6.4-beta.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4

+

Published: Jul 3, 2025

+

The mission of communication network is connecting people [1]. The process of connecting in SimpleX network is really secure — it is protected from server MITM attacks. But before this beta version connecting to contacts had a really bad user experience.

+

What was the problem?

+

How did it work before:

+
    +
  1. Your contact created a large link (1-time invitation or contact address [2]) and shared with you via another messenger, email, social profile or website. Sharing the link "out-of-band" (i.e., not via the server) is necessary for security. But it was not working well in some cases:
  2. +
+
    +
  • the link was incorrectly changed by some applications, e.g. Telegram, because of link complexity, preventing people from connecting.
  • +
  • some people were worried that the link "looks like malware".
  • +
  • the QR code for the link was large, and sometimes difficult to scan.
  • +
  • the link did not fit the size limit in social media profiles.
  • +
+
    +
  1. Once you received the link, you used it in the app. But when using the link you could not see who you were connecting to. The only choice you had is to share your current profile or to use incognito profile. And as people didn't know which profile will be shared with them, many were choosing to share incognito profile, making recognizing contacts more complex — you don't know who is who unless you attach aliases to incognito contacts.
  2. +
  3. Once you tap Connect, all you see is the line in the list of chats that said "Connecting via link". The process of connection required your contact to be online, and in some cases to approve the request, so you may had contact in "connecting" state for a really long time.
  4. +
+

So it is not surprising that a large number of people failed connecting to friends — either they refused to engage because of large and scary looking links, or their application made the link unusable, or they abandoned the process at step 3, deciding that the app is not working correctly.

+

Why can't we just use usernames?

+

Many people asked — why don't you just use usernames or a link shortener for some really short links, as other networks and apps do.

+

The problem is that usernames or very short links make e2e encryption security of your chats dependent on the servers. Unless the link you share contains enough randomness in it and is cryptographically linked to the encryption keys, the servers can substitute the e2e encryption keys and read all your communication without you knowing it. We see this risk as unacceptable.

+

Mitigation against this "man-in-the-middle" attack by the server [3] is offered by Signal and other apps via security code verification [4], when you compare the numeric code in your app with your contact's app, but:

+
    +
  • most people do not verify security codes, and even if they do, they do not re-verify them every time security code changes, so their security is dependent on the server not being compromised, which is not a great security,
  • +
  • the servers can still compromise the initial messages, where profile names are exchanged, before you had the chance to verify the security codes.
  • +
+

When we design communication protocols for SimpleX network we always aim to protect you from the attack via your network operators — this is what sets SimpleX network design apart from many other communication networks and platforms.

+

Even though you choose the servers that you trust, and they are bound by privacy policy, and we follow the best security practices to protect servers from any 3rd party attacks, there is still a possibility that servers may be compromised by some attackers, and unless your communications are not protected from the servers, they are not protected from whoever can compromise the servers [5].

+

What is the new way to make connections?

+

Before diving into the details of technology, let's walk though the new process of connecting to people that is introduced in v6.4-beta.4.

+ +
    +
  1. As before, to connect you or your contact need to create a 1-time invitation or a contact address link. All the past problems of the long links are now solved:
  2. +
+
    +
  • this link is correctly processed by all applications, as it has a simple structure,
  • +
  • it is short and simple, e.g. the SimpleX Chat team address for support is: https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw
  • +
  • the QR code is now much smaller, fits a standard business card, and is easy to scan from all devices,
  • +
  • it fits in most social media profiles.
  • +
+

While the link is short, it still contains 256 bits of key material with additional 192 bits of server-generated link ID for one-time invitation links, so the connection is as secure as before, and in case of one-time invitations it became more secure (see below).

+

+
    +
  1. +

    As before, you have to use this link in the app, either by pasting the link or scanning QR code. But now you instantly see the name of your contact or group you are connecting to, and from v6.4.1 that will be released this July you will also see a profile image (currently disabled for backward compatibility).

    +
  2. +
  3. +

    Once you tap "Open new chat", the app will instantly open a conversation with your contact. As you now can see which profile is shared with you via the link, you can choose which of your profiles to use to connect. If your contact shared an incognito pseudonym, then you may also choose to connect incognito. But if your contact shared a real name, you may want to share your real name as well, making it easier for your contact to recognize you — the law of reciprocity in action! In any case, your and your contact's profile names are inaccessible to messaging servers — they are e2e encrypted.

    +
  4. +
+

If you are connecting via a contact address you can also add a message to your request, making it more likely to be accepted when connecting to somebody you don't know well. And from v6.4.1 contact addresses can include a welcome message that you would see before connecting, right in the conversation. This way, you effectively become connected to your contact and start a secure conversation even before you tap "Connect" button.

+

If you are connecting via a one-time invitation link, all you need to do is to tap "Connect", and then you can send messages straight after that, without waiting for your contact to be online — they will be securely received later.

+

This new experience of connecting is very similar to commonly used messengers, but it protects your security. We hope that it will be much easier for the new users to connect to their friends.

+

What about security?

+

We took a great care to design the protocol extension for the new experience of connecting in a way that not only preserves security at the same level as before, but also increases security of connecting via one-time invitation links.

+

First, because all the keys are now included in encrypted link data on the server, and not in the link itself as before, we can include the keys for post-quantum (PQ) key exchange and make the first message sent via one-time link (your profile) encrypted with PQ e2e encryption. Previously, PQ encryption started only after the response from your contact.

+

Second, whoever can observe the link is not able to determine which public keys are used in key exchange and what messaging queue address is used, and this data is removed from the server once the connection is established. Previously, the invitation link contained public keys and the actual queue address that could have been used for a long time, unless you rotated it.

+

Third, if somebody retrieves the associated data of one-time invitation link they observed in transit, this link would become inaccessible for the intended recipient, so the recipient would know that the connection was potentially compromised, and would alert the contact that sent the link.

+

How does it work?

+

In short, a new short link references a container with the encrypted data on the server that contains:

+
    +
  • the original full link that now include quantum-resistant keys that previously were not included because of their size,
  • +
  • contact's or group's profile and conversation preferences, from v6.4.1 it will include profile images,
  • +
  • also, it will include an optional contact's or group's welcome message from v6.4.1.
  • +
+

Making user profile and welcome message included in the encrypted link data allows to start conversation as soon as you scan the link, as described in the previous section.

+

Design objectives and cryptographic primitives that achieve them

+

This section is not a formal specification of the protocol, but an informal technical explanation of objectives we had for this design and how they were achieved. The technical details are available in this RFC document.

+
    +
  1. Encrypted link data cannot be accessed by the server.
  2. +
+

It means that while the client apps should use the link to derive both the link ID for the server and decryption key for the associated link data, the server should not be able to derive the link and decryption key from the link ID that it knows, and can't access the link data.

+

This objective is achieved by using secret_box encryption of link data with the symmetric key derived from link URI, which is different from link ID known to the server. As it is a symmetric encryption, it is secure against quantum computers.

+
    +
  1. Allow changing encrypted link data without changing the link itself.
  2. +
+

This is necessary to allow changes in user profile, chat preferences and welcome messages.

+

This is possible via a specific server request that allows to change user-defined part of the link data to the link owner. Because the link is derived from fixed part of the link data, the link itself remains the same.

+
    +
  1. Prevent MITM attack on the link data by the server, even if the server obtained the link.
  2. +
+

It means that the server should not be able to replace the associated link data even if it somehow obtained the link and can decrypt the data.

+

This objective is achieved by deriving encryption key from the hash of the fixed part of the link data — if server changes the link data, it would be rejected by the client, as its hash won't match the link. Server also cannot replace the user-defined part of the link data, because it is signed and will be verified with the key included in the fixed part of link data.

+

Clients use HKDF for key derivation, SHA3-256 to compute hash of the fixed part of link data, and ED25519 signature to sign user-defined link data.

+
    +
  1. Prevent undetectably accessing encrypted link data of one-time links.
  2. +
+

This is explained in the previous section — if link observers retrieve the link data, the link will become inaccessible for the intended recipient.

+

This objective is achieved because the link data of 1-time invitation link data can only be accessed with the server request that locks queue on the first access. Any subsequent access to the queue must uses the same authorization key (ED25519).

+
    +
  1. The link owner cannot include address of another queue in the link.
  2. +
+

It means that the link cannot redirect the connecting party to another server or to another queue on the same server — the apps would reject the links that attempt to do it. While allowing redirects may be seen as higher security from the server, it would open the possibility of resource exhaustion attacks, as the server would not know if the links were actually used to connect or not, and when the link data can be removed. So we decided that preventing redirects is a better tradeoff. This cryptographically enforced association between link and queue allows to remove link data from the server once the connection is established, or once some time passes (e.g., 3 weeks for unused one-time invitation links).

+

This objective is achieved by including queue ID and link data into the same server response.

+
    +
  1. Prevent link owner from being able to change the queue address and encryption keys in the link.
  2. +
+

This quality prevents the MITM attack on e2e encryption via break-in attack on the client of the link owner.

+

The server does not provide any API to change the fixed part of the link data. Also, changing fixed data would require changing the link, as otherwise the hash of the data won't match the link.

+
    +
  1. It should be impossible to check the existence of a messaging queue for one-time invitation links.
  2. +
+

It means that any 3rd party that observed 1-time invitation link (e.g., by reading the message in the messenger or email where it was sent) must not be able to undetectably confirm whether this messaging queue still exists, by attempting to create another queue with the same link ID and the same link data.

+

This objective is achieved by servers requiring that sender ID is derived (using SHA3-384) from request correlation ID, so an arbitrary sender ID cannot be used, and by generating link ID on the server — for 1-time invitation link, the link ID is included in the link in addition to link key, and is not derived from the link data.

+

See the detailed threat model for protocol extension supporting the new user experience of making connections.

+

Let us know what you think!

+

We worked really hard to deliver this big change — the simplicity of user experience required to hide a lot of complexity under the hood. We really hope that it will help you to bring more of your friends to SimpleX network and to benefit from using secure communications.

+

The stable versions v6.4 and v6.4.1 will be released this July, but you can already use the beta version available via Play Store (Android), Test Flight (iOS) and GitHub (Android and desktop).

+

Big thank you to everybody who uses SimpleX network, even though the experience of connecting to people was complex before this release.

+

With your help, SimpleX network should be able to get over the million active users now!

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+

[1]: An interesting case study is the rise and fall of Nokia as the dominant supplier of mobile phones. The slogan "Connecting people" was created in 1992 by Ove Strandberg, an intern at Nokia, and as it was adopted as the core mission of the company, we saw it rise as the world's main mobile phone supplier. The fall of Nokia is usually attributed on iPhone success. But it may also be attributed to internal cultural changes, with Nokia's communications chief leaving in early 2000s, and Nokia failure to understand how the definition of "Connecting people" should evolve with time.

+

[2]: One-time invitation can only be used once by the person you gave it too. Once your contact scans the one-time link, nobody else can connect to you via this link. Contact address can be used by multiple people, and even if you later delete the address, everybody who connected to you will remain connected. You can read more about the differences between one-time invitation links and contact addresses here.

+

[3]: Read more about how man-in-the-middle attack works in our post about e2e encryption properties. It also has the comparison of e2e encryption security in different messengers.

+

[4]: SimpleX apps also allow security code verification, but it protects against different attack — the link substitution by the channel you use to pass it, not from the attacks by the servers — SimpleX servers cannot compromise e2e encryption.

+

[5]: That is also why "securely scanning users' communications", also known as "Chat Control" is impossible — what communication operator can access, cyber-criminals will also access, and instead of reducing crime it would expose users to more crime.

+
+
+ + + + + + + + diff --git a/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html b/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html new file mode 100644 index 0000000000..22a2a438ca --- /dev/null +++ b/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html @@ -0,0 +1,626 @@ + + + + + + + + SimpleX blog: SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ < Back to list +
+ +
+

SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more.

+

Published: Jul 29, 2025

+

What's new in v6.4.1:

+ +

Also, we added 3 new interface languages to Android and desktop apps: Indonesian, Romanian and Vietnamese.

+

Huge thanks to our users who contributed translations.

+

What's new in v6.4.1

+

Welcome your contacts: the new experience of making connections

+

+

The new simple way to connect to your friends is fully available in this version.

+

We received many compliments from our users who started using it in beta versions and in v6.4 about how it simplifies connecting with friends. We agree - this is the biggest UX revolution since the app was released.

+

Instead of connecting blindly, and waiting until your contact is online, as it was before, you can now see profile and welcome message of the person you connect to, before you connect.

+

When you tap Open new chat you can decide which profile to use to connect or if you want to connect incognito, and in some cases you can include a message with your connection request.

+

This way, the conversation with your friends starts even before they connect to you!

+

For previously created SimpleX addresses and group links you have an option to upgrade. The links will become short, and will include profile information into link data. Old long links will continue to work, so you won't lose any contacts or members during the upgrade.

+

These links are now short enough to be shared in your social media profiles - they are less than 80 characters.

+

And as before, it is as secure - servers cannot see you profiles, unless they have the link, and cannot modify them even if they somehow get the link. You can read more about security property and other technical details in our post about SimpleX protocols extension supporting this new user experience.

+

Thank you for bringing your friends to SimpleX network!

+

Protect your groups

+

+

Review new members

+

Since v6.4 there are some major improvements in your ability to protect your group from spam and abuse.

+

You can enable an option to review all new group members. It is also commonly called "knocking". It allows you to:

+
    +
  • ask prospective members any questions,
  • +
  • explain the group rules,
  • +
  • make sure their profile is appropriate for the group,
  • +
  • decide whether to allow them joining the group, and whether they should be able to send messages in the group.
  • +
+

Some small groups may enable member review permanently, while larger public groups may enable it temporarily during spam/troll attacks.

+

New role for group moderators

+

In addition to that, there is a new group role - moderator.

+

This role allows:

+
    +
  • to approve members in review,
  • +
  • moderate messages,
  • +
  • block members for all.
  • +
+

Unlike admins, moderators can't add new members or permanently remove members from the group. This allows you to delegate group moderation to your community members without risking that they may disrupt the group.

+

Receive direct feedback from group members

+

Your group members now can send messages to group admins. Each conversation with a group member is a mini-group where all group owners, admins and moderators can talk to a member. Reports that members can send since v6.3 are also added to chat with member, allowing you to discuss the report.

+

Other improvements

+

Enable disappearing messages for new contacts

+

Now you can enable disappearing messages for all new contacts automatically. Tap your profile image in the corner, then tap Chat preferences and set time for messages to disappear.

+

Improved message delivery

+

We improved networking layer by increasing request timeouts for all background requests. It substantially reduces traffic on slow networks.

+

Improved app integrity

+

Supply chain security

+

The app security depends on security of its components and its build process, and many of these components are created by third parties. In this version we improved the build process to control the upgrades of these components:

+
    +
  • all 3rd party GitHub actions used during the build are now moved to the forks we control - it prevents supply chain attacks via build actions.
  • +
  • we now build VLC library for all platforms from the source code ourselves, in this repository.
  • +
  • SQLCipher and Haskell dependencies versions were already "locked" prior to this version.
  • +
+

Automatic virus scanning

+

We now run automatic daily virus scanning of all apps released via GitHub using VirusTotal.com.

+

You can see the scan results here.

+

Reproducible builds

+

In addition to server builds that were reproducible since v6.3, the builds of Linux CLI and desktop apps are now reproducible too. You can build Linux apps from source using this script.

+

Please note: Linux package upgrades may change the build.

+

Stable builds of Linux apps are now independently reproduced and signed by our and Flux teams - it verifies the integrity of GitHub builds.

+

Huge thanks to Flux for doing that and for providing their servers via the app.

+

SimpleX network

+

Some links to answer the most common questions:

+

How can SimpleX deliver messages without user identifiers.

+

What are the risks to have identifiers assigned to the users.

+

Technical details and limitations.

+

Frequently asked questions.

+

Please also see our website.

+

Please support us with your donations

+

Huge thank you to everybody who donated to SimpleX Chat!

+

Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.

+

Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.

+

Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.

+

Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.

+

See this section for the ways to donate.

+

Thank you,

+

Evgeny

+

SimpleX Chat founder

+
+
+ + + + + + + + diff --git a/blog/images/20220511-images-files.png b/blog/images/20220511-images-files.png new file mode 100644 index 0000000000..1fdecbc28c Binary files /dev/null and b/blog/images/20220511-images-files.png differ diff --git a/blog/images/20220524-clear-chat1.png b/blog/images/20220524-clear-chat1.png new file mode 100644 index 0000000000..0527610db6 Binary files /dev/null and b/blog/images/20220524-clear-chat1.png differ diff --git a/blog/images/20220524-clear-chat2.png b/blog/images/20220524-clear-chat2.png new file mode 100644 index 0000000000..661083cd76 Binary files /dev/null and b/blog/images/20220524-clear-chat2.png differ diff --git a/blog/images/20220604-privacy-settings.png b/blog/images/20220604-privacy-settings.png new file mode 100644 index 0000000000..b784a1dbc0 Binary files /dev/null and b/blog/images/20220604-privacy-settings.png differ diff --git a/blog/images/20220711-call-in-progress.png b/blog/images/20220711-call-in-progress.png new file mode 100644 index 0000000000..68f592ef85 Binary files /dev/null and b/blog/images/20220711-call-in-progress.png differ diff --git a/blog/images/20220711-call.png b/blog/images/20220711-call.png new file mode 100644 index 0000000000..35cd201b0d Binary files /dev/null and b/blog/images/20220711-call.png differ diff --git a/blog/images/20220711-database-chat-stopped.png b/blog/images/20220711-database-chat-stopped.png new file mode 100644 index 0000000000..76b0bc3740 Binary files /dev/null and b/blog/images/20220711-database-chat-stopped.png differ diff --git a/blog/images/20220711-notifications.png b/blog/images/20220711-notifications.png new file mode 100644 index 0000000000..8e19e92974 Binary files /dev/null and b/blog/images/20220711-notifications.png differ diff --git a/blog/images/20220723-group-accept.png b/blog/images/20220723-group-accept.png new file mode 100644 index 0000000000..8f175216f3 Binary files /dev/null and b/blog/images/20220723-group-accept.png differ diff --git a/blog/images/20220723-group-invite.png b/blog/images/20220723-group-invite.png new file mode 100644 index 0000000000..12dfa669b4 Binary files /dev/null and b/blog/images/20220723-group-invite.png differ diff --git a/blog/images/20220723-group-leave.png b/blog/images/20220723-group-leave.png new file mode 100644 index 0000000000..5d8d3e4ffd Binary files /dev/null and b/blog/images/20220723-group-leave.png differ diff --git a/blog/images/20220723-tor.jpg b/blog/images/20220723-tor.jpg new file mode 100644 index 0000000000..c63d6985bc Binary files /dev/null and b/blog/images/20220723-tor.jpg differ diff --git a/blog/images/20220808-group1.png b/blog/images/20220808-group1.png new file mode 100644 index 0000000000..5c89387a09 Binary files /dev/null and b/blog/images/20220808-group1.png differ diff --git a/blog/images/20220808-group2.png b/blog/images/20220808-group2.png new file mode 100644 index 0000000000..0fa4b2ac05 Binary files /dev/null and b/blog/images/20220808-group2.png differ diff --git a/blog/images/20220808-group3.png b/blog/images/20220808-group3.png new file mode 100644 index 0000000000..0081b2f925 Binary files /dev/null and b/blog/images/20220808-group3.png differ diff --git a/blog/images/20220808-icons.png b/blog/images/20220808-icons.png new file mode 100644 index 0000000000..e8f2baced8 Binary files /dev/null and b/blog/images/20220808-icons.png differ diff --git a/blog/images/20220808-network.png b/blog/images/20220808-network.png new file mode 100644 index 0000000000..26661bcc96 Binary files /dev/null and b/blog/images/20220808-network.png differ diff --git a/blog/images/20220808-tor1.png b/blog/images/20220808-tor1.png new file mode 100644 index 0000000000..09eb9faf89 Binary files /dev/null and b/blog/images/20220808-tor1.png differ diff --git a/blog/images/20220808-tor2.png b/blog/images/20220808-tor2.png new file mode 100644 index 0000000000..e94c857dbf Binary files /dev/null and b/blog/images/20220808-tor2.png differ diff --git a/blog/images/20220901-incognito1.png b/blog/images/20220901-incognito1.png new file mode 100644 index 0000000000..38a62000a2 Binary files /dev/null and b/blog/images/20220901-incognito1.png differ diff --git a/blog/images/20220901-incognito2.png b/blog/images/20220901-incognito2.png new file mode 100644 index 0000000000..73a9e7dc4f Binary files /dev/null and b/blog/images/20220901-incognito2.png differ diff --git a/blog/images/20220901-incognito3.png b/blog/images/20220901-incognito3.png new file mode 100644 index 0000000000..9b4bf97b70 Binary files /dev/null and b/blog/images/20220901-incognito3.png differ diff --git a/blog/images/20220901-onion1.png b/blog/images/20220901-onion1.png new file mode 100644 index 0000000000..e16cc74174 Binary files /dev/null and b/blog/images/20220901-onion1.png differ diff --git a/blog/images/20220901-onion2.png b/blog/images/20220901-onion2.png new file mode 100644 index 0000000000..5cedd2fe67 Binary files /dev/null and b/blog/images/20220901-onion2.png differ diff --git a/blog/images/20220928-files-media.png b/blog/images/20220928-files-media.png new file mode 100644 index 0000000000..03d349b7b7 Binary files /dev/null and b/blog/images/20220928-files-media.png differ diff --git a/blog/images/20220928-ice-servers.png b/blog/images/20220928-ice-servers.png new file mode 100644 index 0000000000..c63a8f3f1e Binary files /dev/null and b/blog/images/20220928-ice-servers.png differ diff --git a/blog/images/20220928-passphrase.png b/blog/images/20220928-passphrase.png new file mode 100644 index 0000000000..161bfb8b39 Binary files /dev/null and b/blog/images/20220928-passphrase.png differ diff --git a/blog/images/20221108-address1.png b/blog/images/20221108-address1.png new file mode 100644 index 0000000000..1b37ebe128 Binary files /dev/null and b/blog/images/20221108-address1.png differ diff --git a/blog/images/20221108-address2.png b/blog/images/20221108-address2.png new file mode 100644 index 0000000000..2bb47f5219 Binary files /dev/null and b/blog/images/20221108-address2.png differ diff --git a/blog/images/20221108-faster-images.png b/blog/images/20221108-faster-images.png new file mode 100644 index 0000000000..46d13b3189 Binary files /dev/null and b/blog/images/20221108-faster-images.png differ diff --git a/blog/images/20221108-group1.png b/blog/images/20221108-group1.png new file mode 100644 index 0000000000..208b7249f6 Binary files /dev/null and b/blog/images/20221108-group1.png differ diff --git a/blog/images/20221108-group2.png b/blog/images/20221108-group2.png new file mode 100644 index 0000000000..1006bc6d7d Binary files /dev/null and b/blog/images/20221108-group2.png differ diff --git a/blog/images/20221108-switch-address.png b/blog/images/20221108-switch-address.png new file mode 100644 index 0000000000..198fc52b7f Binary files /dev/null and b/blog/images/20221108-switch-address.png differ diff --git a/blog/images/20221108-trail-of-bits.jpg b/blog/images/20221108-trail-of-bits.jpg new file mode 100644 index 0000000000..fd63008086 Binary files /dev/null and b/blog/images/20221108-trail-of-bits.jpg differ diff --git a/blog/images/20221108-trail-of-bits.png b/blog/images/20221108-trail-of-bits.png new file mode 100644 index 0000000000..5b8b80c572 Binary files /dev/null and b/blog/images/20221108-trail-of-bits.png differ diff --git a/blog/images/20221206-deleted1.png b/blog/images/20221206-deleted1.png new file mode 100644 index 0000000000..938ea3e285 Binary files /dev/null and b/blog/images/20221206-deleted1.png differ diff --git a/blog/images/20221206-deleted2.png b/blog/images/20221206-deleted2.png new file mode 100644 index 0000000000..aa0f0a6239 Binary files /dev/null and b/blog/images/20221206-deleted2.png differ diff --git a/blog/images/20221206-protect.png b/blog/images/20221206-protect.png new file mode 100644 index 0000000000..141460c36a Binary files /dev/null and b/blog/images/20221206-protect.png differ diff --git a/blog/images/20221206-server1.png b/blog/images/20221206-server1.png new file mode 100644 index 0000000000..701fa502ab Binary files /dev/null and b/blog/images/20221206-server1.png differ diff --git a/blog/images/20221206-server2.png b/blog/images/20221206-server2.png new file mode 100644 index 0000000000..7a7a3d7279 Binary files /dev/null and b/blog/images/20221206-server2.png differ diff --git a/blog/images/20221206-server3.png b/blog/images/20221206-server3.png new file mode 100644 index 0000000000..4793f99f1a Binary files /dev/null and b/blog/images/20221206-server3.png differ diff --git a/blog/images/20221206-voice.png b/blog/images/20221206-voice.png new file mode 100644 index 0000000000..ca165222df Binary files /dev/null and b/blog/images/20221206-voice.png differ diff --git a/blog/images/20230103-disappearing1.png b/blog/images/20230103-disappearing1.png new file mode 100644 index 0000000000..c97047a6b4 Binary files /dev/null and b/blog/images/20230103-disappearing1.png differ diff --git a/blog/images/20230103-disappearing2.png b/blog/images/20230103-disappearing2.png new file mode 100644 index 0000000000..20e79c57d9 Binary files /dev/null and b/blog/images/20230103-disappearing2.png differ diff --git a/blog/images/20230103-live.png b/blog/images/20230103-live.png new file mode 100644 index 0000000000..38aee73b6d Binary files /dev/null and b/blog/images/20230103-live.png differ diff --git a/blog/images/20230103-stickers1.png b/blog/images/20230103-stickers1.png new file mode 100644 index 0000000000..735cee8518 Binary files /dev/null and b/blog/images/20230103-stickers1.png differ diff --git a/blog/images/20230103-stickers2.png b/blog/images/20230103-stickers2.png new file mode 100644 index 0000000000..4479a0c9be Binary files /dev/null and b/blog/images/20230103-stickers2.png differ diff --git a/blog/images/20230103-verification.png b/blog/images/20230103-verification.png new file mode 100644 index 0000000000..8c45d7b014 Binary files /dev/null and b/blog/images/20230103-verification.png differ diff --git a/blog/images/20230204-draft1.png b/blog/images/20230204-draft1.png new file mode 100644 index 0000000000..411c96646e Binary files /dev/null and b/blog/images/20230204-draft1.png differ diff --git a/blog/images/20230204-draft2.png b/blog/images/20230204-draft2.png new file mode 100644 index 0000000000..d05f87aa2e Binary files /dev/null and b/blog/images/20230204-draft2.png differ diff --git a/blog/images/20230204-profiles1.png b/blog/images/20230204-profiles1.png new file mode 100644 index 0000000000..560780a301 Binary files /dev/null and b/blog/images/20230204-profiles1.png differ diff --git a/blog/images/20230204-profiles2.png b/blog/images/20230204-profiles2.png new file mode 100644 index 0000000000..008d3cb34d Binary files /dev/null and b/blog/images/20230204-profiles2.png differ diff --git a/blog/images/20230204-transport.png b/blog/images/20230204-transport.png new file mode 100644 index 0000000000..8db3d968af Binary files /dev/null and b/blog/images/20230204-transport.png differ diff --git a/blog/images/20230301-xftp.jpg b/blog/images/20230301-xftp.jpg new file mode 100644 index 0000000000..cd3758328c Binary files /dev/null and b/blog/images/20230301-xftp.jpg differ diff --git a/blog/images/20230328-call1.png b/blog/images/20230328-call1.png new file mode 100644 index 0000000000..51a6fcd174 Binary files /dev/null and b/blog/images/20230328-call1.png differ diff --git a/blog/images/20230328-call2.png b/blog/images/20230328-call2.png new file mode 100644 index 0000000000..ef2fef9791 Binary files /dev/null and b/blog/images/20230328-call2.png differ diff --git a/blog/images/20230328-hidden-profiles1.png b/blog/images/20230328-hidden-profiles1.png new file mode 100644 index 0000000000..4121598650 Binary files /dev/null and b/blog/images/20230328-hidden-profiles1.png differ diff --git a/blog/images/20230328-hidden-profiles2.png b/blog/images/20230328-hidden-profiles2.png new file mode 100644 index 0000000000..cd10d435c1 Binary files /dev/null and b/blog/images/20230328-hidden-profiles2.png differ diff --git a/blog/images/20230328-hidden-profiles3.png b/blog/images/20230328-hidden-profiles3.png new file mode 100644 index 0000000000..1fe36d1d4e Binary files /dev/null and b/blog/images/20230328-hidden-profiles3.png differ diff --git a/blog/images/20230422-passcode1.png b/blog/images/20230422-passcode1.png new file mode 100644 index 0000000000..73760959e8 Binary files /dev/null and b/blog/images/20230422-passcode1.png differ diff --git a/blog/images/20230422-passcode2.png b/blog/images/20230422-passcode2.png new file mode 100644 index 0000000000..b427cee444 Binary files /dev/null and b/blog/images/20230422-passcode2.png differ diff --git a/blog/images/20230422-socks.png b/blog/images/20230422-socks.png new file mode 100644 index 0000000000..2115c8b042 Binary files /dev/null and b/blog/images/20230422-socks.png differ diff --git a/blog/images/20230422-video.png b/blog/images/20230422-video.png new file mode 100644 index 0000000000..3327613ca0 Binary files /dev/null and b/blog/images/20230422-video.png differ diff --git a/blog/images/20230523-disappearing1.png b/blog/images/20230523-disappearing1.png new file mode 100644 index 0000000000..a335cd9171 Binary files /dev/null and b/blog/images/20230523-disappearing1.png differ diff --git a/blog/images/20230523-disappearing2.png b/blog/images/20230523-disappearing2.png new file mode 100644 index 0000000000..70544846fc Binary files /dev/null and b/blog/images/20230523-disappearing2.png differ diff --git a/blog/images/20230523-info.png b/blog/images/20230523-info.png new file mode 100644 index 0000000000..da6f0a3e7d Binary files /dev/null and b/blog/images/20230523-info.png differ diff --git a/blog/images/20230523-reactions.png b/blog/images/20230523-reactions.png new file mode 100644 index 0000000000..fe180f9d8a Binary files /dev/null and b/blog/images/20230523-reactions.png differ diff --git a/blog/images/20230523-self-destruct.png b/blog/images/20230523-self-destruct.png new file mode 100644 index 0000000000..5dddb2a733 Binary files /dev/null and b/blog/images/20230523-self-destruct.png differ diff --git a/blog/images/20230523-theme.png b/blog/images/20230523-theme.png new file mode 100644 index 0000000000..341125e7c8 Binary files /dev/null and b/blog/images/20230523-theme.png differ diff --git a/blog/images/20230523-voice.png b/blog/images/20230523-voice.png new file mode 100644 index 0000000000..e8c4a946a0 Binary files /dev/null and b/blog/images/20230523-voice.png differ diff --git a/blog/images/20230722-filter.png b/blog/images/20230722-filter.png new file mode 100644 index 0000000000..5845c7eb3b Binary files /dev/null and b/blog/images/20230722-filter.png differ diff --git a/blog/images/20230722-quoted.png b/blog/images/20230722-quoted.png new file mode 100644 index 0000000000..d812d43691 Binary files /dev/null and b/blog/images/20230722-quoted.png differ diff --git a/blog/images/20230722-receipts-full.png b/blog/images/20230722-receipts-full.png new file mode 100644 index 0000000000..f1eb2be35f Binary files /dev/null and b/blog/images/20230722-receipts-full.png differ diff --git a/blog/images/20230722-receipts.png b/blog/images/20230722-receipts.png new file mode 100644 index 0000000000..536216e3d0 Binary files /dev/null and b/blog/images/20230722-receipts.png differ diff --git a/blog/images/20230722-search.png b/blog/images/20230722-search.png new file mode 100755 index 0000000000..605d8cf51a Binary files /dev/null and b/blog/images/20230722-search.png differ diff --git a/blog/images/20230925-directory.png b/blog/images/20230925-directory.png new file mode 100644 index 0000000000..d5a2f26683 Binary files /dev/null and b/blog/images/20230925-directory.png differ diff --git a/blog/images/20230925-encrypted.png b/blog/images/20230925-encrypted.png new file mode 100644 index 0000000000..0c482264bc Binary files /dev/null and b/blog/images/20230925-encrypted.png differ diff --git a/blog/images/20230925-incognito.png b/blog/images/20230925-incognito.png new file mode 100644 index 0000000000..949f36e747 Binary files /dev/null and b/blog/images/20230925-incognito.png differ diff --git a/blog/images/20231125-block.png b/blog/images/20231125-block.png new file mode 100644 index 0000000000..1928b7a6fd Binary files /dev/null and b/blog/images/20231125-block.png differ diff --git a/blog/images/20231125-desktop1.png b/blog/images/20231125-desktop1.png new file mode 100644 index 0000000000..bfbf975216 Binary files /dev/null and b/blog/images/20231125-desktop1.png differ diff --git a/blog/images/20231125-desktop2.png b/blog/images/20231125-desktop2.png new file mode 100644 index 0000000000..cd7df13a9d Binary files /dev/null and b/blog/images/20231125-desktop2.png differ diff --git a/blog/images/20231125-desktop3.png b/blog/images/20231125-desktop3.png new file mode 100644 index 0000000000..2005983415 Binary files /dev/null and b/blog/images/20231125-desktop3.png differ diff --git a/blog/images/20231125-desktop4.png b/blog/images/20231125-desktop4.png new file mode 100644 index 0000000000..ef0f7d6606 Binary files /dev/null and b/blog/images/20231125-desktop4.png differ diff --git a/blog/images/20231125-group1.png b/blog/images/20231125-group1.png new file mode 100644 index 0000000000..e9c67dce99 Binary files /dev/null and b/blog/images/20231125-group1.png differ diff --git a/blog/images/20231125-group2.png b/blog/images/20231125-group2.png new file mode 100644 index 0000000000..740c9a49a8 Binary files /dev/null and b/blog/images/20231125-group2.png differ diff --git a/blog/images/20231125-mobile1.png b/blog/images/20231125-mobile1.png new file mode 100644 index 0000000000..8b9be68616 Binary files /dev/null and b/blog/images/20231125-mobile1.png differ diff --git a/blog/images/20231125-mobile1a.png b/blog/images/20231125-mobile1a.png new file mode 100644 index 0000000000..a68a11e0e6 Binary files /dev/null and b/blog/images/20231125-mobile1a.png differ diff --git a/blog/images/20231125-mobile2.png b/blog/images/20231125-mobile2.png new file mode 100644 index 0000000000..fdbf3331e4 Binary files /dev/null and b/blog/images/20231125-mobile2.png differ diff --git a/blog/images/20231125-mobile3.png b/blog/images/20231125-mobile3.png new file mode 100644 index 0000000000..9a88413940 Binary files /dev/null and b/blog/images/20231125-mobile3.png differ diff --git a/blog/images/20231125-mobile4.png b/blog/images/20231125-mobile4.png new file mode 100644 index 0000000000..5ae2253ed2 Binary files /dev/null and b/blog/images/20231125-mobile4.png differ diff --git a/blog/images/20240124-connect1.png b/blog/images/20240124-connect1.png new file mode 100644 index 0000000000..9b5a3cd1ff Binary files /dev/null and b/blog/images/20240124-connect1.png differ diff --git a/blog/images/20240124-connect2.png b/blog/images/20240124-connect2.png new file mode 100644 index 0000000000..fda81efb20 Binary files /dev/null and b/blog/images/20240124-connect2.png differ diff --git a/blog/images/20240124-history1.png b/blog/images/20240124-history1.png new file mode 100644 index 0000000000..fbba77b5fa Binary files /dev/null and b/blog/images/20240124-history1.png differ diff --git a/blog/images/20240124-history2.png b/blog/images/20240124-history2.png new file mode 100644 index 0000000000..a54992bb48 Binary files /dev/null and b/blog/images/20240124-history2.png differ diff --git a/blog/images/20240124-notes1.png b/blog/images/20240124-notes1.png new file mode 100644 index 0000000000..4c253b4704 Binary files /dev/null and b/blog/images/20240124-notes1.png differ diff --git a/blog/images/20240124-notes2.png b/blog/images/20240124-notes2.png new file mode 100644 index 0000000000..82c6b18eb5 Binary files /dev/null and b/blog/images/20240124-notes2.png differ diff --git a/blog/images/20240314-comparison.jpg b/blog/images/20240314-comparison.jpg new file mode 100644 index 0000000000..815922aa7a Binary files /dev/null and b/blog/images/20240314-comparison.jpg differ diff --git a/blog/images/20240314-datacenter.jpg b/blog/images/20240314-datacenter.jpg new file mode 100644 index 0000000000..9bb55c47c2 Binary files /dev/null and b/blog/images/20240314-datacenter.jpg differ diff --git a/blog/images/20240314-djb.jpg b/blog/images/20240314-djb.jpg new file mode 100644 index 0000000000..33551ec365 Binary files /dev/null and b/blog/images/20240314-djb.jpg differ diff --git a/blog/images/20240314-kem.jpg b/blog/images/20240314-kem.jpg new file mode 100644 index 0000000000..97d6ffdb4f Binary files /dev/null and b/blog/images/20240314-kem.jpg differ diff --git a/blog/images/20240314-mitm1.jpg b/blog/images/20240314-mitm1.jpg new file mode 100644 index 0000000000..b82e6534bb Binary files /dev/null and b/blog/images/20240314-mitm1.jpg differ diff --git a/blog/images/20240314-mitm2.jpg b/blog/images/20240314-mitm2.jpg new file mode 100644 index 0000000000..24132f21ab Binary files /dev/null and b/blog/images/20240314-mitm2.jpg differ diff --git a/blog/images/20240314-mitm3.jpg b/blog/images/20240314-mitm3.jpg new file mode 100644 index 0000000000..a20b37765a Binary files /dev/null and b/blog/images/20240314-mitm3.jpg differ diff --git a/blog/images/20240314-mitm4.jpg b/blog/images/20240314-mitm4.jpg new file mode 100644 index 0000000000..44a3a322a1 Binary files /dev/null and b/blog/images/20240314-mitm4.jpg differ diff --git a/blog/images/20240314-pq1.png b/blog/images/20240314-pq1.png new file mode 100644 index 0000000000..f3b88f943e Binary files /dev/null and b/blog/images/20240314-pq1.png differ diff --git a/blog/images/20240314-pq2.png b/blog/images/20240314-pq2.png new file mode 100644 index 0000000000..73d3dbde42 Binary files /dev/null and b/blog/images/20240314-pq2.png differ diff --git a/blog/images/20240314-pq3.png b/blog/images/20240314-pq3.png new file mode 100644 index 0000000000..0384c09276 Binary files /dev/null and b/blog/images/20240314-pq3.png differ diff --git a/blog/images/20240323-call1.png b/blog/images/20240323-call1.png new file mode 100644 index 0000000000..0cf954a07e Binary files /dev/null and b/blog/images/20240323-call1.png differ diff --git a/blog/images/20240323-call2.png b/blog/images/20240323-call2.png new file mode 100644 index 0000000000..8a69d1891e Binary files /dev/null and b/blog/images/20240323-call2.png differ diff --git a/blog/images/20240323-migrate-from0.png b/blog/images/20240323-migrate-from0.png new file mode 100644 index 0000000000..033ead3fd9 Binary files /dev/null and b/blog/images/20240323-migrate-from0.png differ diff --git a/blog/images/20240323-migrate-from1.png b/blog/images/20240323-migrate-from1.png new file mode 100644 index 0000000000..be016ada2c Binary files /dev/null and b/blog/images/20240323-migrate-from1.png differ diff --git a/blog/images/20240323-migrate-from2.png b/blog/images/20240323-migrate-from2.png new file mode 100644 index 0000000000..2cee12e6f4 Binary files /dev/null and b/blog/images/20240323-migrate-from2.png differ diff --git a/blog/images/20240323-migrate-from3.png b/blog/images/20240323-migrate-from3.png new file mode 100644 index 0000000000..92d7bf19a6 Binary files /dev/null and b/blog/images/20240323-migrate-from3.png differ diff --git a/blog/images/20240323-migrate-from4.png b/blog/images/20240323-migrate-from4.png new file mode 100644 index 0000000000..9b96f9efd8 Binary files /dev/null and b/blog/images/20240323-migrate-from4.png differ diff --git a/blog/images/20240323-migrate-from5.png b/blog/images/20240323-migrate-from5.png new file mode 100644 index 0000000000..dfc22a3987 Binary files /dev/null and b/blog/images/20240323-migrate-from5.png differ diff --git a/blog/images/20240323-migrate-from6.png b/blog/images/20240323-migrate-from6.png new file mode 100644 index 0000000000..18d9c8b627 Binary files /dev/null and b/blog/images/20240323-migrate-from6.png differ diff --git a/blog/images/20240323-migrate-to1.png b/blog/images/20240323-migrate-to1.png new file mode 100644 index 0000000000..b3fb0e32f1 Binary files /dev/null and b/blog/images/20240323-migrate-to1.png differ diff --git a/blog/images/20240323-migrate-to2.png b/blog/images/20240323-migrate-to2.png new file mode 100644 index 0000000000..f64544cd9b Binary files /dev/null and b/blog/images/20240323-migrate-to2.png differ diff --git a/blog/images/20240323-migrate-to3.png b/blog/images/20240323-migrate-to3.png new file mode 100644 index 0000000000..626032737b Binary files /dev/null and b/blog/images/20240323-migrate-to3.png differ diff --git a/blog/images/20240323-migrate-to4.png b/blog/images/20240323-migrate-to4.png new file mode 100644 index 0000000000..59153a464c Binary files /dev/null and b/blog/images/20240323-migrate-to4.png differ diff --git a/blog/images/20240323-migrate-to5.png b/blog/images/20240323-migrate-to5.png new file mode 100644 index 0000000000..b86f42b292 Binary files /dev/null and b/blog/images/20240323-migrate-to5.png differ diff --git a/blog/images/20240323-post-preview.png b/blog/images/20240323-post-preview.png new file mode 100644 index 0000000000..69c9908a1e Binary files /dev/null and b/blog/images/20240323-post-preview.png differ diff --git a/blog/images/20240404-esraa.png b/blog/images/20240404-esraa.png new file mode 100644 index 0000000000..baee242023 Binary files /dev/null and b/blog/images/20240404-esraa.png differ diff --git a/blog/images/20240404-messsaging-apps.png b/blog/images/20240404-messsaging-apps.png new file mode 100644 index 0000000000..6081a468a1 Binary files /dev/null and b/blog/images/20240404-messsaging-apps.png differ diff --git a/blog/images/20240416-metadata.png b/blog/images/20240416-metadata.png new file mode 100644 index 0000000000..743930bf15 Binary files /dev/null and b/blog/images/20240416-metadata.png differ diff --git a/blog/images/20240416-whatsapp.jpg b/blog/images/20240416-whatsapp.jpg new file mode 100644 index 0000000000..399235347a Binary files /dev/null and b/blog/images/20240416-whatsapp.jpg differ diff --git a/blog/images/20240426-forward1.png b/blog/images/20240426-forward1.png new file mode 100644 index 0000000000..8fb99a4580 Binary files /dev/null and b/blog/images/20240426-forward1.png differ diff --git a/blog/images/20240426-forward2.png b/blog/images/20240426-forward2.png new file mode 100644 index 0000000000..8dd5043703 Binary files /dev/null and b/blog/images/20240426-forward2.png differ diff --git a/blog/images/20240426-forward3.png b/blog/images/20240426-forward3.png new file mode 100644 index 0000000000..9cf97e8ae1 Binary files /dev/null and b/blog/images/20240426-forward3.png differ diff --git a/blog/images/20240426-pq.png b/blog/images/20240426-pq.png new file mode 100644 index 0000000000..2a86d10a7c Binary files /dev/null and b/blog/images/20240426-pq.png differ diff --git a/blog/images/20240426-profile.png b/blog/images/20240426-profile.png new file mode 100644 index 0000000000..fc0b9536bb Binary files /dev/null and b/blog/images/20240426-profile.png differ diff --git a/blog/images/20240426-profile1.png b/blog/images/20240426-profile1.png new file mode 100644 index 0000000000..f638b3b7bc Binary files /dev/null and b/blog/images/20240426-profile1.png differ diff --git a/blog/images/20240426-profile2.png b/blog/images/20240426-profile2.png new file mode 100644 index 0000000000..6592eec886 Binary files /dev/null and b/blog/images/20240426-profile2.png differ diff --git a/blog/images/20240426-profile3.png b/blog/images/20240426-profile3.png new file mode 100644 index 0000000000..f6972f2013 Binary files /dev/null and b/blog/images/20240426-profile3.png differ diff --git a/blog/images/20240516-parliament.jpg b/blog/images/20240516-parliament.jpg new file mode 100644 index 0000000000..53e8013249 Binary files /dev/null and b/blog/images/20240516-parliament.jpg differ diff --git a/blog/images/20240601-eu-privacy.png b/blog/images/20240601-eu-privacy.png new file mode 100644 index 0000000000..4ae1a17e30 Binary files /dev/null and b/blog/images/20240601-eu-privacy.png differ diff --git a/blog/images/20240604-routing.png b/blog/images/20240604-routing.png new file mode 100644 index 0000000000..8fb0c821c4 Binary files /dev/null and b/blog/images/20240604-routing.png differ diff --git a/blog/images/20240604-server.png b/blog/images/20240604-server.png new file mode 100644 index 0000000000..4ab610f3b9 Binary files /dev/null and b/blog/images/20240604-server.png differ diff --git a/blog/images/20240604-theme1.png b/blog/images/20240604-theme1.png new file mode 100644 index 0000000000..e9a1422a71 Binary files /dev/null and b/blog/images/20240604-theme1.png differ diff --git a/blog/images/20240604-theme2.png b/blog/images/20240604-theme2.png new file mode 100644 index 0000000000..e7972f6e05 Binary files /dev/null and b/blog/images/20240604-theme2.png differ diff --git a/blog/images/20240704-privacy.jpg b/blog/images/20240704-privacy.jpg new file mode 100644 index 0000000000..bfcbf11d3f Binary files /dev/null and b/blog/images/20240704-privacy.jpg differ diff --git a/blog/images/20240814-delete-contact-1.png b/blog/images/20240814-delete-contact-1.png new file mode 100644 index 0000000000..7f35664502 Binary files /dev/null and b/blog/images/20240814-delete-contact-1.png differ diff --git a/blog/images/20240814-delete-contact-2.png b/blog/images/20240814-delete-contact-2.png new file mode 100644 index 0000000000..766ddd677b Binary files /dev/null and b/blog/images/20240814-delete-contact-2.png differ diff --git a/blog/images/20240814-delete-messages.png b/blog/images/20240814-delete-messages.png new file mode 100644 index 0000000000..b2c65f28ad Binary files /dev/null and b/blog/images/20240814-delete-messages.png differ diff --git a/blog/images/20240814-new-message.png b/blog/images/20240814-new-message.png new file mode 100644 index 0000000000..69930499e7 Binary files /dev/null and b/blog/images/20240814-new-message.png differ diff --git a/blog/images/20240814-play.png b/blog/images/20240814-play.png new file mode 100644 index 0000000000..3e719df642 Binary files /dev/null and b/blog/images/20240814-play.png differ diff --git a/blog/images/20240814-reachable.png b/blog/images/20240814-reachable.png new file mode 100644 index 0000000000..dde3c747f9 Binary files /dev/null and b/blog/images/20240814-reachable.png differ diff --git a/blog/images/20240814-share.png b/blog/images/20240814-share.png new file mode 100644 index 0000000000..b486fe2356 Binary files /dev/null and b/blog/images/20240814-share.png differ diff --git a/blog/images/20241014-calls.png b/blog/images/20241014-calls.png new file mode 100644 index 0000000000..c9d8bb18a7 Binary files /dev/null and b/blog/images/20241014-calls.png differ diff --git a/blog/images/20241014-forward.png b/blog/images/20241014-forward.png new file mode 100644 index 0000000000..c094bf80a9 Binary files /dev/null and b/blog/images/20241014-forward.png differ diff --git a/blog/images/20241014-messages.png b/blog/images/20241014-messages.png new file mode 100644 index 0000000000..afc7993899 Binary files /dev/null and b/blog/images/20241014-messages.png differ diff --git a/blog/images/20241014-profiles1.png b/blog/images/20241014-profiles1.png new file mode 100644 index 0000000000..5fb44e3086 Binary files /dev/null and b/blog/images/20241014-profiles1.png differ diff --git a/blog/images/20241014-profiles2.png b/blog/images/20241014-profiles2.png new file mode 100644 index 0000000000..91b18ca4af Binary files /dev/null and b/blog/images/20241014-profiles2.png differ diff --git a/blog/images/20241016-wired-privacy.jpg b/blog/images/20241016-wired-privacy.jpg new file mode 100644 index 0000000000..a97e9ba79c Binary files /dev/null and b/blog/images/20241016-wired-privacy.jpg differ diff --git a/blog/images/20241125-operators-1.png b/blog/images/20241125-operators-1.png new file mode 100644 index 0000000000..a749fa0ed1 Binary files /dev/null and b/blog/images/20241125-operators-1.png differ diff --git a/blog/images/20241125-operators-2.png b/blog/images/20241125-operators-2.png new file mode 100644 index 0000000000..4e5f4a9042 Binary files /dev/null and b/blog/images/20241125-operators-2.png differ diff --git a/blog/images/20241125-operators-3.png b/blog/images/20241125-operators-3.png new file mode 100644 index 0000000000..7ae26ef350 Binary files /dev/null and b/blog/images/20241125-operators-3.png differ diff --git a/blog/images/20241210-business.png b/blog/images/20241210-business.png new file mode 100644 index 0000000000..407ed66a94 Binary files /dev/null and b/blog/images/20241210-business.png differ diff --git a/blog/images/20241210-operators-1.png b/blog/images/20241210-operators-1.png new file mode 100644 index 0000000000..863bd00822 Binary files /dev/null and b/blog/images/20241210-operators-1.png differ diff --git a/blog/images/20241210-operators-2.png b/blog/images/20241210-operators-2.png new file mode 100644 index 0000000000..85e599c827 Binary files /dev/null and b/blog/images/20241210-operators-2.png differ diff --git a/blog/images/20241210-reactions.png b/blog/images/20241210-reactions.png new file mode 100644 index 0000000000..6de8ba8f07 Binary files /dev/null and b/blog/images/20241210-reactions.png differ diff --git a/blog/images/20241218-pub.jpg b/blog/images/20241218-pub.jpg new file mode 100644 index 0000000000..0acd5d7dc1 Binary files /dev/null and b/blog/images/20241218-pub.jpg differ diff --git a/blog/images/20250114-locked-books.jpg b/blog/images/20250114-locked-books.jpg new file mode 100644 index 0000000000..1963b52df5 Binary files /dev/null and b/blog/images/20250114-locked-books.jpg differ diff --git a/blog/images/20250308-captcha.png b/blog/images/20250308-captcha.png new file mode 100644 index 0000000000..7f43b47bd1 Binary files /dev/null and b/blog/images/20250308-captcha.png differ diff --git a/blog/images/20250308-lists.png b/blog/images/20250308-lists.png new file mode 100644 index 0000000000..cd15adbcbc Binary files /dev/null and b/blog/images/20250308-lists.png differ diff --git a/blog/images/20250308-mentions.png b/blog/images/20250308-mentions.png new file mode 100644 index 0000000000..658c7e0011 Binary files /dev/null and b/blog/images/20250308-mentions.png differ diff --git a/blog/images/20250308-reports.png b/blog/images/20250308-reports.png new file mode 100644 index 0000000000..def06bf83e Binary files /dev/null and b/blog/images/20250308-reports.png differ diff --git a/blog/images/20250703-card.jpg b/blog/images/20250703-card.jpg new file mode 100644 index 0000000000..937c70911d Binary files /dev/null and b/blog/images/20250703-card.jpg differ diff --git a/blog/images/20250703-connect1.png b/blog/images/20250703-connect1.png new file mode 100644 index 0000000000..18638a9b77 Binary files /dev/null and b/blog/images/20250703-connect1.png differ diff --git a/blog/images/20250703-connect1a.png b/blog/images/20250703-connect1a.png new file mode 100644 index 0000000000..0d7bb37ffd Binary files /dev/null and b/blog/images/20250703-connect1a.png differ diff --git a/blog/images/20250703-connect2.png b/blog/images/20250703-connect2.png new file mode 100644 index 0000000000..87ad2458bb Binary files /dev/null and b/blog/images/20250703-connect2.png differ diff --git a/blog/images/20250729-connect1.png b/blog/images/20250729-connect1.png new file mode 100644 index 0000000000..984e4e44ef Binary files /dev/null and b/blog/images/20250729-connect1.png differ diff --git a/blog/images/20250729-connect2.png b/blog/images/20250729-connect2.png new file mode 100644 index 0000000000..784ea74e84 Binary files /dev/null and b/blog/images/20250729-connect2.png differ diff --git a/blog/images/20250729-join1.png b/blog/images/20250729-join1.png new file mode 100644 index 0000000000..6cec898eaf Binary files /dev/null and b/blog/images/20250729-join1.png differ diff --git a/blog/images/20250729-join2.png b/blog/images/20250729-join2.png new file mode 100644 index 0000000000..43fa412112 Binary files /dev/null and b/blog/images/20250729-join2.png differ diff --git a/blog/images/arrow.png b/blog/images/arrow.png new file mode 100644 index 0000000000..8d9061f1cb Binary files /dev/null and b/blog/images/arrow.png differ diff --git a/blog/images/simplex-desktop-light.png b/blog/images/simplex-desktop-light.png new file mode 100644 index 0000000000..d28b7b88ca Binary files /dev/null and b/blog/images/simplex-desktop-light.png differ diff --git a/blog/images/simplex-explained.png b/blog/images/simplex-explained.png new file mode 100644 index 0000000000..bf5c738d85 Binary files /dev/null and b/blog/images/simplex-explained.png differ diff --git a/blog/images/simplex-explained.svg b/blog/images/simplex-explained.svg new file mode 100644 index 0000000000..ac57f491ef --- /dev/null +++ b/blog/images/simplex-explained.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blog/images/simplexonflux.png b/blog/images/simplexonflux.png new file mode 100644 index 0000000000..dad3f480f6 Binary files /dev/null and b/blog/images/simplexonflux.png differ diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000000..455960fb07 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,2339 @@ + + + + + + + SimpleX blog: the latest news + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + +
+
+

Latest news

+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. +

+

+ 29 Jul 2025 +

+ +
+

v6.4.1 is released:

+ +
    +
  • welcome your contacts: set your profile bio and welcome message.
  • +
  • protect your communities from spam and abuse: review new members ("knocking").
  • +
  • set default time to delete messages for new contacts.
  • +
  • improved app integrity: Linux app builds are now reproducible.
  • +
+ +

Also, we added 3 new interface languages to Android and desktop apps thanks to our users: Indonesian, Romanian and Vietnamese.

+ +
+ +
+ Read More +
+
+ + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v6.3: new user experience and safety in public groups +

+

+ 08 Mar 2025 +

+ +
+

v6.3 is released:

+ +
    +
  • Preventing spam and abuse in public groups.
  • +
  • Group improvements: mention other members and improved performance.
  • +
  • Better chat navigation: organize chats into lists and jump to found and forwarded messages.
  • +
  • Privacy and security improvements: chat retention period and private media file names.
  • +
+ +

Also, we added Catalan interface language, thanks to our users and Weblate.

+ +

The last but not the least - server builds are now reproducible!

+ +
+ +
+ Read More +
+
+ + + + + + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps +

+

+ 10 Dec 2024 +

+ +
+

v6.2 is released:

+ +
    +
  • SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app to improve metadata privacy in SimpleX network.
  • +
  • Business chats for better privacy and support of your customers.
  • +
  • Better user experience: open on the first unread, jump to quoted messages, see who reacted.
  • +
  • Improving notifications in iOS app.
  • +
+ +
+ +
+ Read More +
+
+ + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ Wired’s Attack on Privacy +

+

+ 16 Oct 2024 +

+ +
+

The Wired article by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in + privacy policy is biased and misleading. By cherry-picking information from the report by the Institute for + Strategic Dialogue (ISD), Wired fails to mention that SimpleX network design prioritizes privacy in order to protect + human rights defenders, journalists, and everyday users who value their privacy.

+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. +

+

+ 14 Oct 2024 +

+ +
+

New security audit!

+ +

Trail of Bits reviewed the cryptographic design of protocols used in SimpleX network and apps. +

+ +

v6.1 is released:

+ +
    +
  • Better calls: switch audio and video during the call.
  • +
  • Better iOS notifications: improved delivery, reduced traffic usage.
  • +
  • Better user experience: switch chat profiles, customizable message shapes, forward up to 20 messages.
  • +
+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. +

+

+ 14 Aug 2024 +

+ +
+

SimpleX Chat vision and funding 2.0: past, present, future.

+ +

Announcing the investment from Jack Dorsey and Asymmetric.

+ +

v6.0 is released:

+ +
    +
  • Private message routing - enabled by default
  • +
  • +

    New chat experience:

    +
      +
    • connect to your friends faster.
    • +
    • new reachable interface.
    • +
    • and much more!
    • +
    +
  • +
  • Improved networking and battery usage
  • +
+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ The Future of Privacy: Enforcing Privacy Standards +

+

+ 04 Jul 2024 +

+ +
+

It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a + right users must fight to protect, and not something that users can be asked to consent away as a + condition of access to a service.

+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: private message routing, v5.8 released with IP address protection and chat themes +

+

+ 04 Jun 2024 +

+ +
+

v5.8 is released:

+ +
    +
  • private message routing.
  • +
  • server transparency.
  • +
  • protect IP address when downloading files & media.
  • +
  • chat themes* for better conversation privacy.
  • +
  • group improvements - reduced traffic and additional preferences.
  • +
  • improved networking, message and file delivery.
  • +
+ +

Also, we added Persian interface language*, thanks to our users and Weblate.

+ +

* Android and desktop apps only.

+
+ +
+ Read More +
+
+ + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX: Redefining Privacy by Making Hard Choices +

+

+ 16 May 2024 +

+ +
+

When it comes to open source privacy tools, the status quo often dictates the limitations of + existing protocols and + structures. However, these norms need to be challenged to radically shift how we approach genuinely + private communication. This requires doing some uncomfortable things, like making hard choices as it relates to + funding, alternative decentralization models, doubling down on privacy over convenience, and more. +

+ +

In this post we explain a bit more about why SimpleX operates and makes decisions the way it does: +

+ +
    +
  • No user accounts.
  • +
  • Privacy over convenience.
  • +
  • Network decentralization.
  • +
  • Funding and profitability.
  • +
  • Company jurisdiction.
  • +
+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: legally binding transparency, v5.7 released with better calls and messages +

+

+ 26 Apr 2024 +

+ +
+

Legally binding transparency

+ +
    +
  • We published Transparency Reports, Security Policy, and Frequently Asked Questions, and updated Privacy Policy.
  • +
  • We are committed to have full consistency between marketing promises and legally binding documents.
  • +
+ +

v5.7 is released:

+ +
    +
  • quantum resistant end-to-end encryption with all contacts.
  • +
  • forward and save messages without revealing the source.
  • +
  • in-call sounds and switching sound sources.
  • +
  • better network connection management.
  • +
  • customizable profile images.
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ The dangers of metadata in messengers +

+

+ 16 Apr 2024 +

+ +
+ By Esra'a al Shafei + +

It's important not to be complacent with the current standards of messaging, + where metadata aggregation is still normalized in apps falsely and dangerously marketed as "private". + This is a post exploring the fundamental differences between privacy and security.

+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ Why I joined SimpleX Chat - by Esra'a al Shafei +

+

+ 04 Apr 2024 +

+ +
+ By Esra'a al Shafei + +

Transitioning from a lifelong career dedicated to nonprofits, +including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, +my decision to join SimpleX Chat may come as a surprise to some. +But, as I step into this new chapter, I want to share the insights and convictions +that have guided me here, shedding light on what I think sets SimpleX Chat apart +and why this move feels like an essential learning opportunity.

+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration +

+

+ 23 Mar 2024 +

+ +
+

SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:

+ +
    +
  • community and business interests are aligned.
  • +
  • the journey to the decentralized non-profit protocol governance.
  • +
  • welcome, Esra'a!
  • +
+ +

v5.6 is released:

+ +
    +
  • quantum resistant end-to-end encryption (BETA) - enable it for the new contacts.
  • +
  • use the app during the audio and video calls.
  • +
  • migrate all app data to another device via QR code.
  • +
  • blocking members and many other improvements.
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v5.6 (beta): adding quantum resistance to Signal Double ratchet algorithm +

+

+ 14 Mar 2024 +

+ +
+

This is a major upgrade for SimpleX Chat messaging protocols!

+ +

This post also covers various aspects of End-to-end encryption:

+ +
    +
  • Why do we need end-to-end encryption?
  • +
  • Why encryption is even allowed?
  • +
  • End-to-end encryption security: attacks and defence.
  • +
  • How secure is encryption in different messengers?
  • +
  • When can you start using quantum resistant chats?
  • +
  • Next for post-quantum crypto - all direct chats, small groups and security audit
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. +

+

+ 24 Jan 2024 +

+ +
+

SimpleX Chat infrastructure on Linode:

+ +
    +
  • free infrastructure.
  • +
  • SimpleX servers in Linode Marketplace.
  • +
  • high capacity messaging servers.
  • +
+ +

v5.5 is released:

+ +
    +
  • private notes.
  • +
  • group history
  • +
  • simpler UX to connect to other people
  • +
  • message delivery, battery usage and other improvements
  • +
+ +

Also, the app interface is now available in Hungarian and Turkish - thanks to our users.

+ +

SimpleX Chat Android and desktop apps are now available in 20 languages!

+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. +

+

+ 25 Nov 2023 +

+ +
+

v5.4 is released:

+ +
    +
  • Link mobile and desktop apps via secure quantum-resistant protocol. 🔗
  • +
  • Better groups:

    +
      +
    • faster to join and more reliable.
    • +
    • create groups with incognito profile.
    • +
    • block group members to reduce noise.
    • +
    • prohibit files and media in a group.
    • +
    +
  • +
  • Better calls: faster to connect, with screen sharing on desktop.
  • +
  • Many other improvements.
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups with directory service +

+

+ 25 Sep 2023 +

+ +
+

v5.3 is released:

+ +
    +
  • new desktop app! 💻
  • +
  • encrypt locally stored files & media
  • +
  • directory service and other group improvements
  • +
  • simplified incognito mode
  • +
  • better app responsiveness, stability and 40% reduced memory usage.
  • +
  • new privacy settings: show last messages & save draft.
  • +
+ +

Also, our users added 6 new interface languages - Arabic*, Bulgarian, Finnish, Hebrew*, Thai and Ukrainian.

+ +

* Android app only.

+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v5.2 released: message delivery receipts +

+

+ 22 Jul 2023 +

+ +
+

v5.2 is released:

+ +
    +
  • message delivery receipts! ✅
  • +
  • filter favorite and unread chats
  • +
  • better disappearing messages
  • +
  • prohibit message reactions
  • +
  • more usable groups:

    +
      +
    • view full original replied message in info.
    • +
    • share your address via your chat profile
    • +
    • search new and existing members
    • +
    +
  • +
  • stability improvements:

    +
      +
    • keep your connections working after restoring from backup.
    • +
    • restart app (Android) or reconnect servers (iOS)
    • +
    • more stable connections and message delivery
    • +
    +
  • +
+ +

Platform evolution:

+ +
    +
  • problems of public groups and their future
  • +
  • what about read receipts?
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v5.1 released: message reactions and self-destruct passcode +

+

+ 23 May 2023 +

+ +
+

v5.1 is released:

+ +
    +
  • message reactions 🚀
  • +
  • improved messages:

    +
      +
    • voice messages up to 5 minutes
    • +
    • custom time to disappear
    • +
    • message editing history
    • +
    +
  • +
  • new design and customizable themes you can share*!
  • +
  • self-destruct passcode
  • +
+ +

Also, the app interface is now available in Japanese and Portuguese (Brazil)* - thanks to our users!

+ +

* Android app only.

+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb +

+

+ 22 Apr 2023 +

+ +
+

SimpleX Chat vision and funding:

+ +
    +
  • why is it a commercial company?
  • +
  • how is it funded and what is the business model?
  • +
  • what is next?
  • +
+ +

v5.0 is released:

+ +
    +
  • send videos and files up to 1gb
  • +
  • app passcode independent from system authentication
  • +
  • networking improvements
  • +
+ +

Also, the app interface is now available in Polish - thanks to our users.

+ +

SimpleX Chat apps are now available in 10 languages!

+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. +

+

+ 28 Mar 2023 +

+ +
+

v4.6 is released:

+ +
    +
  • ARMv7a and Android 8+ - 2x more supported devices!
  • +
  • hidden chat profiles
  • +
  • community moderation
  • +
  • improved audio/video calls
  • +
  • reduced battery usage
  • +
  • SMP server monitoring: status bot and page
  • +
+ +

Also, the app interface is now available in Chinese and Spanish - thanks to our users!

+ +
+ +
+ Read More +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. +

+

+ 06 Dec 2022 +

+ +
+

SimpleX Chat November reviews:

+ +

Privacy Guides recommendations.

+

Review by Mike Kuketz.

+

The messenger matrix.

+

Supernova review and messenger ratings.

+ +

v4.3 is released:

+ +
    +
  • instant voice messages!
  • +
  • irreversible deletion of sent messages for all recipients
  • +
  • improved SMP server configuration and support for server passwords
  • +
  • privacy and security improvements: protect app screen, SimpleX links security, etc.
  • +
+ +
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ Security assessment by Trail of Bits, the new website and v4.2 released +

+

+ 08 Nov 2022 +

+ +
+

"Have you been audited or should we just ignore you?"

+ +

+ SimpleX Chat security has been assessed by + Trail of Bits, + 4 issues were identified, and 3 of them are fixed in v4.2. +

+ +

The new website is live: https://simplex.chat

+ +

v4.2 is released:

+ +
    +
  • group links — admins can create the links for new members to join
  • +
  • auto-accept contact requests + configure whether to accept incognito and welcome message
  • +
  • small things: change group member role, mark chat as unread, send stickers and GIFs from Android keyboards.
  • +
  • manually switch contact or member to another address / server (BETA)
  • +
  • receive files faster (BETA)
  • +
+
+ +
+ Read More +
+
+ + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v4.0 with encrypted database is released +

+

+ 28 Sep 2022 +

+ +
+

Added:

+
    +
  • encrypted local chat database — if you already use the app, you can encrypt the database in the app settings
  • +
  • support for self-hosted WebRTC ICE servers
  • +
  • improved stability of creating new connections: more reliable groups, files and contacts
  • +
  • deleting files and media — for security and to save storage
  • +
  • For developers — TypeScript SDK for integrating with SimpleX Chat
  • +
  • support animated images in Android app
  • +
  • German language in mobile apps UI
  • +
+ +
+ +
+ Read More +
+
+ + + + + + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v3.1-beta is released — improved battery/traffic usage +

+

+ 23 Jul 2022 +

+ +
+

Added:

+
    +
  • terminal app: access to messaging servers via SOCKS5 proxy (e.g., Tor).
  • +
  • mobile apps: join and leave chat groups.
  • +
  • optimized battery and traffic usage — up to 90x reduction!
  • +
  • two docker configurations for self-hosted SMP servers.
  • +
+ +
+ +
+ Read More +
+
+ + + + + + + +
+
+
+ + + + + +
+
+
+
+

+ SimpleX Chat v2.2 - the new privacy and security features +

+

+ 04 Jun 2022 +

+ +
+

Added:

+
    +
  • protect your chats with SimpleX Lock
  • +
  • save data and avoid sharing you are online — manually accepting images
  • +
  • avoid visiting websites of the links you send — disable link previews
  • +
  • identify any lost messages in the chat
  • +
+ +
+ +
+ Read More +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+
+

+ SimpleX announces SimpleX Chat v1 +

+

+ 12 Jan 2022 +

+ +

Major protocol changes address all design mistakes identified during concept review by an independent expert.

+ +
+ Read More +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+
+

+ Simplex Chat +

+

+ 22 Oct 2020 +

+ +

The prototype of SimpleX Messaging Server implementing SMP protocol.

+ +
+ Read More +
+
+ + +
+

Double ratchet algorithm

It is used by two parties to exchange end-to-end encrypted messages. The parties will use some key agreement protocol to agree on the initial shared secret key.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

+ + + + + + + + + + diff --git a/blog/lang/fr-fr/README_fr/index.html b/blog/lang/fr-fr/README_fr/index.html new file mode 100644 index 0000000000..d38d00934e --- /dev/null +++ b/blog/lang/fr-fr/README_fr/index.html @@ -0,0 +1,96 @@ +

Blog

+

4 févr. 2023 SimpleX Chat v4.5 publié

+ +

Nous avons également ajouté l'interface en italien, grâce à nos utilisateurs et à Weblate !

+

3 janv. 2023 SimpleX Chat v4.4 publié

+ +

Nous avons également ajouté l'interface en français, grâce à nos utilisateurs et à Weblate !

+

6 déc. 2022 SimpleX Chat : révision et sortie de la v4.3

+

Critiques de novembre :

+ +

Sortie de la v4.3 :

+ +

8 nov. 2022 Audit de sécurité par Trail of Bits, nouveau site web et sortie de la v4.2

+

"Avez-vous été audité ou devons-nous simplement vous ignorer ?"

+

SimpleX Chat a été audité par Trail of Bits, 4 problèmes ont été identifiés, et 3 d'entre eux sont corrigés dans la version 4.2.

+

Le nouveau site web est en ligne : https://simplex.chat

+

Sortie de la v4.2 :

+ +

28 sept. 2022 v4 : chiffrement de la base de données locale

+ +

1 sept. 2022 v3.2 : Mode Incognito

+ +

L'audit d'implémentation est prévu pour Octobre !

+

8 août 2022 v3.1 : groupes de discussion

+ +

23 juil. 2022 v3.1-beta : accès aux serveurs via Tor

+ +

11 juil. 2022 v3 : notifications push instantanées pour iOS et appels audio/vidéo :

+ +

4 juin 2022 v2.2 : nouveaux paramètres de confidentialité et de sécurité

+

24 mai 2022 v2.1 : effacement des messages pour une meilleure confidentialité des conversations

+

11 mai 2022 Publication de la v2.0 - envoi d'images et de fichiers dans les applications mobiles

+

04 avr. 2022 Notifications instantanées pour les applications mobiles SimpleX Chat

+

08 mars 2022 Applications mobiles pour iOS et Android

+

14 févr. 2022. SimpleX Chat : rejoignez notre version bêta publique pour iOS

+

12 janv. 2022. SimpleX Chat v1 : la plateforme de chat et d'application la plus privée et la plus sécurisée

+

08 déc. 2021. Sortie de SimpleX Chat v0.5 : la première plateforme de chat 100% privée par définition - aucun accès à votre graphe de connexions

+

14 septembre 2021. SimpleX Chat v0.4 publié : chat open-source qui utilise un protocole de routage de messages préservant la confidentialité

+

12 mai 2021. Prototype de chat SimpleX

+

22 oct. 2020. SimpleX Chat

diff --git a/call/call.js b/call/call.js new file mode 100644 index 0000000000..b247431f4b --- /dev/null +++ b/call/call.js @@ -0,0 +1,655 @@ +"use strict"; +// Inspired by +// https://github.com/webrtc/samples/blob/gh-pages/src/content/insertable-streams/endtoend-encryption +var CallMediaType; +(function (CallMediaType) { + CallMediaType["Audio"] = "audio"; + CallMediaType["Video"] = "video"; +})(CallMediaType || (CallMediaType = {})); +var VideoCamera; +(function (VideoCamera) { + VideoCamera["User"] = "user"; + VideoCamera["Environment"] = "environment"; +})(VideoCamera || (VideoCamera = {})); +// for debugging +// var sendMessageToNative = ({resp}: WVApiMessage) => console.log(JSON.stringify({command: resp})) +var sendMessageToNative = (msg) => console.log(JSON.stringify(msg)); +// Global object with cryptrographic/encoding functions +const callCrypto = callCryptoFunction(); +var TransformOperation; +(function (TransformOperation) { + TransformOperation["Encrypt"] = "encrypt"; + TransformOperation["Decrypt"] = "decrypt"; +})(TransformOperation || (TransformOperation = {})); +let activeCall; +const processCommand = (function () { + const defaultIceServers = [ + { urls: ["stun:stun.simplex.im:443"] }, + { urls: ["turn:turn.simplex.im:443"], username: "private", credential: "yleob6AVkiNI87hpR94Z" }, + ]; + function getCallConfig(encodedInsertableStreams, iceServers, relay) { + return { + peerConnectionConfig: { + iceServers: iceServers !== null && iceServers !== void 0 ? iceServers : defaultIceServers, + iceCandidatePoolSize: 10, + encodedInsertableStreams, + iceTransportPolicy: relay ? "relay" : "all", + }, + iceCandidates: { + delay: 3000, + extrasInterval: 2000, + extrasTimeout: 8000, + }, + }; + } + function getIceCandidates(conn, config) { + return new Promise((resolve, _) => { + let candidates = []; + let resolved = false; + let extrasInterval; + let extrasTimeout; + const delay = setTimeout(() => { + if (!resolved) { + resolveIceCandidates(); + extrasInterval = setInterval(() => { + sendIceCandidates(); + }, config.iceCandidates.extrasInterval); + extrasTimeout = setTimeout(() => { + clearInterval(extrasInterval); + sendIceCandidates(); + }, config.iceCandidates.extrasTimeout); + } + }, config.iceCandidates.delay); + conn.onicecandidate = ({ candidate: c }) => c && candidates.push(c); + conn.onicegatheringstatechange = () => { + if (conn.iceGatheringState == "complete") { + if (resolved) { + if (extrasInterval) + clearInterval(extrasInterval); + if (extrasTimeout) + clearTimeout(extrasTimeout); + sendIceCandidates(); + } + else { + resolveIceCandidates(); + } + } + }; + function resolveIceCandidates() { + if (delay) + clearTimeout(delay); + resolved = true; + const iceCandidates = serialize(candidates); + candidates = []; + resolve(iceCandidates); + } + function sendIceCandidates() { + if (candidates.length === 0) + return; + const iceCandidates = serialize(candidates); + candidates = []; + sendMessageToNative({ resp: { type: "ice", iceCandidates } }); + } + }); + } + async function initializeCall(config, mediaType, aesKey, useWorker) { + const pc = new RTCPeerConnection(config.peerConnectionConfig); + const remoteStream = new MediaStream(); + const localCamera = VideoCamera.User; + const localStream = await getLocalMediaStream(mediaType, localCamera); + const iceCandidates = getIceCandidates(pc, config); + const call = { connection: pc, iceCandidates, localMedia: mediaType, localCamera, localStream, remoteStream, aesKey, useWorker }; + await setupMediaStreams(call); + pc.addEventListener("connectionstatechange", connectionStateChange); + return call; + async function connectionStateChange() { + sendMessageToNative({ + resp: { + type: "connection", + state: { + connectionState: pc.connectionState, + iceConnectionState: pc.iceConnectionState, + iceGatheringState: pc.iceGatheringState, + signalingState: pc.signalingState, + }, + }, + }); + if (pc.connectionState == "disconnected" || pc.connectionState == "failed") { + pc.removeEventListener("connectionstatechange", connectionStateChange); + if (activeCall) { + setTimeout(() => sendMessageToNative({ resp: { type: "ended" } }), 0); + } + endCall(); + } + else if (pc.connectionState == "connected") { + const stats = (await pc.getStats()); + for (const stat of stats.values()) { + const { type, state } = stat; + if (type === "candidate-pair" && state === "succeeded") { + const iceCandidatePair = stat; + const resp = { + type: "connected", + connectionInfo: { + iceCandidatePair, + localCandidate: stats.get(iceCandidatePair.localCandidateId), + remoteCandidate: stats.get(iceCandidatePair.remoteCandidateId), + }, + }; + setTimeout(() => sendMessageToNative({ resp }), 500); + break; + } + } + } + } + } + function serialize(x) { + return LZString.compressToBase64(JSON.stringify(x)); + } + function parse(s) { + return JSON.parse(LZString.decompressFromBase64(s)); + } + async function processCommand(body) { + const { corrId, command } = body; + const pc = activeCall === null || activeCall === void 0 ? void 0 : activeCall.connection; + let resp; + try { + switch (command.type) { + case "capabilities": + console.log("starting outgoing call - capabilities"); + if (activeCall) + endCall(); + // This request for local media stream is made to prompt for camera/mic permissions on call start + if (command.media) + await getLocalMediaStream(command.media, VideoCamera.User); + const encryption = supportsInsertableStreams(command.useWorker); + resp = { type: "capabilities", capabilities: { encryption } }; + break; + case "start": { + console.log("starting incoming call - create webrtc session"); + if (activeCall) + endCall(); + const { media, useWorker, iceServers, relay } = command; + const encryption = supportsInsertableStreams(useWorker); + const aesKey = encryption ? command.aesKey : undefined; + activeCall = await initializeCall(getCallConfig(encryption && !!aesKey, iceServers, relay), media, aesKey, useWorker); + const pc = activeCall.connection; + const offer = await pc.createOffer(); + await pc.setLocalDescription(offer); + // for debugging, returning the command for callee to use + // resp = { + // type: "offer", + // offer: serialize(offer), + // iceCandidates: await activeCall.iceCandidates, + // capabilities: {encryption}, + // media, + // iceServers, + // relay, + // aesKey, + // useWorker, + // } + resp = { + type: "offer", + offer: serialize(offer), + iceCandidates: await activeCall.iceCandidates, + capabilities: { encryption }, + }; + break; + } + case "offer": + if (activeCall) { + resp = { type: "error", message: "accept: call already started" }; + } + else if (!supportsInsertableStreams(command.useWorker) && command.aesKey) { + resp = { type: "error", message: "accept: encryption is not supported" }; + } + else { + const offer = parse(command.offer); + const remoteIceCandidates = parse(command.iceCandidates); + const { media, aesKey, useWorker, iceServers, relay } = command; + activeCall = await initializeCall(getCallConfig(!!aesKey, iceServers, relay), media, aesKey, useWorker); + const pc = activeCall.connection; + await pc.setRemoteDescription(new RTCSessionDescription(offer)); + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + addIceCandidates(pc, remoteIceCandidates); + // same as command for caller to use + resp = { + type: "answer", + answer: serialize(answer), + iceCandidates: await activeCall.iceCandidates, + }; + } + break; + case "answer": + if (!pc) { + resp = { type: "error", message: "answer: call not started" }; + } + else if (!pc.localDescription) { + resp = { type: "error", message: "answer: local description is not set" }; + } + else if (pc.currentRemoteDescription) { + resp = { type: "error", message: "answer: remote description already set" }; + } + else { + const answer = parse(command.answer); + const remoteIceCandidates = parse(command.iceCandidates); + await pc.setRemoteDescription(new RTCSessionDescription(answer)); + addIceCandidates(pc, remoteIceCandidates); + resp = { type: "ok" }; + } + break; + case "ice": + if (pc) { + const remoteIceCandidates = parse(command.iceCandidates); + addIceCandidates(pc, remoteIceCandidates); + resp = { type: "ok" }; + } + else { + resp = { type: "error", message: "ice: call not started" }; + } + break; + case "media": + if (!activeCall) { + resp = { type: "error", message: "media: call not started" }; + } + else if (activeCall.localMedia == CallMediaType.Audio && command.media == CallMediaType.Video) { + resp = { type: "error", message: "media: no video" }; + } + else { + enableMedia(activeCall.localStream, command.media, command.enable); + resp = { type: "ok" }; + } + break; + case "camera": + if (!activeCall || !pc) { + resp = { type: "error", message: "camera: call not started" }; + } + else { + await replaceMedia(activeCall, command.camera); + resp = { type: "ok" }; + } + break; + case "end": + endCall(); + resp = { type: "ok" }; + break; + default: + resp = { type: "error", message: "unknown command" }; + break; + } + } + catch (e) { + resp = { type: "error", message: `${command.type}: ${e.message}` }; + } + const apiResp = { corrId, resp, command }; + sendMessageToNative(apiResp); + return apiResp; + } + function endCall() { + var _a; + try { + (_a = activeCall === null || activeCall === void 0 ? void 0 : activeCall.connection) === null || _a === void 0 ? void 0 : _a.close(); + } + catch (e) { + console.log(e); + } + activeCall = undefined; + resetVideoElements(); + } + function addIceCandidates(conn, iceCandidates) { + for (const c of iceCandidates) { + conn.addIceCandidate(new RTCIceCandidate(c)); + } + } + async function setupMediaStreams(call) { + const videos = getVideoElements(); + if (!videos) + throw Error("no video elements"); + await setupEncryptionWorker(call); + setupLocalStream(call); + setupRemoteStream(call); + setupCodecPreferences(call); + // setupVideoElement(videos.local) + // setupVideoElement(videos.remote) + videos.local.srcObject = call.localStream; + videos.remote.srcObject = call.remoteStream; + } + async function setupEncryptionWorker(call) { + if (call.aesKey) { + if (!call.key) + call.key = await callCrypto.decodeAesKey(call.aesKey); + if (call.useWorker && !call.worker) { + const workerCode = `const callCrypto = (${callCryptoFunction.toString()})(); (${workerFunction.toString()})()`; + call.worker = new Worker(URL.createObjectURL(new Blob([workerCode], { type: "text/javascript" }))); + call.worker.onerror = ({ error, filename, lineno, message }) => console.log(JSON.stringify({ error, filename, lineno, message })); + call.worker.onmessage = ({ data }) => console.log(JSON.stringify({ message: data })); + } + } + } + function setupLocalStream(call) { + const videos = getVideoElements(); + if (!videos) + throw Error("no video elements"); + const pc = call.connection; + let { localStream } = call; + for (const track of localStream.getTracks()) { + pc.addTrack(track, localStream); + } + if (call.aesKey && call.key) { + console.log("set up encryption for sending"); + for (const sender of pc.getSenders()) { + setupPeerTransform(TransformOperation.Encrypt, sender, call.worker, call.aesKey, call.key); + } + } + } + function setupRemoteStream(call) { + // Pull tracks from remote stream as they arrive add them to remoteStream video + const pc = call.connection; + pc.ontrack = (event) => { + try { + if (call.aesKey && call.key) { + console.log("set up decryption for receiving"); + setupPeerTransform(TransformOperation.Decrypt, event.receiver, call.worker, call.aesKey, call.key); + } + for (const stream of event.streams) { + for (const track of stream.getTracks()) { + call.remoteStream.addTrack(track); + } + } + console.log(`ontrack success`); + } + catch (e) { + console.log(`ontrack error: ${e.message}`); + } + }; + } + function setupCodecPreferences(call) { + // We assume VP8 encoding in the decode/encode stages to get the initial + // bytes to pass as plaintext so we enforce that here. + // VP8 is supported by all supports of webrtc. + // Use of VP8 by default may also reduce depacketisation issues. + // We do not encrypt the first couple of bytes of the payload so that the + // video elements can work by determining video keyframes and the opus mode + // being used. This appears to be necessary for any video feed at all. + // For VP8 this is the content described in + // https://tools.ietf.org/html/rfc6386#section-9.1 + // which is 10 bytes for key frames and 3 bytes for delta frames. + // For opus (where encodedFrame.type is not set) this is the TOC byte from + // https://tools.ietf.org/html/rfc6716#section-3.1 + var _a; + const capabilities = RTCRtpSender.getCapabilities("video"); + if (capabilities) { + const { codecs } = capabilities; + const selectedCodecIndex = codecs.findIndex((c) => c.mimeType === "video/VP8"); + const selectedCodec = codecs[selectedCodecIndex]; + codecs.splice(selectedCodecIndex, 1); + codecs.unshift(selectedCodec); + for (const t of call.connection.getTransceivers()) { + if (((_a = t.sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "video") { + t.setCodecPreferences(codecs); + } + } + } + } + async function replaceMedia(call, camera) { + const videos = getVideoElements(); + if (!videos) + throw Error("no video elements"); + const pc = call.connection; + for (const t of call.localStream.getTracks()) + t.stop(); + call.localCamera = camera; + const localStream = await getLocalMediaStream(call.localMedia, camera); + replaceTracks(pc, localStream.getVideoTracks()); + replaceTracks(pc, localStream.getAudioTracks()); + call.localStream = localStream; + videos.local.srcObject = localStream; + } + function replaceTracks(pc, tracks) { + if (!tracks.length) + return; + const sender = pc.getSenders().find((s) => { var _a; return ((_a = s.track) === null || _a === void 0 ? void 0 : _a.kind) === tracks[0].kind; }); + if (sender) + for (const t of tracks) + sender.replaceTrack(t); + } + function setupPeerTransform(operation, peer, worker, aesKey, key) { + if (worker && "RTCRtpScriptTransform" in window) { + console.log(`${operation} with worker & RTCRtpScriptTransform`); + peer.transform = new RTCRtpScriptTransform(worker, { operation, aesKey }); + } + else if ("createEncodedStreams" in peer) { + const { readable, writable } = peer.createEncodedStreams(); + if (worker) { + console.log(`${operation} with worker`); + worker.postMessage({ operation, readable, writable, aesKey }, [readable, writable]); + } + else { + console.log(`${operation} without worker`); + const transform = callCrypto.transformFrame[operation](key); + readable.pipeThrough(new TransformStream({ transform })).pipeTo(writable); + } + } + else { + console.log(`no ${operation}`); + } + } + function getLocalMediaStream(mediaType, facingMode) { + const constraints = callMediaConstraints(mediaType, facingMode); + return navigator.mediaDevices.getUserMedia(constraints); + } + function callMediaConstraints(mediaType, facingMode) { + switch (mediaType) { + case CallMediaType.Audio: + return { audio: true, video: false }; + case CallMediaType.Video: + return { + audio: true, + video: { + frameRate: 24, + width: { + min: 480, + ideal: 720, + max: 1280, + }, + aspectRatio: 1.33, + facingMode, + }, + }; + } + } + function supportsInsertableStreams(useWorker) { + return (("createEncodedStreams" in RTCRtpSender.prototype && "createEncodedStreams" in RTCRtpReceiver.prototype) || + (!!useWorker && "RTCRtpScriptTransform" in window)); + } + function resetVideoElements() { + const videos = getVideoElements(); + if (!videos) + return; + videos.local.srcObject = null; + videos.remote.srcObject = null; + } + function getVideoElements() { + const local = document.getElementById("local-video-stream"); + const remote = document.getElementById("remote-video-stream"); + if (!(local && remote && local instanceof HTMLMediaElement && remote instanceof HTMLMediaElement)) + return; + return { local, remote }; + } + // function setupVideoElement(video: HTMLElement) { + // // TODO use display: none + // video.style.opacity = "0" + // video.onplaying = () => { + // video.style.opacity = "1" + // } + // } + function enableMedia(s, media, enable) { + const tracks = media == CallMediaType.Video ? s.getVideoTracks() : s.getAudioTracks(); + for (const t of tracks) + t.enabled = enable; + } + return processCommand; +})(); +// Cryptography function - it is loaded both in the main window and in worker context (if the worker is used) +function callCryptoFunction() { + const initialPlainTextRequired = { + key: 10, + delta: 3, + empty: 1, + }; + const IV_LENGTH = 12; + function encryptFrame(key) { + return async (frame, controller) => { + const data = new Uint8Array(frame.data); + const n = initialPlainTextRequired[frame.type] || 1; + const iv = randomIV(); + const initial = data.subarray(0, n); + const plaintext = data.subarray(n, data.byteLength); + try { + const ciphertext = plaintext.length + ? new Uint8Array(await crypto.subtle.encrypt({ name: "AES-GCM", iv: iv.buffer }, key, plaintext)) + : new Uint8Array(0); + frame.data = concatN(initial, ciphertext, iv).buffer; + controller.enqueue(frame); + } + catch (e) { + console.log(`encryption error ${e}`); + throw e; + } + }; + } + function decryptFrame(key) { + return async (frame, controller) => { + const data = new Uint8Array(frame.data); + const n = initialPlainTextRequired[frame.type] || 1; + const initial = data.subarray(0, n); + const ciphertext = data.subarray(n, data.byteLength - IV_LENGTH); + const iv = data.subarray(data.byteLength - IV_LENGTH, data.byteLength); + try { + const plaintext = ciphertext.length + ? new Uint8Array(await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, ciphertext)) + : new Uint8Array(0); + frame.data = concatN(initial, plaintext).buffer; + controller.enqueue(frame); + } + catch (e) { + console.log(`decryption error ${e}`); + throw e; + } + }; + } + function decodeAesKey(aesKey) { + const keyData = callCrypto.decodeBase64url(callCrypto.encodeAscii(aesKey)); + return crypto.subtle.importKey("raw", keyData, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]); + } + function concatN(...bs) { + const a = new Uint8Array(bs.reduce((size, b) => size + b.byteLength, 0)); + bs.reduce((offset, b) => { + a.set(b, offset); + return offset + b.byteLength; + }, 0); + return a; + } + function randomIV() { + return crypto.getRandomValues(new Uint8Array(IV_LENGTH)); + } + const base64urlChars = new Uint8Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split("").map((c) => c.charCodeAt(0))); + const base64urlLookup = new Array(256); + base64urlChars.forEach((c, i) => (base64urlLookup[c] = i)); + const char_equal = "=".charCodeAt(0); + function encodeAscii(s) { + const a = new Uint8Array(s.length); + let i = s.length; + while (i--) + a[i] = s.charCodeAt(i); + return a; + } + function decodeAscii(a) { + let s = ""; + for (let i = 0; i < a.length; i++) + s += String.fromCharCode(a[i]); + return s; + } + function encodeBase64url(a) { + const len = a.length; + const b64len = Math.ceil(len / 3) * 4; + const b64 = new Uint8Array(b64len); + let j = 0; + for (let i = 0; i < len; i += 3) { + b64[j++] = base64urlChars[a[i] >> 2]; + b64[j++] = base64urlChars[((a[i] & 3) << 4) | (a[i + 1] >> 4)]; + b64[j++] = base64urlChars[((a[i + 1] & 15) << 2) | (a[i + 2] >> 6)]; + b64[j++] = base64urlChars[a[i + 2] & 63]; + } + if (len % 3) + b64[b64len - 1] = char_equal; + if (len % 3 === 1) + b64[b64len - 2] = char_equal; + return b64; + } + function decodeBase64url(b64) { + let len = b64.length; + if (len % 4) + return; + let bLen = (len * 3) / 4; + if (b64[len - 1] === char_equal) { + len--; + bLen--; + if (b64[len - 1] === char_equal) { + len--; + bLen--; + } + } + const bytes = new Uint8Array(bLen); + let i = 0; + let pos = 0; + while (i < len) { + const enc1 = base64urlLookup[b64[i++]]; + const enc2 = i < len ? base64urlLookup[b64[i++]] : 0; + const enc3 = i < len ? base64urlLookup[b64[i++]] : 0; + const enc4 = i < len ? base64urlLookup[b64[i++]] : 0; + if (enc1 === undefined || enc2 === undefined || enc3 === undefined || enc4 === undefined) + return; + bytes[pos++] = (enc1 << 2) | (enc2 >> 4); + bytes[pos++] = ((enc2 & 15) << 4) | (enc3 >> 2); + bytes[pos++] = ((enc3 & 3) << 6) | (enc4 & 63); + } + return bytes; + } + return { + transformFrame: { encrypt: encryptFrame, decrypt: decryptFrame }, + decodeAesKey, + encodeAscii, + decodeAscii, + encodeBase64url, + decodeBase64url, + }; +} +// If the worker is used for decryption, this function code (as string) is used to load the worker via Blob +// We have to use worker optionally, as it crashes in Android web view, regardless of how it is loaded +function workerFunction() { + // encryption with createEncodedStreams support + self.addEventListener("message", async ({ data }) => { + await setupTransform(data); + }); + // encryption using RTCRtpScriptTransform. + if ("RTCTransformEvent" in self) { + self.addEventListener("rtctransform", async ({ transformer }) => { + try { + const { operation, aesKey } = transformer.options; + const { readable, writable } = transformer; + await setupTransform({ operation, aesKey, readable, writable }); + self.postMessage({ result: "setupTransform success" }); + } + catch (e) { + self.postMessage({ message: `setupTransform error: ${e.message}` }); + } + }); + } + async function setupTransform({ operation, aesKey, readable, writable }) { + const key = await callCrypto.decodeAesKey(aesKey); + const transform = callCrypto.transformFrame[operation](key); + readable.pipeThrough(new TransformStream({ transform })).pipeTo(writable); + } +} +//# sourceMappingURL=call.js.map \ No newline at end of file diff --git a/call/call.js.map b/call/call.js.map new file mode 100644 index 0000000000..b6952eb495 --- /dev/null +++ b/call/call.js.map @@ -0,0 +1 @@ +{"version":3,"file":"call.js","sourceRoot":"","sources":["../src/call.ts"],"names":[],"mappings":";AAAA,cAAc;AACd,qGAAqG;AAkCrG,IAAK,aAGJ;AAHD,WAAK,aAAa;IAChB,gCAAe,CAAA;IACf,gCAAe,CAAA;AACjB,CAAC,EAHI,aAAa,KAAb,aAAa,QAGjB;AAED,IAAK,WAGJ;AAHD,WAAK,WAAW;IACd,4BAAa,CAAA;IACb,0CAA2B,CAAA;AAC7B,CAAC,EAHI,WAAW,KAAX,WAAW,QAGf;AAgHD,gBAAgB;AAChB,mGAAmG;AACnG,IAAI,mBAAmB,GAAG,CAAC,GAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AAEjF,uDAAuD;AACvD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;AAOvC,IAAK,kBAGJ;AAHD,WAAK,kBAAkB;IACrB,yCAAmB,CAAA;IACnB,yCAAmB,CAAA;AACrB,CAAC,EAHI,kBAAkB,KAAlB,kBAAkB,QAGtB;AAsBD,IAAI,UAA4B,CAAA;AAEhC,MAAM,cAAc,GAAG,CAAC;IAwBtB,MAAM,iBAAiB,GAAmB;QACxC,EAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,EAAC;QACpC,EAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAC;KAC9F,CAAA;IAED,SAAS,aAAa,CAAC,wBAAiC,EAAE,UAA2B,EAAE,KAAe;QACpG,OAAO;YACL,oBAAoB,EAAE;gBACpB,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,iBAAiB;gBAC3C,oBAAoB,EAAE,EAAE;gBACxB,wBAAwB;gBACxB,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;aAC5C;YACD,aAAa,EAAE;gBACb,KAAK,EAAE,IAAI;gBACX,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF,CAAA;IACH,CAAC;IAED,SAAS,gBAAgB,CAAC,IAAuB,EAAE,MAAkB;QACnE,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,UAAU,GAAsB,EAAE,CAAA;YACtC,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,IAAI,cAAkC,CAAA;YACtC,IAAI,aAAiC,CAAA;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,QAAQ,EAAE;oBACb,oBAAoB,EAAE,CAAA;oBACtB,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;wBAChC,iBAAiB,EAAE,CAAA;oBACrB,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;oBACvC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC9B,aAAa,CAAC,cAAc,CAAC,CAAA;wBAC7B,iBAAiB,EAAE,CAAA;oBACrB,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;iBACvC;YACH,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAE9B,IAAI,CAAC,cAAc,GAAG,CAAC,EAAC,SAAS,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjE,IAAI,CAAC,yBAAyB,GAAG,GAAG,EAAE;gBACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,UAAU,EAAE;oBACxC,IAAI,QAAQ,EAAE;wBACZ,IAAI,cAAc;4BAAE,aAAa,CAAC,cAAc,CAAC,CAAA;wBACjD,IAAI,aAAa;4BAAE,YAAY,CAAC,aAAa,CAAC,CAAA;wBAC9C,iBAAiB,EAAE,CAAA;qBACpB;yBAAM;wBACL,oBAAoB,EAAE,CAAA;qBACvB;iBACF;YACH,CAAC,CAAA;YAED,SAAS,oBAAoB;gBAC3B,IAAI,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;gBAC9B,QAAQ,GAAG,IAAI,CAAA;gBACf,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;gBAC3C,UAAU,GAAG,EAAE,CAAA;gBACf,OAAO,CAAC,aAAa,CAAC,CAAA;YACxB,CAAC;YAED,SAAS,iBAAiB;gBACxB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBACnC,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;gBAC3C,UAAU,GAAG,EAAE,CAAA;gBACf,mBAAmB,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAC,EAAC,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,MAAkB,EAAE,SAAwB,EAAE,MAAe,EAAE,SAAmB;QAC9G,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;QAC7D,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAA;QACtC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAA;QACpC,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACrE,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,EAAC,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAC,CAAA;QAC9H,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAC7B,EAAE,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAA;QACnE,OAAO,IAAI,CAAA;QAEX,KAAK,UAAU,qBAAqB;YAClC,mBAAmB,CAAC;gBAClB,IAAI,EAAE;oBACJ,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE;wBACL,eAAe,EAAE,EAAE,CAAC,eAAe;wBACnC,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;wBACzC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;wBACvC,cAAc,EAAE,EAAE,CAAC,cAAc;qBAClC;iBACF;aACF,CAAC,CAAA;YACF,IAAI,EAAE,CAAC,eAAe,IAAI,cAAc,IAAI,EAAE,CAAC,eAAe,IAAI,QAAQ,EAAE;gBAC1E,EAAE,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAA;gBACtE,IAAI,UAAU,EAAE;oBACd,UAAU,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,EAAC,CAAC,EAAE,CAAC,CAAC,CAAA;iBAClE;gBACD,OAAO,EAAE,CAAA;aACV;iBAAM,IAAI,EAAE,CAAC,eAAe,IAAI,WAAW,EAAE;gBAC5C,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAqB,CAAA;gBACvD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjC,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,IAAI,CAAA;oBAC1B,IAAI,IAAI,KAAK,gBAAgB,IAAI,KAAK,KAAK,WAAW,EAAE;wBACtD,MAAM,gBAAgB,GAAG,IAAgC,CAAA;wBACzD,MAAM,IAAI,GAAoB;4BAC5B,IAAI,EAAE,WAAW;4BACjB,cAAc,EAAE;gCACd,gBAAgB;gCAChB,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;gCAC5D,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;6BAC/D;yBACF,CAAA;wBACD,UAAU,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAC,IAAI,EAAC,CAAC,EAAE,GAAG,CAAC,CAAA;wBAClD,MAAK;qBACN;iBACF;aACF;QACH,CAAC;IACH,CAAC;IAED,SAAS,SAAS,CAAI,CAAI;QACxB,OAAO,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,SAAS,KAAK,CAAI,CAAS;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAE,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,IAAe;QAC3C,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,IAAI,CAAA;QAC9B,MAAM,EAAE,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,CAAA;QACjC,IAAI,IAAmB,CAAA;QACvB,IAAI;YACF,QAAQ,OAAO,CAAC,IAAI,EAAE;gBACpB,KAAK,cAAc;oBACjB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;oBACpD,IAAI,UAAU;wBAAE,OAAO,EAAE,CAAA;oBACzB,iGAAiG;oBACjG,IAAI,OAAO,CAAC,KAAK;wBAAE,MAAM,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;oBAC7E,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;oBAC/D,IAAI,GAAG,EAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,EAAC,UAAU,EAAC,EAAC,CAAA;oBACzD,MAAK;gBACP,KAAK,OAAO,CAAC,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;oBAC7D,IAAI,UAAU;wBAAE,OAAO,EAAE,CAAA;oBACzB,MAAM,EAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,GAAG,OAAO,CAAA;oBACrD,MAAM,UAAU,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;oBACvD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;oBACtD,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;oBACrH,MAAM,EAAE,GAAG,UAAU,CAAC,UAAU,CAAA;oBAChC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAA;oBACpC,MAAM,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;oBACnC,yDAAyD;oBACzD,WAAW;oBACX,mBAAmB;oBACnB,6BAA6B;oBAC7B,mDAAmD;oBACnD,gCAAgC;oBAChC,WAAW;oBACX,gBAAgB;oBAChB,WAAW;oBACX,YAAY;oBACZ,eAAe;oBACf,IAAI;oBACJ,IAAI,GAAG;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;wBACvB,aAAa,EAAE,MAAM,UAAU,CAAC,aAAa;wBAC7C,YAAY,EAAE,EAAC,UAAU,EAAC;qBAC3B,CAAA;oBACD,MAAK;iBACN;gBACD,KAAK,OAAO;oBACV,IAAI,UAAU,EAAE;wBACd,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,8BAA8B,EAAC,CAAA;qBAChE;yBAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE;wBAC1E,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qCAAqC,EAAC,CAAA;qBACvE;yBAAM;wBACL,MAAM,KAAK,GAA8B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;wBAC7D,MAAM,mBAAmB,GAA0B,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;wBAC/E,MAAM,EAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,GAAG,OAAO,CAAA;wBAC7D,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;wBACvG,MAAM,EAAE,GAAG,UAAU,CAAC,UAAU,CAAA;wBAChC,MAAM,EAAE,CAAC,oBAAoB,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAA;wBAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,EAAE,CAAA;wBACtC,MAAM,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;wBACpC,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAA;wBACzC,oCAAoC;wBACpC,IAAI,GAAG;4BACL,IAAI,EAAE,QAAQ;4BACd,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;4BACzB,aAAa,EAAE,MAAM,UAAU,CAAC,aAAa;yBAC9C,CAAA;qBACF;oBACD,MAAK;gBACP,KAAK,QAAQ;oBACX,IAAI,CAAC,EAAE,EAAE;wBACP,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAC,CAAA;qBAC5D;yBAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE;wBAC/B,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sCAAsC,EAAC,CAAA;qBACxE;yBAAM,IAAI,EAAE,CAAC,wBAAwB,EAAE;wBACtC,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wCAAwC,EAAC,CAAA;qBAC1E;yBAAM;wBACL,MAAM,MAAM,GAA8B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;wBAC/D,MAAM,mBAAmB,GAA0B,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;wBAC/E,MAAM,EAAE,CAAC,oBAAoB,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAA;wBAChE,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAA;wBACzC,IAAI,GAAG,EAAC,IAAI,EAAE,IAAI,EAAC,CAAA;qBACpB;oBACD,MAAK;gBACP,KAAK,KAAK;oBACR,IAAI,EAAE,EAAE;wBACN,MAAM,mBAAmB,GAA0B,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;wBAC/E,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAA;wBACzC,IAAI,GAAG,EAAC,IAAI,EAAE,IAAI,EAAC,CAAA;qBACpB;yBAAM;wBACL,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAC,CAAA;qBACzD;oBACD,MAAK;gBACP,KAAK,OAAO;oBACV,IAAI,CAAC,UAAU,EAAE;wBACf,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAC,CAAA;qBAC3D;yBAAM,IAAI,UAAU,CAAC,UAAU,IAAI,aAAa,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,EAAE;wBAC/F,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAC,CAAA;qBACnD;yBAAM;wBACL,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;wBAClE,IAAI,GAAG,EAAC,IAAI,EAAE,IAAI,EAAC,CAAA;qBACpB;oBACD,MAAK;gBACP,KAAK,QAAQ;oBACX,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE;wBACtB,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAC,CAAA;qBAC5D;yBAAM;wBACL,MAAM,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;wBAC9C,IAAI,GAAG,EAAC,IAAI,EAAE,IAAI,EAAC,CAAA;qBACpB;oBACD,MAAK;gBACP,KAAK,KAAK;oBACR,OAAO,EAAE,CAAA;oBACT,IAAI,GAAG,EAAC,IAAI,EAAE,IAAI,EAAC,CAAA;oBACnB,MAAK;gBACP;oBACE,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAC,CAAA;oBAClD,MAAK;aACR;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,KAAM,CAAW,CAAC,OAAO,EAAE,EAAC,CAAA;SAC5E;QACD,MAAM,OAAO,GAAG,EAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,CAAA;QACvC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAC5B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,SAAS,OAAO;;QACd,IAAI;YACF,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,0CAAE,KAAK,EAAE,CAAA;SAChC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;SACf;QACD,UAAU,GAAG,SAAS,CAAA;QACtB,kBAAkB,EAAE,CAAA;IACtB,CAAC;IAED,SAAS,gBAAgB,CAAC,IAAuB,EAAE,aAAoC;QACrF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE;YAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;SAC7C;IACH,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,IAAU;QACzC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,CAAC,MAAM;YAAE,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC7C,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACjC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACtB,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC3B,kCAAkC;QAClC,mCAAmC;QACnC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAA;IAC7C,CAAC;IAED,KAAK,UAAU,qBAAqB,CAAC,IAAU;QAC7C,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAClC,MAAM,UAAU,GAAG,uBAAuB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAA;gBAC9G,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAC,IAAI,EAAE,iBAAiB,EAAC,CAAC,CAAC,CAAC,CAAA;gBAChG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAa,EAAE,EAAE,CACvE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAC,CAAC,CAAC,CAAA;gBACjE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAA;aACjF;SACF;IACH,CAAC;IAED,SAAS,gBAAgB,CAAC,IAAU;QAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,CAAC,MAAM;YAAE,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC1B,IAAI,EAAC,WAAW,EAAC,GAAG,IAAI,CAAA;QAExB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE;YAC3C,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;SAChC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YAC3B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;YAC5C,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,UAAU,EAAkC,EAAE;gBACpE,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;aAC3F;SACF;IACH,CAAC;IAED,SAAS,iBAAiB,CAAC,IAAU;QACnC,+EAA+E;QAC/E,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC1B,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI;gBACF,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;oBAC3B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;oBAC9C,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,QAAwC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;iBACnI;gBACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;oBAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;wBACtC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;qBAClC;iBACF;gBACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;aAC/B;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,kBAAmB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;aACtD;QACH,CAAC,CAAA;IACH,CAAC;IAED,SAAS,qBAAqB,CAAC,IAAU;QACvC,wEAAwE;QACxE,sDAAsD;QACtD,8CAA8C;QAC9C,gEAAgE;QAChE,yEAAyE;QACzE,2EAA2E;QAC3E,sEAAsE;QACtE,2CAA2C;QAC3C,oDAAoD;QACpD,iEAAiE;QACjE,0EAA0E;QAC1E,oDAAoD;;QAEpD,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,YAAY,EAAE;YAChB,MAAM,EAAC,MAAM,EAAC,GAAG,YAAY,CAAA;YAC7B,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAA;YAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE;gBACjD,IAAI,CAAA,MAAA,CAAC,CAAC,MAAM,CAAC,KAAK,0CAAE,IAAI,MAAK,OAAO,EAAE;oBACpC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;iBAC9B;aACF;SACF;IACH,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,IAAU,EAAE,MAAmB;QACzD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,CAAC,MAAM;YAAE,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;QACzB,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACtE,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,CAAA;QAC/C,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,WAAW,CAAA;IACtC,CAAC;IAED,SAAS,aAAa,CAAC,EAAqB,EAAE,MAA0B;QACtE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAM;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,CAAC,CAAC,KAAK,0CAAE,IAAI,MAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,EAAA,CAAC,CAAA;QAC5E,IAAI,MAAM;YAAE,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,SAAS,kBAAkB,CACzB,SAA6B,EAC7B,IAA+D,EAC/D,MAA0B,EAC1B,MAAc,EACd,GAAc;QAEd,IAAI,MAAM,IAAI,uBAAuB,IAAI,MAAM,EAAE;YAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,sCAAsC,CAAC,CAAA;YAC/D,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,EAAC,SAAS,EAAE,MAAM,EAAC,CAAC,CAAA;SACxE;aAAM,IAAI,sBAAsB,IAAI,IAAI,EAAE;YACzC,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;YACxD,IAAI,MAAM,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,cAAc,CAAC,CAAA;gBACvC,MAAM,CAAC,WAAW,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAA8B,CAAC,CAAA;aAC/G;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAA;gBAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC3D,QAAQ,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;aACxE;SACF;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,EAAE,CAAC,CAAA;SAC/B;IACH,CAAC;IAED,SAAS,mBAAmB,CAAC,SAAwB,EAAE,UAAuB;QAC5E,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/D,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;IACzD,CAAC;IAED,SAAS,oBAAoB,CAAC,SAAwB,EAAE,UAAuB;QAC7E,QAAQ,SAAS,EAAE;YACjB,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAC,CAAA;YACpC,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE;wBACL,SAAS,EAAE,EAAE;wBACb,KAAK,EAAE;4BACL,GAAG,EAAE,GAAG;4BACR,KAAK,EAAE,GAAG;4BACV,GAAG,EAAE,IAAI;yBACV;wBACD,WAAW,EAAE,IAAI;wBACjB,UAAU;qBACX;iBACF,CAAA;SACJ;IACH,CAAC;IAED,SAAS,yBAAyB,CAAC,SAA8B;QAC/D,OAAO,CACL,CAAC,sBAAsB,IAAI,YAAY,CAAC,SAAS,IAAI,sBAAsB,IAAI,cAAc,CAAC,SAAS,CAAC;YACxG,CAAC,CAAC,CAAC,SAAS,IAAI,uBAAuB,IAAI,MAAM,CAAC,CACnD,CAAA;IACH,CAAC;IAOD,SAAS,kBAAkB;QACzB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;IAChC,CAAC;IAED,SAAS,gBAAgB;QACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAA;QAC7D,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,YAAY,gBAAgB,IAAI,MAAM,YAAY,gBAAgB,CAAC;YAAE,OAAM;QACzG,OAAO,EAAC,KAAK,EAAE,MAAM,EAAC,CAAA;IACxB,CAAC;IAED,mDAAmD;IACnD,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,gCAAgC;IAChC,MAAM;IACN,IAAI;IAEJ,SAAS,WAAW,CAAC,CAAc,EAAE,KAAoB,EAAE,MAAe;QACxE,MAAM,MAAM,GAAG,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAA;QACrF,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAAA;IAC5C,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC,CAAC,EAAE,CAAA;AAaJ,6GAA6G;AAC7G,SAAS,kBAAkB;IACzB,MAAM,wBAAwB,GAAG;QAC/B,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;KACT,CAAA;IAED,MAAM,SAAS,GAAG,EAAE,CAAA;IAEpB,SAAS,YAAY,CAAC,GAAc;QAClC,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnD,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACnD,IAAI;gBACF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM;oBACjC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,EAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC/F,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;gBACrB,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,CAAA;gBACpD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;aAC1B;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;gBACpC,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAA;IACH,CAAC;IAED,SAAS,YAAY,CAAC,GAAc;QAClC,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACtE,IAAI;gBACF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM;oBACjC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;oBACrF,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;gBACrB,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,CAAA;gBAC/C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;aAC1B;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;gBACpC,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAA;IACH,CAAC;IAED,SAAS,YAAY,CAAC,MAAc;QAClC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAQ,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAC/G,CAAC;IAED,SAAS,OAAO,CAAC,GAAG,EAAgB;QAClC,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;QACxE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAa,EAAE,EAAE;YAClC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;YAChB,OAAO,MAAM,GAAG,CAAC,CAAC,UAAU,CAAA;QAC9B,CAAC,EAAE,CAAC,CAAC,CAAA;QACL,OAAO,CAAC,CAAA;IACV,CAAC;IAED,SAAS,QAAQ;QACf,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,UAAU,CACnC,kEAAkE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACzG,CAAA;IAED,MAAM,eAAe,GAAG,IAAI,KAAK,CAAC,GAAG,CAA2B,CAAA;IAChE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAE1D,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAEpC,SAAS,WAAW,CAAC,CAAS;QAC5B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAClC,OAAO,CAAC,CAAA;IACV,CAAC;IAED,SAAS,WAAW,CAAC,CAAa;QAChC,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACjE,OAAO,CAAC,CAAA;IACV,CAAC;IAED,SAAS,eAAe,CAAC,CAAa;QACpC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;QAElC,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;YAC/B,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;YACpC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9D,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACnE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;SACzC;QAED,IAAI,GAAG,GAAG,CAAC;YAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;QACzC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;QAE/C,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,SAAS,eAAe,CAAC,GAAe;QACtC,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QACpB,IAAI,GAAG,GAAG,CAAC;YAAE,OAAM;QACnB,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAExB,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;YAC/B,GAAG,EAAE,CAAA;YACL,IAAI,EAAE,CAAA;YACN,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;gBAC/B,GAAG,EAAE,CAAA;gBACL,IAAI,EAAE,CAAA;aACP;SACF;QAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;QAElC,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,OAAO,CAAC,GAAG,GAAG,EAAE;YACd,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACtC,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAM;YAChG,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;YACxC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;YAC/C,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;SAC/C;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO;QACL,cAAc,EAAE,EAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAC;QAC9D,YAAY;QACZ,WAAW;QACX,WAAW;QACX,eAAe;QACf,eAAe;KAChB,CAAA;AACH,CAAC;AAED,2GAA2G;AAC3G,sGAAsG;AACtG,SAAS,cAAc;IAYrB,+CAA+C;IAC/C,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAC,IAAI,EAAgB,EAAE,EAAE;QAC/D,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,0CAA0C;IAC1C,IAAI,mBAAmB,IAAI,IAAI,EAAE;QAC/B,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,EAAE,EAAC,WAAW,EAAM,EAAE,EAAE;YACjE,IAAI;gBACF,MAAM,EAAC,SAAS,EAAE,MAAM,EAAC,GAAG,WAAW,CAAC,OAAO,CAAA;gBAC/C,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,WAAW,CAAA;gBACxC,MAAM,cAAc,CAAC,EAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC,CAAA;gBAC7D,IAAI,CAAC,WAAW,CAAC,EAAC,MAAM,EAAE,wBAAwB,EAAC,CAAC,CAAA;aACrD;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,WAAW,CAAC,EAAC,OAAO,EAAE,yBAA0B,CAAW,CAAC,OAAO,EAAE,EAAC,CAAC,CAAA;aAC7E;QACH,CAAC,CAAC,CAAA;KACH;IAED,KAAK,UAAU,cAAc,CAAC,EAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAY;QAC9E,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACjD,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3D,QAAQ,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzE,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/call/index.html b/call/index.html new file mode 100644 index 0000000000..1e1fad9e12 --- /dev/null +++ b/call/index.html @@ -0,0 +1,52 @@ + + + + + + + + + + +
+
+ + + +
+
+ +
+
+ +
+ + + +
+ + + diff --git a/call/lz-string.min.js b/call/lz-string.min.js new file mode 100644 index 0000000000..2d1900a0d3 --- /dev/null +++ b/call/lz-string.min.js @@ -0,0 +1 @@ +var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;ne;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;ie;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString); diff --git a/call/style.css b/call/style.css new file mode 100644 index 0000000000..3d2941c71e --- /dev/null +++ b/call/style.css @@ -0,0 +1,41 @@ +html, +body { + padding: 0; + margin: 0; + background-color: black; +} + +#remote-video-stream { + position: absolute; + width: 100%; + height: 100%; + object-fit: cover; +} + +#local-video-stream { + position: absolute; + width: 30%; + max-width: 30%; + object-fit: cover; + margin: 16px; + border-radius: 16px; + top: 0; + right: 0; +} + +*::-webkit-media-controls { + display: none !important; + -webkit-appearance: none !important; +} +*::-webkit-media-controls-panel { + display: none !important; + -webkit-appearance: none !important; +} +*::-webkit-media-controls-play-button { + display: none !important; + -webkit-appearance: none !important; +} +*::-webkit-media-controls-start-playback-button { + display: none !important; + -webkit-appearance: none !important; +} diff --git a/call/ui.js b/call/ui.js new file mode 100644 index 0000000000..3ef8d32f2d --- /dev/null +++ b/call/ui.js @@ -0,0 +1,125 @@ +;(async function run() { + // const START_E2EE_CALL_BTN = "start-e2ee-call" + // const START_CALL_BTN = "start-call" + const URL_FOR_PEER = "url-for-peer" + // const COPY_URL_FOR_PEER_BTN = "copy-url-for-peer" + const DATA_FOR_PEER = "data-for-peer" + // const COPY_DATA_FOR_PEER_BTN = "copy-data-for-peer" + const PASS_DATA_TO_PEER_TEXT = "pass-data-to-peer" + const SIMPLEX_CHAT_COMMAND = "simplex-chat-command" + const COPY_SIMPLEX_CHAT_COMMAND_BTN = "copy-simplex-chat-command" + const COMMAND_TO_PROCESS = "command-to-process" + const PROCESS_COMMAND_BTN = "process-command" + const urlForPeer = document.getElementById(URL_FOR_PEER) + const dataForPeer = document.getElementById(DATA_FOR_PEER) + const passDataToPeerText = document.getElementById(PASS_DATA_TO_PEER_TEXT) + const simplexChatCommand = document.getElementById(SIMPLEX_CHAT_COMMAND) + const commandToProcess = document.getElementById(COMMAND_TO_PROCESS) + const processCommandButton = document.getElementById(PROCESS_COMMAND_BTN) + // const startE2EECallButton = document.getElementById(START_E2EE_CALL_BTN) + // const {resp} = await processCommand({command: {type: "capabilities", useWorker: true}}) + // if (resp?.capabilities?.encryption) { + // startE2EECallButton.onclick = startCall(true) + // } else { + // startE2EECallButton.style.display = "none" + // } + // const startCallButton = document.getElementById(START_CALL_BTN) + // startCallButton.onclick = startCall() + // const copyUrlButton = document.getElementById(COPY_URL_FOR_PEER_BTN) + // copyUrlButton.onclick = () => { + // navigator.clipboard.writeText(urlForPeer.innerText) + // commandToProcess.style.display = "" + // processCommandButton.style.display = "" + // } + // const copyDataButton = document.getElementById(COPY_DATA_FOR_PEER_BTN) + // copyDataButton.onclick = () => { + // navigator.clipboard.writeText(dataForPeer.innerText) + // commandToProcess.style.display = "" + // processCommandButton.style.display = "" + // } + const copySimplexChatCommandButton = document.getElementById(COPY_SIMPLEX_CHAT_COMMAND_BTN) + copySimplexChatCommandButton.onclick = () => { + navigator.clipboard.writeText(simplexChatCommand.innerText) + if (simplexChatCommand.innerText.startsWith("/_call offer")) { + commandToProcess.style.display = "" + processCommandButton.style.display = "" + } + } + processCommandButton.onclick = () => { + sendCommand(JSON.parse(commandToProcess.value)) + commandToProcess.value = "" + } + const parsed = new URLSearchParams(document.location.hash.substring(1)) + let commandStr = parsed.get("command") + if (commandStr) { + // startE2EECallButton.style.display = "none" + // startCallButton.style.display = "none" + await sendCommand(JSON.parse(decodeURIComponent(commandStr))) + } + + // function startCall(encryption) { + // return async () => { + // let aesKey + // if (encryption) { + // const key = await crypto.subtle.generateKey({name: "AES-GCM", length: 256}, true, ["encrypt", "decrypt"]) + // const keyBytes = await crypto.subtle.exportKey("raw", key) + // aesKey = callCrypto.decodeAscii(callCrypto.encodeBase64url(new Uint8Array(keyBytes))) + // } + // startE2EECallButton.style.display = "none" + // startCallButton.style.display = "none" + // await sendCommand({type: "start", media: "video", aesKey, useWorker: true}) + // } + // } + + async function sendCommand(command) { + try { + console.log(command) + const {resp} = await processCommand({command}) + console.log(resp) + switch (resp.type) { + case "offer": { + const {media} = command + const {offer, iceCandidates, capabilities} = resp + const aesKey = capabilities.encryption ? command.aesKey : undefined + const peerWCommand = {type: "offer", offer, iceCandidates, media, aesKey, useWorker: true} + const url = new URL(document.location) + parsed.set("command", encodeURIComponent(JSON.stringify(peerWCommand))) + url.hash = parsed.toString() + urlForPeer.innerText = url.toString() + dataForPeer.innerText = JSON.stringify(peerWCommand) + + const webRTCCallOffer = {callType: {media, capabilities}, rtcSession: {rtcSession: offer, rtcIceCandidates: iceCandidates}} + const peerChatCommand = `/_call offer @${parsed.get("contact_id")} ${JSON.stringify(webRTCCallOffer)}` + simplexChatCommand.innerText = peerChatCommand + + // copyUrlButton.style.display = "" + // copyDataButton.style.display = "" + copySimplexChatCommandButton.style.display = "" + return + } + case "answer": { + const {answer, iceCandidates} = resp + const peerWCommand = {type: "answer", answer, iceCandidates} + dataForPeer.innerText = JSON.stringify(peerWCommand) + + const webRTCSession = {rtcSession: answer, rtcIceCandidates: iceCandidates} + const peerChatCommand = `/_call answer @${parsed.get("contact_id")} ${JSON.stringify(webRTCSession)}` + // copyUrlButton.style.display = "none" + // copyDataButton.style.display = "" + copySimplexChatCommandButton.style.display = "" + simplexChatCommand.innerText = peerChatCommand + return + } + case "ok": + if ((command.type = "answer")) { + console.log("connecting") + commandToProcess.style.display = "none" + processCommandButton.style.display = "none" + } + return + } + } catch (e) { + console.log("error: ", e) + } + } +})() diff --git a/community-vouchers/index.html b/community-vouchers/index.html new file mode 100644 index 0000000000..d1800a0058 --- /dev/null +++ b/community-vouchers/index.html @@ -0,0 +1,788 @@ + + + + + + + + Simplex Chat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + +
+

Community Vouchers

+

Published: Oct 03, 2025

+

https://simplex.chat

+

SimpleX is a privacy-focused messaging app that uses end-to-end encryption to ensure that your conversations remain private and secure. We believe that everyone has the right to communicate freely and securely, without fear of surveillance or censorship.

+

To support our mission of promoting privacy and secure communication, we are excited to announce the launch of our Community Voucher Program. This program is designed to help individuals and organizations that may not have the financial means to access secure messaging services.

+

Through the Community Voucher Program, we will be providing free access to SimpleX for individuals and organizations that meet certain criteria. This includes:

+
    +
  • Non-profit organizations that work to promote privacy and secure communication
  • +
  • Activists and journalists who need secure communication tools to protect their sources and information
  • +
  • Individuals who are at risk of surveillance or censorship due to their political beliefs or activities
    +To apply for a Community Voucher, simply fill out the application form on our website. We will review each application carefully and provide vouchers to those who meet our criteria.
    +We believe that everyone deserves access to secure communication tools, and we are committed to making SimpleX accessible to as many people as possible. If you know someone who could benefit from our Community Voucher Program, please share this information with them.
    +Thank you for your support in promoting privacy and secure communication!
    +Originally published at https://simplex.chat/community-vouchers
  • +
+
+
+ + + + + + + + diff --git a/connect-team/index.html b/connect-team/index.html new file mode 100644 index 0000000000..e5a4b9f905 --- /dev/null +++ b/connect-team/index.html @@ -0,0 +1,21 @@ + + + + + + + SimpleX Chat - connect to the team + + + + + + + + + + + +

Connect to the team

+ + diff --git a/contact/index.html b/contact/index.html new file mode 100644 index 0000000000..faf16d6f6e --- /dev/null +++ b/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received an address to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/cs/contact/index.html b/cs/contact/index.html new file mode 100644 index 0000000000..5412d9df21 --- /dev/null +++ b/cs/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Byl vám zaslán odkaz pro připojení na SimpleX Chat

+

K vytvoření připojení:

+ +
+

Instalace aplikace SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Se připojit v aplikaci

+ + + Otevřete aplikaci Simplex + +
+

2

+
+
+ +
+

Klepněte na tlačítko ‘připojit‘ v aplikaci

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Připojit SimpleX

+

Zveme vás k účasti na konverzaci

+ + + +

Přihlaste se k odběru novinek

+ +
+ + + +
+ +
+ +

Získat SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/cs/fdroid/index.html b/cs/fdroid/index.html new file mode 100644 index 0000000000..eed8ed6af6 --- /dev/null +++ b/cs/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat přes F-Droid

+ +
+ +
+

SimpleX Chat repozitář

+
+
+

Stabilní a beta verze vytvořené vývojáři

+

Chcete-li jej přidat do vašeho F-Droid clienta, naskenujte QR kód nebo použijte tuto adresu URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Otisk podpisového klíče (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repozitář

+ +

Stabilní verze vytvořené F-Droid.org

+

Vydání v tomto repozitáři se provádí o několik dní později.

+

SimpleX Chat a F-Droid.org repozitáře jsou podepsané různými klíči. Chcete-li přepnout, prosím exportujte chat databázi a přeinstalujte aplikaci.

+
+
+ +
+
+ + + + + + + + + + diff --git a/cs/index.html b/cs/index.html new file mode 100644 index 0000000000..4c517e4df6 --- /dev/null +++ b/cs/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/cs/invitation/index.html b/cs/invitation/index.html new file mode 100644 index 0000000000..e5877d9c96 --- /dev/null +++ b/cs/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Byl vám zaslán odkaz pro připojení na SimpleX Chat

+

K vytvoření připojení:

+ +
+

Instalace aplikace SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Se připojit v aplikaci

+ + + Otevřete aplikaci Simplex + +
+

2

+
+
+ +
+

Klepněte na tlačítko ‘připojit‘ v aplikaci

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Připojit SimpleX

+

Zveme vás k účasti na konverzaci

+ + + +

Přihlaste se k odběru novinek

+ +
+ + + +
+ +
+ +

Získat SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/cs/learn-more/index.html b/cs/learn-more/index.html new file mode 100644 index 0000000000..86bdc2171b --- /dev/null +++ b/cs/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Proč je SimpleX jedinečný

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Máte naprosté soukromí

+
+ +
+ +
+

+ SimpleX chrání soukromí vašeho profilu, kontaktů a metadat a skrývá je před servery SimpleX sítě a jakýmikoli pozorovateli. +

+

+ Na rozdíl od jakékoli jiné existující síti pro zasílání zpráv nemá SimpleX žádné identifikátory přiřazené uživatelům — ani náhodná čísla. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Jste chráněni
před spamem a zneužitím

+
+ +
+ +
+

+ Protože na SimpleX síti nemáte žádný identifikátor nebo pevnou adresu, nikdo vás nemůže kontaktovat pokud nenasdílíte jednorázovou nebo dočasnou uživatelskou adresu, jako QR kód nebo odkaz. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Vy kontrolujete vaše data

+
+ +
+ +
+

+ SimpleX Chat ukládá všechna uživatelská data pouze na klientských zařízeních pomocí přenosného šifrovaného databázového formátu, který lze exportovat a přenést na jakékoli podporované zařízení. +

+

+ End-to-end šifrované zprávy jsou dočasně uchovávány na přenosových serverech SimpleX, dokud nejsou přijaty, poté jsou trvale odstraněny. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Vlastníte síť SimpleX

+
+ +
+ +
+

+ Síť SimpleX je plně decentralizovaná a nezávislá na jakékoli kryptoměně nebo jakékoli jiné síti než internetu. +

+

+ SimpleX můžete použít s vašimi vlastními servery nebo s námi poskytovanými servery — a přesto se připojit k libovolnému uživateli. +

+ +
+ + + Další informace + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkce

+ +
+ +
+
+ + +
+

E2E šifrované zprávy s Markdown a editací

+
+ +
+
+ + +
+

E2E šifrované
obrázky, videa a soubory

+
+ +
+
+ + +
+

E2E-šifrované decentralizované skupiny — pouze uživatelé vědí, že existují

+
+ +
+
+ + +
+

Hlasové zprávy šifrované E2E

+
+ +
+
+ + +
+

Mizící tajné konverzace

+
+ +
+
+ + +
+

E2E šifrované
hlasové a videohovory

+
+ +
+
+ + +
+

Přenosné šifrované úložiště aplikace — přesuňte profil do jiného zařízení

+
+ +
+
+ + +
+

režim Inkognito —
Unikátní pro SimpleX Chat

+
+ +
+
+
+ + +
+
+

Co dělá SimpleX soukromým

+ +
+
+ + +
+
+ + +
+
+

Dočasné anonymní párové identifikátory

+
+ +

SimpleX používá dočasné anonymní párové adresy a pověření pro každého uživatele nebo člena skupiny.

+ +

Umožňuje doručovat zprávy bez identifikátoru uživatelských profilů, což poskytuje lepší soukromí metadat než alternativy.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Out-of-band
výměna klíčů

+
+ +

Mnoho komunikačních sítí je zranitelných vůči útokům MITM ze strany serverů nebo poskytovatelů sítí.

+ +

Aby se tomu zabránilo, aplikace SimpleX předávají jednorázové klíče mimo pásmo, když sdílíte adresu jako odkaz nebo QR kód.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

2-vrstvé
end-to-end šifrování

+
+ +

Double-ratchet protokol —
OTR messaging s dokonalým dopředným utajením a obnovou po vloupání.

+ +

NaCL kryptobox v každé frontě, aby se zabránilo korelaci provozu mezi frontami zpráv, pokud je ohroženo TLS.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Ověření integrity
zprávy

+
+ +

Aby byla zaručena integrita, jsou zprávy postupně číslovány a obsahují kontrolní součet předchozí zprávy.

+ +

Pokud je jakákoli zpráva přidána, odstraněna nebo změněna, příjemce bude upozorněn.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Další vrstva
šifrování serveru

+
+ +

Další vrstva šifrování serveru pro doručení příjemci, aby se zabránilo korelaci mezi přijatým a odeslaným serverovým provozem, pokud je protokol TLS ohrožen.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Smíchání zpráv
ke snížení korelace

+
+ +

Servery SimpleX fungují jako smíšené uzly s nízkou latencí — příchozí a odchozí zprávy mají různá pořadí.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Zabezpečený ověřený
přenos TLS

+
+ +

Pro připojení klient-server se používá pouze protokol TLS 1.2/1.3 se silnými algoritmy.

+ +

Otisk serveru a vazba kanálu zabraňují útokům MITM a replay.

+ +

Obnovení připojení je zakázáno, k zabránění útokům na relace.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Volitelný
přístup přes Tor

+
+ +

Pro ochranu vaší IP adresy můžete přistupovat k serverům přes Tor nebo jinou transportní překryvnou síť.

+ +

Pro použití SimpleX přes Tor prosím nainstalujte Orbot aplikaci a povolte SOCKS5 proxy (nebo VPN na iOS).

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Jednosměrné
fronty zpráv

+
+ +

Každá fronta zpráv předává zprávy v jednom směru s různými adresami pro odesílání a přijímání.

+ +

Snižuje vektory útoku ve srovnání s tradičními zprostředkovateli zpráv a dostupnými metadaty.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Více vrstev
odsazení obsahu

+
+ +

SimpleX používá odsazení obsahu pro každou šifrovací vrstvu, aby zmařil útoky na velikost zprávy.

+ +

Díky tomu vypadají zprávy různých velikostí pro servery a síťové pozorovatele stejně.

+ +
+

Klepnutím zavřete

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Síť

+

Simplex Chat poskytuje nejlepší soukromí tím, že kombinuje výhody P2P a federovaných sítí.

+ +
+
+
+ + +
+
+

Na rozdíl od P2P sítí

+

+ Všechny zprávy se odesílají přes servery, což zajišťuje lepší soukromí metadat a spolehlivé asynchronní doručování zpráv, přičemž se zamezuje mnoha problémům P2P sítí. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Na rozdíl od federovaných sítí

+

+ Přenosové servery SimpleX NEUKLADAJÍ uživatelské profily, kontakty a doručené zprávy, NEPŘIPOJUJÍ se k sobě a NEEXISTUJE ŽÁDNÝ adresář serverů. +

+
+
+ + + +
+
+ + +
+
+

SimpleX síť

+

+ servery poskytují jednosměrné fronty pro připojení uživatelů, ale nemají žádnou viditelnost grafu síťového připojení — pouze uživatelé mají. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX vysvětlení

+ + + + + + + +
+
+ +
+
1. Co vidí uživatel
+
+ +

+ Můžete vytvářet kontakty a skupiny a vést obousměrné konverzace, stejně jako v jakémkoli jiném messengeru. +

+

+ Jak může pracovat s jednosměrnými frontami a bez identifikátorů profilu uživatele? +

+
+
+ +
+
2. Jak to funguje
+
+ +

+ Pro každé připojení používáte dvě samostatné fronty zasílání zpráv k odesílání a přijímání zpráv prostřednictvím různých serverů. +

+

+ Servery předávají zprávy jednosměrně, aniž by měly úplný obraz o konverzacích nebo spojeních uživatele. +

+
+
+ +
+
3. Co vidí servery
+
+ +

+ Servery mají samostatné anonymní přihlašovací údaje pro každou frontu a nevědí, ke kterým uživatelům patří. +

+

+ Uživatelé mohou dále zlepšit soukromí metadat pomocí Tor pro přístup k serverům, což zabraňuje korelaci podle IP adresy. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Srovnání s jinými protokoly

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signál, velké platformyXMPP, MatrixP2P protokoly
Vyžaduje globální identituNe - soukromýAno 1Ano 2Ano 3
Možnost MITM útokuNe - bezpečný 4Ano 5AnoAno
Závislost na DNSNe - odolnýAnoAnoNe
Jedna nebo centralizovaná síťNe – decentralizovanýAnoNe - federovaný 6Ano 7
Centrální součást nebo jiný celosíťový útokNe - odolnýAnoAno 2Ano 8
+
+ +
+ +
+
+
    +
  1. Založeném obvykle na telefonním čísle a v některých případech uživatelském jménu
  2. +
  3. Adresy založené na DNS
  4. +
  5. Veřejný klíč nebo jiné globálně jedinečné ID
  6. +
  7. SimpleX relé nemůže ohrozit šifrování e2e. Ověřte bezpečnostní kód, který zmírňuje mimo pásmový útok na kanál
  8. +
  9. Pokud jsou servery operátora kompromitovány. Ověřte bezpečnostní kód v Signálu a nějaké jiné aplikaci ke zmírnění
  10. +
  11. Nechrání soukromí metadat uživatelů
  12. +
  13. Zatímco P2P jsou distribuovány, nejsou federované — fungují jako jediná síť
  14. +
  15. P2P sítě mají buď centrální autoritu, nebo může být ohrožena celá síť - viz zde
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/css/Raleway-Bold.woff2 b/css/Raleway-Bold.woff2 new file mode 100644 index 0000000000..4361c92c55 Binary files /dev/null and b/css/Raleway-Bold.woff2 differ diff --git a/css/Raleway-Medium.woff2 b/css/Raleway-Medium.woff2 new file mode 100644 index 0000000000..ec11f6bf70 Binary files /dev/null and b/css/Raleway-Medium.woff2 differ diff --git a/css/Raleway-Regular.woff2 b/css/Raleway-Regular.woff2 new file mode 100644 index 0000000000..ba1d8a9e29 Binary files /dev/null and b/css/Raleway-Regular.woff2 differ diff --git a/css/blog.css b/css/blog.css new file mode 100644 index 0000000000..3d244b9fcf --- /dev/null +++ b/css/blog.css @@ -0,0 +1,297 @@ +#article h1 { + font-size: 38px; + font-weight: 700; + letter-spacing: 0.02em; + background: -webkit-linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + background: linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; + + margin-bottom: 32px; +} + +@media (min-width:768px) { + #article h1 { + font-size: 45px; + margin-bottom: 50px; + } +} + +.dark #article h1 { + background: -webkit-linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + background: linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; +} + +section.container>div>p:nth-child(2) { + margin: 0; + font-size: 12px; + font-weight: 400; + letter-spacing: 0.03em; + color: + #3F484B; +} + +.dark section.container>div>p:nth-child(2) { + color: #A8B0B4; +} + +#article h2 { + font-size: 28px; + font-weight: 700; + color: #3F484B; +} + +@media (min-width:768px) { + #article h2 { + font-size: 38px; + } +} + +.dark #article h2 { + color: white; +} + +#article h3 { + font-size: 20px; + font-weight: 700; + letter-spacing: 0.02em; + color: #606C71; + + margin: 50px 0 25px 0; +} + +#article h4 { + font-size: 16px; + font-weight: 700; + letter-spacing: 0.02em; + color: #606C71; + + margin: 50px 0 25px 0; +} + +@media (min-width:768px) { + #article h3 { + font-size: 28px; + } + + #article h4 { + font-size: 20px; + } +} + +.dark #article h3, +.dark #article h4 { + color: white; +} + +#article p { + font-weight: 400; + font-size: 16px; + line-height: 24px; + color: black; + margin: 1.2rem 0; +} + +.dark #article p { + color: white; +} + +#article ul, +#article ol { + list-style-position: inside; + overflow: auto; + margin: 1rem 0; +} + +#article ul li, +#article ol li { + margin-right: 0; + margin-left: 0; + -webkit-margin-start: 1.1rem; + ; + color: #000; +} + +.dark #article ul li, +.dark #article ol li { + color: #fff; +} + +#article ul li::marker, +#article ol li::marker { + color: black; +} + +.dark #article ul li::marker, +.dark #article ol li::marker { + color: white; +} + +#article ul li a, +#article ol li a { + line-height: 30px; +} + +#article ul li { + list-style: disc; +} + +#article ol li { + list-style: decimal; +} + +#article a { + color: #0053D0; + text-decoration: underline; + text-underline-offset: 4px; +} + +.dark #article a { + color: #70F0F9; +} + +pre { + overflow: auto; +} + +.dark pre { + color: white; +} + +/* code{ + width: 100%; + height: auto; +} */ + + + +html { + scroll-behavior: smooth; +} + +/* h1::before, +h2::before, +h3::before { + display: block; + content: " "; + margin-top: -80px; + height: 80px; + visibility: hidden; + pointer-events: none; +} */ + +:focus { + outline: none; +} + +#article h1, +#article h2, +#article h3, +#article h4, +#article h5, +#article h6 { + clear: both; +} + +#article p img { + display: inline-block; +} + +#article img { + margin: 0.5rem 0 1rem 0; +} + +@media (min-width: 1024px) { + #article .float-to-left { + float: left; + margin-right: 3rem; + } + + #article .float-to-right { + float: right; + margin-left: 3rem; + } +} + +@media (max-width:768px) { + #article img { + width: 100%; + } +} + +#article ol>li { + list-style-position: inside !important; + margin-left: -0px !important; +} + +#article ol>li::marker { + font-weight: 500; +} + +#article blockquote { + padding-left: 1em; + border-left: 2px solid #c0c0c0; + font-style: italic; +} + +#article table { + border-collapse: collapse; + border-spacing: 0; + margin-bottom: 16px; +} + +#article th, +#article td { + border: 1px solid #d0d7de; + padding: 8px 16px; +} + +#article th { + font-weight: 600; +} + +#article table { + border-collapse: collapse; + margin-bottom: 16px; + border: 1px solid rgba(255, 255, 255, 0.15); +} + +.dark #article th, +.dark #article td { + border: 1px solid rgba(255, 255, 255, 0.15); +} + +.dark #article th { + background-color: rgba(255, 255, 255, 0.1); +} + +#article tr:nth-child(even) { + background-color: #ffffff; +} + +#article tr:nth-child(odd) { + background-color: #f6f8fa; +} + + +.dark #article tr:nth-child(even) { + background-color: rgba(255, 255, 255, 0.05); +} + +.dark #article tr:nth-child(odd) { + background-color: transparent; +} + +.dark #article td { + color: rgba(255, 255, 255, 0.8); +} + +.dark #article th { + color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/css/blogs.css b/css/blogs.css new file mode 100644 index 0000000000..a6e6d01789 --- /dev/null +++ b/css/blogs.css @@ -0,0 +1,214 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +body { + font-family: Raleway, Arial, Helvetica, sans-serif; +} +h2, +h3, +p { + color: #062d56; +} +h2 { + font-size: 2.2rem; +} +h3 { + font-size: 1.8rem; +} +h4 { + font-size: 1.4rem; +} +@media (max-width: 576px) { + h2 { + font-size: 1.9rem; + } + h3 { + font-size: 1.5rem; + } + h4 { + font-size: 1.2rem; + } +} +p { + font-size: 1.1rem; + letter-spacing: 0.6px; + line-height: 30px; +} +a { + color: tomato; + font-size: 1.1rem; + letter-spacing: 0.6px; + text-decoration: none; +} +input, +button, +span.button { + border: none; + outline: none; + padding: 0.8rem 1.5rem; + font-size: 1rem; + letter-spacing: 1px; + border-radius: 25px; +} +input { + color: #062d56; + font-family: Raleway, Arial, Helvetica, sans-serif; + background-color: #f1f1f1; + width: 280px; +} +button, +span.button { + display: inline-block; + background-color: #02C0FF; + color: #fff; + text-align: center; + cursor: pointer; +} +button:active, +button:hover, +span.button:active, +span.button:hover { + filter: saturate(125%); +} +header { + background-color: #fbd561; + width: 100%; + position: sticky; + top: 0; + z-index: 10; + border-bottom: 1px solid #fff; +} +nav { + display: flex; + align-items: center; + justify-content: space-between; +} +nav .nav__buttons { + display: flex; + align-items: center; + flex-direction: row-reverse; + gap: 1rem; +} +nav .nav__buttons .button { + padding: 0.4rem 1.5rem; +} +nav .logo { + padding: 0.6rem 0rem; +} +button, +span.button { + display: inline-block; + background-color: #02C0FF; + color: #fff; + font-family: Raleway; + text-align: center; + cursor: pointer; +} +button:active, +span.button:active { + filter: saturate(125%); +} +.github-button { + visibility: hidden; +} + +footer { + padding: 1rem 0rem; + background-color: #f8f8f6; +} +footer > div { + display: flex; + justify-content: space-between; + align-items: center; +} +@media (max-width: 992px) { + footer > div { + justify-content: center; + } +} +footer p { + display: flex; + align-items: center; + gap: 0.2rem; +} +@media (max-width: 576px) { + footer p { + text-align: center; + } +} +footer .copyright img { + width: 22px; + height: 22px; +} +footer a { + display: flex; + align-items: center; +} + +@font-face { + font-family: Raleway; + src: url(./Raleway-Regular.woff2); + font-weight: normal; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Medium.woff2); + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Bold.woff2); + font-weight: bold; +} +.container { + max-width: 1320px; + margin: auto; + padding: 0rem 2rem; +} +@media (max-width: 1200px) { + .container { + max-width: 1140px; + } +} +@media (max-width: 992px) { + .container { + max-width: 960px; + } + .d-none-992 { + display: none !important; + } +} +@media (max-width: 768px) { + .container { + max-width: 720px; + } + .d-none-768 { + display: none !important; + } +} +@media (max-width: 576px) { + .container { + max-width: 100%; + padding: 0rem 1rem; + } + .d-none-576 { + display: none !important; + } +} +@media (min-width: 992px) { + .d-none-on-mobile { + display: none; + } +} +@media (max-width: 890px) { + .d-none-890 { + display: none; + } +} + +img{ + max-width: 100%; + height: auto; +} \ No newline at end of file diff --git a/css/contact.css b/css/contact.css new file mode 100644 index 0000000000..706c6fe90a --- /dev/null +++ b/css/contact.css @@ -0,0 +1,487 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +body { + font-family: Raleway, Arial, Helvetica, sans-serif; +} +h2, +h3, +p, +ol { + color: #062d56; +} +h2 { + font-size: 2.2rem; +} +h3 { + font-size: 1.8rem; +} +@media (max-width: 576px) { + h2 { + font-size: 1.9rem; + } + h3 { + font-size: 1.5rem; + } +} +p, +ol { + font-size: 1.1rem; + letter-spacing: 0.6px; + line-height: 30px; +} +a { + color: tomato; + font-size: 1.1rem; + letter-spacing: 0.6px; + text-decoration: none; +} +input, +button, +span.button { + border: none; + outline: none; + padding: 0.8rem 1.5rem; + font-size: 1rem; + letter-spacing: 1px; + border-radius: 25px; +} +input { + color: #062d56; + font-family: Raleway, Arial, Helvetica, sans-serif; + background-color: #f1f1f1; + width: 280px; +} +button, +span.button { + display: inline-block; + background-color: #02c0ff; + color: #fff; + text-align: center; + cursor: pointer; +} +button:active, +button:hover, +span.button:active, +span.button:hover { + filter: saturate(125%); +} +header { + background-color: #fbd561; + width: 100%; + position: sticky; + top: 0; + z-index: 10; +} +nav { + display: flex; + align-items: center; + justify-content: space-between; +} +nav .nav__buttons { + display: flex; + align-items: center; + flex-direction: row-reverse; + gap: 1rem; +} +nav .nav__buttons .button { + padding: 0.4rem 1.5rem; +} +nav .logo { + padding: 0.6rem 0rem; +} +#simplex { + background-color: #fff; + padding: 5rem 0rem; +} +#simplex > div { + display: flex; + justify-content: space-between; + gap: 8rem; +} +#simplex > div .half { + flex: 1; + display: flex; + flex-direction: column; + gap: 1.5rem; + align-items: center; + justify-content: space-between; +} +@media (max-width: 1050px) { + #simplex > div { + flex-direction: column; + } +} +#simplex form.sign-up { + width: 100%; +} +#simplex form.sign-up div { + display: flex; + gap: 0.5rem; +} +@media (max-width: 576px) { + #simplex form.sign-up div { + flex-direction: column; + align-items: center; + width: inherit; + gap: 1rem; + } + #simplex form.sign-up div input { + display: block; + width: inherit; + } +} +#simplex #use-simplex a { + font-weight: 500; +} +#simplex #contacts { + display: flex; + flex-direction: column; + gap: 1rem; +} +#simplex #contacts span.button { + width: 100px; +} +#simplex #contacts a { + color: #062d56; + font-size: 1.1rem; + letter-spacing: 0.53px; + line-height: 25px; +} +#conn_req { + position: relative; + padding: 2rem 0rem; + overflow: hidden !important; +} +#conn_req h2 { + text-align: center; + margin-bottom: 2rem; +} +@media (max-width: 576px) { + #conn_req h2 { + text-align: left; + margin-bottom: 1rem; + } +} +#conn_req h2, +#conn_req p { + text-align: center; +} +#conn_req div.app__links { + width: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: 1.2rem; + line-height: 32px; + margin-bottom: 5rem; + vertical-align: middle; +} +#conn_req div.app__links a { + color: #062d56; + display: inline-flex; + font-weight: 400; + align-items: center; +} +#conn_req div.app__links a span { + font-weight: 500; + color: tomato; +} +@media (max-width: 576px) { + #conn_req div.app__links { + margin-bottom: 1.5rem; + } +} +#conn_req div.app__links img { + display: inline; + vertical-align: middle; +} +#conn_req .conn_req_uri { + display: flex; + justify-content: space-around; +} +@media (max-width: 1050px) { + #conn_req .conn_req_uri { + justify-content: flex-start; + gap: 10rem; + } +} +@media (max-width: 992px) { + #conn_req .conn_req_uri { + justify-content: center; + } +} +#conn_req .conn_req_uri > div, +#conn_req .conn_req_uri .conn_req__qrcode > div { + display: flex; + flex-direction: column; + align-items: center; + width: 360px; +} +@media (max-width: 576px) { + #conn_req .conn_req_uri > div, + #conn_req .conn_req_uri .conn_req__qrcode > div { + width: 100%; + } +} +#conn_req .conn_req_uri .conn_req__qrcode > div p { + padding: 0 2.4rem; + width: 360px; + margin-top: 40px; +} +@media (max-width: 576px) { + #conn_req .conn_req_uri .conn_req__qrcode > div p { + padding: 0; + width: 100%; + margin-top: 10px; + } +} +#conn_req .conn_req_uri .conn_req__qrcode > div .open-in-mobile { + padding: 0 2.4rem; + width: 360px; + margin: 30px 0 20px 0; +} +@media (max-width: 576px) { + #conn_req .conn_req_uri .conn_req__qrcode > div .open-in-mobile { + padding: 0; + width: 100%; + } +} +@media (min-width: 992px) { + #conn_req .conn_req_uri .open-in-mobile { + display: none; + } +} +@media (max-width: 576px) { + #conn_req .conn_req_uri .open-in-mobile { + display: flex; + align-items: center; + justify-content: center; + } + #conn_req .conn_req_uri .open-in-mobile a span { + padding: 0.8rem 2rem; + font-size: 1.3rem; + font-weight: 500; + } +} +#conn_req .conn_req_uri .conn_req__qrcode { + position: relative; + display: flex; + align-items: center; + justify-content: flex-start; +} +@media (max-width: 576px) { + #conn_req .conn_req_uri .conn_req__qrcode { + flex: 1; + } +} +#conn_req .conn_req_uri .conn_req__qrcode > div { + z-index: 2; +} +#conn_req .conn_req_uri .conn_req__qrcode img { + position: absolute; + width: 460px; + top: -3rem; +} +#conn_req .conn_req_uri .content_copy_with_tooltip { + display: flex; + align-items: flex-end; + gap: 1rem; + position: relative; +} +#conn_req .conn_req_uri .content_copy_with_tooltip .tooltip { + position: absolute; + display: inline-block; + right: -2rem; + bottom: 0; +} +#conn_req .conn_req_uri .content_copy_with_tooltip textarea { + word-break: break-all; + width: 360px; + height: 360px; + resize: none; + outline: none; + padding: 1rem; + box-sizing: border-box; + border-radius: 7px; + border-color: #ccc; +} +#conn_req .conn_req_uri canvas { + width: 100%; + height: auto; + margin-top: 20px; +} +@media (max-width: 576px) { + #conn_req .conn_req_uri canvas { + margin-top: 0px; + align-self: center; + } +} +#conn_req .conn_req_uri a.chat-for-terminal { + font-weight: 500; +} +#conn_req .content, +#install_chat .content { + font-family: "Courier New", Courier, monospace; + font-size: 1rem; + color: #000; +} +#conn_req .content_copy:hover, +#install_chat .content_copy:hover { + cursor: pointer; +} +#conn_req .tooltip, +#install_chat .tooltip { + position: relative; + display: inline-block; + font-family: Raleway, Arial, Helvetica, sans-serif; +} +#conn_req .tooltip .tooltiptext, +#install_chat .tooltip .tooltiptext { + visibility: hidden; + width: 140px; + background-color: rgba(255, 255, 255, 0.8); + text-align: center; + border: 1px solid #ccc; + border-radius: 4px; + padding: 5px; + position: absolute; + z-index: 1; + bottom: 150%; + left: 50%; + margin-left: -75px; + opacity: 0; + transition: opacity 0.3s; + font-size: 14px; +} +#conn_req .tooltip .tooltiptext::after, +#install_chat .tooltip .tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #062d56 rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0); +} +#conn_req .tooltip:hover .tooltiptext, +#install_chat .tooltip:hover .tooltiptext { + visibility: visible; + opacity: 1; +} +#install_chat { + background-color: #f8f8f6; + padding: 4rem 0rem; +} +#install_chat h2, +#install_chat .install__command, +#install_chat .github__redirection { + display: flex; + flex-direction: column; + align-items: center; +} +#install_chat .github__redirection a { + font-weight: 500; + color: #062d56; + letter-spacing: 0.53px; + text-decoration: underline; +} +#install_chat .github__redirection a.github { + vertical-align: -5px; +} +#install_chat > div { + display: flex; + flex-direction: column; + align-items: stretch; + gap: 1.5rem; +} +footer { + padding: 1rem 0rem; + background-color: #f8f8f6; +} +footer > div { + display: flex; + justify-content: space-between; + align-items: center; +} +@media (max-width: 992px) { + footer > div { + justify-content: center; + } +} +footer p { + display: flex; + align-items: center; + gap: 0.2rem; +} +@media (max-width: 576px) { + footer p { + text-align: center; + } +} +footer .copyright img { + width: 22px; + height: 22px; +} +footer a { + display: flex; + align-items: center; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Regular.woff2); + font-weight: normal; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Medium.woff2); + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Bold.woff2); + font-weight: bold; +} +.container { + max-width: 1320px; + margin: auto; + padding: 0rem 2rem; +} +@media (max-width: 1200px) { + .container { + max-width: 1140px; + } +} +@media (max-width: 992px) { + .container { + max-width: 960px; + } + .d-none-992 { + display: none !important; + } +} +@media (max-width: 768px) { + .container { + max-width: 720px; + } +} +@media (max-width: 576px) { + .container { + max-width: 100%; + padding: 0rem 1rem; + } + .d-none-576 { + display: none !important; + visibility: hidden !important; + } +} +@media (min-width: 992px) { + .d-none-on-mobile { + display: none !important; + visibility: hidden !important; + } +} /*# sourceMappingURL=contact.css.map */ diff --git a/css/demo.css b/css/demo.css new file mode 100644 index 0000000000..d4995d2cd7 --- /dev/null +++ b/css/demo.css @@ -0,0 +1,226 @@ +#demo { + padding-top: 3.5rem; + padding-bottom: 2.5rem; + text-align: center; +} + +#demo .all-users { + position: relative; + height: 640px; +} + +#demo .user { + position: absolute; +} + +#demo h3 { + position: absolute; + top: -60px; + text-align: left; + padding: 0 0 5px 7px; + color: #ffffbb; + mix-blend-mode: difference; + font-size: 1.5rem; + margin-bottom: 2rem; +} + +#demo .user .terminal { + text-align: left; + position: relative; + background-color: rgba(0, 0, 0, 0.8); + border-radius: 10px; + box-sizing: border-box; + padding: 10px 10px; + color: white; + overflow-y: hidden; +} + +#demo .user .terminal:before { + content: ""; + display: block; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 20px; + background: #666 url(/img/topbar.svg) no-repeat 8px center; + border-radius: 10px 10px 0 0; + z-index: 2; +} + +#demo .user .terminal input, +#demo .user .terminal .input, +#demo .user .terminal .display { + font-family: Menlo, "Lucida Console", Monaco, monospace; + font-size: 14px; + letter-spacing: 0.27px; + line-height: 28px; + position: absolute; + left: 10px; + right: 10px; +} + +#demo .user .terminal input, +#demo .user .terminal .input { + color: white; + display: block; + height: 30px; + bottom: 0; +} + +#demo .user .terminal input { + background-color: transparent; + display: none; + left: 25px; + width: calc(100% - 30px); +} + +#demo .user .terminal .display { + color: white; + text-align: left; + bottom: 30px; + z-index: 1; + overflow-x: hidden; + word-wrap: break-word; +} + +#demo .user .terminal .display .info { + color: white; +} + +#demo .user .terminal .display .error { + color: #ff6347; +} + +#demo .user .terminal .display .sent span.group { + color: cyan; +} + +#demo .user .terminal .display .received span.group { + color: yellow; +} + +#demo .user .terminal .display span { + font-family: Menlo, Monaco, "Lucida Console", monospace; + text-align: left; + margin: 0 0; +} + +#demo .user .terminal .display span.recipient { + color: cyan; +} + +#demo .user .terminal .display span.sender { + color: yellow; +} + +#demo .user .terminal .display span.secret { + color: rgba(0, 0, 0, 0.4); + background-color: rgba(0, 0, 0, 0.4); +} + +#demo .alice { + left: -30px; + top: 102px; +} + +#demo .bob { + left: 425px; + top: 0px; +} + +#demo .tom { + left: 425px; + top: 378px; +} + +#demo .all-users .terminal { + width: 410px; +} + +#demo .alice .terminal { + height: 340px; +} + +#demo .bob .terminal { + height: 305px; +} + +#demo .tom .terminal { + height: 280px; +} + + +/* Demo buttons */ +#demo button { + position: absolute; + width: 140px; + height: 40px; + bottom: 85px; + font-size: 16px; + border-radius: 34px; + color: white; + font-weight: 500; + letter-spacing: 0.02em; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1.25rem; + padding-right: 1.25rem; + background-color: #0053d0; +} + +.dark #demo button { + color: black; + background-color: #70f0f9; +} + +#demo button:disabled { + filter: brightness(75%); +} + +#demo .run-demo { + left: 20px; +} + +#demo .run-faster { + left: 20px; + display: none; +} + +#demo .try-it { + left: 180px; +} + +@media (max-width: 1240px) { + #demo .all-users { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + } + + #demo .alice { + position: relative !important; + top: 0; + left: 0; + } + + #demo button, + #demo .bob, + #demo .tom { + display: none; + } +} + +@media (max-width: 570px) { + #demo .alice .terminal { + width: 400px; + } +} + +@media (max-width: 440px) { + #demo .alice .terminal { + width: 330px; + height: 420px; + } +} \ No newline at end of file diff --git a/css/design3.css b/css/design3.css new file mode 100644 index 0000000000..82b0d1609d --- /dev/null +++ b/css/design3.css @@ -0,0 +1,1673 @@ +/* ======================= + GT-Walsheim (WOFF2) + Family: "GT-Walsheim" + Weights mapped: Thin(100), Ultra-Light(200), Light(300), Regular(400), + Medium(500), Bold(700), Ultra-Bold(800), Black(900) +======================= */ + +/* Thin */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Thin-Trial.woff2") format("woff2"); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Thin-Oblique-Trial.woff2") format("woff2"); + font-weight: 100; + font-style: oblique; + font-display: swap; +} + +/* Ultra-Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Trial.woff2") format("woff2"); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Oblique-Trial.woff2") format("woff2"); + font-weight: 200; + font-style: oblique; + font-display: swap; +} + +/* Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Light-Trial.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Light-Oblique-Trial.woff2") format("woff2"); + font-weight: 300; + font-style: oblique; + font-display: swap; +} + +/* Regular */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Regular-Trial.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Regular-Oblique-Trial.woff2") format("woff2"); + font-weight: 400; + font-style: oblique; + font-display: swap; +} + +/* Medium */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Medium-Trial.woff2") format("woff2"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Medium-Oblique-Trial.woff2") format("woff2"); + font-weight: 500; + font-style: oblique; + font-display: swap; +} + +/* Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Bold-Trial.woff2") format("woff2"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Bold-Oblique-Trial.woff2") format("woff2"); + font-weight: 700; + font-style: oblique; + font-display: swap; +} + +/* Ultra-Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Trial.woff2") format("woff2"); + font-weight: 800; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Oblique-Trial.woff2") format("woff2"); + font-weight: 800; + font-style: oblique; + font-display: swap; +} + +/* Black */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Black-Trial.woff2") format("woff2"); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Black-Oblique-Trial.woff2") format("woff2"); + font-weight: 900; + font-style: oblique; + font-display: swap; +} + +/* ======================= + Manrope (TTF) + Family: "Manrope" + Weights mapped per name +======================= */ + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraBold.ttf") format("truetype"); + font-weight: 800; + font-style: normal; + font-display: swap; +} + +:root { + --bg-grad: linear-gradient(9.2deg, + #000000 0%, + #131d49 52%, + #3f5598 65%, + #c3faff 85%, + #fff6e0 90%); + + --nav-color: #ffffff; + + /* Compute cover drawn size and inner safe frame (60% of full image on each axis) */ + /* --cover-bg-w: calc(min((3200 / 1920) * 100vw, (3200 / 1080) * 100vh)); + --cover-bg-h: calc(min((1800 / 1920) * 100vw, (1800 / 1080) * 100vh)); + --cover-safe-w: calc(var(--cover-bg-w) * 0.6); + --cover-safe-h: calc(var(--cover-bg-h) * 0.6); + --cover-vw: calc(var(--cover-safe-w) / 100); + --cover-vh: calc(var(--cover-safe-h) / 100); */ + /* 1920/3200 */ + /* 1080/1800 */ + + --cover-bg-w: calc(min((3200 / 1920) * 100vw, (3200 / 1080) * 100vh)); + --cover-bg-h: calc(min((1800 / 1920) * 100vw, (1800 / 1080) * 100vh)); + + /* Drawn background size derived from viewport — no cropping (contain-like) */ + --sec-w: calc(min((1920 / 1920) * 100vw, (1920 / 1080) * 100vh)); + --sec-h: calc(min((1080 / 1920) * 100vw, (1080 / 1080) * 100vh)); + --sec-vwu-desktop: calc(var(--sec-w) / 100); + --sec-vhu-desktop: calc(var(--sec-h) / 100); +} + +@media screen and (max-width: 767px) { + :root { + --sec-w: 100vw; + --sec-h: 100svh; + --sec-vwu-desktop: calc(var(--sec-w) / 100); + --sec-vhu-desktop: calc(var(--sec-h) / 100); + } +} + +body.change-nav-color { + --nav-color: #001796; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + scroll-behavior: smooth; + font-family: GT-Walsheim, Gilroy, Helvetica, sans-serif; +} + +html, +body { + background: #000; +} + +.hidden { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; +} + +.lock-scroll { + overflow: hidden !important; +} + +img { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +a, +p { + word-wrap: break-word; +} + +.gradient-text { + background: linear-gradient(90deg, + #019bfe 0%, + #64fdff 58%, + #c8feff 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +/* Let the PAGE (body) scroll so Safari collapses the address bar. + Keep .screen as a regular wrapper (no own scrolling). */ +.screen { + height: auto; + overflow: visible; +} + +/* Make the viewport the scroll snap container (works in iOS Safari) */ +html, +body { + scroll-snap-type: y mandatory; + scroll-behavior: smooth; + -webkit-overflow-scrolling: touch; +} + +section.page { + min-height: 100svh; + /* fallback */ + height: 100svh; + scroll-snap-align: start; + scroll-snap-stop: always; + /* requires a full swipe/scroll to leave */ + position: relative; + + display: flex; + justify-content: center; + align-items: center; + z-index: 2; +} + +.chrome-ios section.page, +.safari-ios section.page { + min-height: 110lvh; + /* fallback */ + height: 110lvh; + padding-bottom: calc(110lvh - 100svh); +} + +.chrome-android section.page { + min-height: 100lvh; + /* fallback */ + height: 100lvh; + padding-bottom: calc(100lvh - 100svh); +} + +section.page .area { + position: relative; + width: var(--sec-w); + height: var(--sec-h); +} + +/* --- COVER --- */ +section.cover { + background-image: url("/img/design_3/cover.jpg"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; +} + +section.cover div.content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + gap: calc(var(--sec-vhu-desktop) * 3.5); + width: var(--sec-w); + height: var(--sec-h); +} + +section.cover div.content h1 { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 800; + font-size: calc(var(--sec-vwu-desktop) * 11.4); + line-height: 0.9; + letter-spacing: -0.025em; + color: #ffffff; + text-align: center; + max-width: calc(var(--sec-vwu-desktop) * 25); +} + +section.cover div.content h2 { + font-family: "GT-Walsheim", "Manrope", sans-serif; + font-weight: 400; + font-size: calc(var(--sec-vwu-desktop) * 2.7); + letter-spacing: -0.025em; +} + +section.cover div.content p { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu-desktop) * 1.6); + align-items: center; + color: #ffffff; + max-width: calc(var(--sec-vwu-desktop) * 25); +} + +section.cover div.socials { + position: absolute; + width: var(--sec-w); + bottom: calc(var(--sec-vhu-desktop) * 3); + padding: 0 calc(var(--sec-vwu-desktop) * 4); + + display: flex; + align-items: center; + justify-content: flex-end; + gap: calc(var(--sec-vwu-desktop) * 0.6); + flex-wrap: wrap; +} + +section.cover div.socials a img { + width: auto; + height: calc(var(--sec-vhu-desktop) * 4.2); + border: #4f4f4f 1px solid; + border-radius: calc(var(--sec-vhu-desktop) * 0.8); +} + +section.cover div.socials a img.no-border { + border: none; +} + +/* --- MAIN SECTIONS --- */ +main { + position: relative; + isolation: isolate; +} + +main .section-bg { + position: sticky; + top: 0; + inset: 0; + height: 100lvh; + /* fallback */ + margin-bottom: -100lvh; + /* cancel own layout height */ + width: 100vw; + + background-image: var(--bg-grad); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + z-index: -1; + pointer-events: none; +} + +.page .area>.image:first-child { + position: absolute; + inset: 0; + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} + +.page-2 .image { + background-image: url("/img/design_3/section-2-desktop.webp"); +} + +.page-3 .image { + background-image: url("/img/design_3/section-3-desktop.webp"); +} + +.page-4 .image { + background-image: url("/img/design_3/section-4-desktop.webp"); +} + +.page-5 .image { + background-image: url("/img/design_3/section-5-desktop.webp"); +} + +@media screen and (max-width: 767px) { + .page .area>.image:first-child { + background-position: top; + } + + .page-2 .image { + background-image: url("/img/design_3/section-2-mobile.webp"); + background-size: cover !important; + height: 75%; + } + + .page-3 .image { + background-image: url("/img/design_3/section-3-mobile.webp"); + } + + .page-4 .image { + background-image: url("/img/design_3/section-4-mobile.webp"); + } + + .page-5 .image { + background-image: url("/img/design_3/section-5-mobile.webp"); + } +} + +.page .text-container { + position: relative; + color: white; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: calc(var(--sec-vhu-desktop) * 3.25); + margin-right: calc(var(--sec-vwu-desktop)*7.5); + margin-left: calc(var(--sec-vwu-desktop)*7.5); + width: fit-content; + z-index: 1; +} + +.page .text-container h2 { + font-family: "GT-Walsheim", "Manrope", sans-serif; + font-weight: 400; + font-size: calc(var(--sec-vwu-desktop)*4.94); + letter-spacing: -0.025em; + line-height: 1.05; + max-width: calc(var(--sec-vwu-desktop)*26); +} + +.page .text-container p { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu-desktop)*1.62); + max-width: calc(var(--sec-vwu-desktop)*23); +} + +.page .text-container p span { + font-weight: 500; +} + +.page .text-container a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu-desktop)*1.62); + text-decoration: underline; + text-decoration-line: underline; + text-decoration-thickness: 0.5px; + text-underline-offset: 4px; + max-width: calc(var(--sec-vwu-desktop)*14); +} + +.page-2 .text-container h2 { + max-width: calc(var(--sec-vwu-desktop)*26) !important; +} + +.page-2 .text-container p { + max-width: calc(var(--sec-vwu-desktop)*23) !important; +} + +.page-3 .text-container h2 { + max-width: calc(var(--sec-vwu-desktop)*29) !important; +} + +.page-3 .text-container p { + max-width: calc(var(--sec-vwu-desktop)*31) !important; +} + +.page-3 .text-container, +.page-4 .text-container { + margin-left: auto; +} + +.page-4 .text-container h2 { + max-width: calc(var(--sec-vwu-desktop)*26) !important; +} + +.page-4 .text-container p { + max-width: calc(var(--sec-vwu-desktop)*30) !important; +} + +.page-4 .text-container a { + max-width: calc(var(--sec-vwu-desktop)*30) !important; +} + +.page-5 .text-container h2 { + max-width: calc(var(--sec-vwu-desktop)*23) !important; +} + +.page-5 .text-container p { + max-width: calc(var(--sec-vwu-desktop)*30) !important; +} + +.page-6 .text-container p { + max-width: calc(var(--sec-vwu-desktop)*21) !important; +} + +.page-6 .text-container a { + max-width: calc(var(--sec-vwu-desktop)*21) !important; +} + +.roadmap>p:first-child { + font-weight: 500; + color: #64fdff; +} + +.roadmap>p:nth-child(2) { + font-weight: 500; +} + +.roadmap>p:nth-child(3) { + font-weight: 200; +} + +.roadmap p { + max-width: 30vw; +} + +.roadmap p.title span { + display: none; +} + +@media (max-width: 767px) { + + /* --- COVER --- */ + section.cover { + background-image: url("/img/design_3/cover-mobile.jpg"); + background-size: cover; + } + + section.cover div.content h1 { + font-size: 30vw; + max-width: calc(var(--sec-vwu-desktop) * 65); + } + + section.cover div.content h2 { + font-size: 7vw; + } + + section.cover div.content p { + font-size: 4.3vw; + max-width: calc(var(--sec-vwu-desktop) * 65); + } + + section.cover div.socials { + bottom: 32px; + gap: 10px; + justify-content: center; + } + + section.cover div.socials a img { + height: 40px; + } + + + /* --- MAIN SECTIONS --- */ + .page .text-container { + justify-content: flex-end; + align-items: flex-start; + gap: calc(var(--sec-vhu-desktop) * 3); + margin-right: 7vw !important; + margin-left: 7vw !important; + padding-bottom: 8vw; + max-width: fit-content !important; + } + + .page .text-container h2 { + font-weight: 400; + font-size: 12vw; + max-width: 75vw !important; + } + + .page .text-container p { + font-weight: 300; + font-size: 4.2vw; + max-width: 74vw !important; + } + + .page .text-container p span { + font-weight: 700; + } + + .page .text-container a { + font-weight: 300; + font-size: 4.2vw; + max-width: 74vw !important; + } + + .page-3 .text-container, + .page-4 .text-container { + margin-left: 0; + } + + .page-2 .text-container h2 { + max-width: 63vw !important; + } + + .page-3 .text-container h2 { + max-width: 85vw !important; + font-size: 13vw; + } + + .page-3 .text-container p { + max-width: 80vw !important; + } + + .page-4 .text-container h2 { + max-width: 80vw !important; + font-size: 13vw; + } + + .page-4 .text-container p { + max-width: 80vw !important; + } + + .page-4 .text-container a { + max-width: 80vw !important; + } + + .roadmap { + width: 85vw !important; + } + + .roadmap>p:first-child { + float: left; + } + + .roadmap p.title span { + display: inline; + } + + .roadmap p.title { + color: #64fdff; + } + + .roadmap>p { + font-weight: 400; + max-width: 90vw !important; + } +} + +.page-6 .group-images { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: calc(var(--sec-vwu-desktop) * 65); + padding: calc(var(--sec-vhu-desktop) * 10.5) calc(var(--sec-vwu-desktop) * 2.5); + z-index: 0; + + display: grid; + grid-template-columns: repeat(8, 1fr); + grid-template-rows: repeat(6, 1fr); + gap: calc(var(--sec-vwu-desktop) * 2.1); + z-index: 2; +} + +.page-6 .group-images img { + width: 100%; + height: auto; + border-radius: calc(var(--sec-vhu-desktop) * 1.8); +} + +@media screen and (max-width: 767px) { + .page-6 .group-images { + width: 100%; + height: 10%; + padding: calc(var(--sec-vhu-desktop) * 6) calc(var(--sec-vwu-desktop) * 3); + top: 0; + right: 0; + grid-template-columns: repeat(8, 1fr); + grid-template-rows: repeat(7, 1fr); + gap: calc(var(--sec-vwu-desktop) * 2.8); + } + + .page-6 .group-images img { + border-radius: calc(var(--sec-vhu-desktop) * 0.8); + } +} + +/* + Utility: position an image on the grid using CSS vars + Usage example: + + places the image starting at column 3, row 2, spanning 2 columns × 2 rows. +*/ +.page-6 .group-images>a.simplex-image { + --c: 4; + --r: 3; + --w: 2; + --h: 2; + margin: 1.15rem; +} + +.page-6 .group-images>a.group-image:nth-child(1) { + --c: 2; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(2) { + --c: 4; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(3) { + --c: 5; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(4) { + --c: 7; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(5) { + --c: 1; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(6) { + --c: 3; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(7) { + --c: 4; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(8) { + --c: 5; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(9) { + --c: 6; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(10) { + --c: 8; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(11) { + --c: 2; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(12) { + --c: 3; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(14) { + --c: 6; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(15) { + --c: 7; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(16) { + --c: 1; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(17) { + --c: 3; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(18) { + --c: 6; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(19) { + --c: 8; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(20) { + --c: 2; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(21) { + --c: 4; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(22) { + --c: 5; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(23) { + --c: 6; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(24) { + --c: 7; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(25) { + --c: 3; + --r: 6; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(26) { + --c: 4; + --r: 6; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(27) { + --c: 6; + --r: 6; + --w: 1; + --h: 1 +} + +@media screen and (max-width: 767px) { + .page-6 .group-images>a.simplex-image { + --c: 4; + --r: 4; + --w: 2; + --h: 2 + } + + .page-6 .group-images>a.group-image:nth-child(1) { + --c: 3; + --r: 1; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(2) { + --c: 6; + --r: 1; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(3) { + --c: 2; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(4) { + --c: 4; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(5) { + --c: 5; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(6) { + --c: 7; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(7) { + --c: 3; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(8) { + --c: 4; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(9) { + --c: 5; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(10) { + --c: 6; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(11) { + --c: 8; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(12) { + --c: 2; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(14) { + --c: 3; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(15) { + --c: 6; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(16) { + --c: 7; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(17) { + --c: 1; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(18) { + --c: 3; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(19) { + --c: 6; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(20) { + --c: 7; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(21) { + --c: 2; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(22) { + --c: 4; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(23) { + --c: 5; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(24) { + --c: 6; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(25) { + --c: 3; + --r: 7; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(26) { + --c: 4; + --r: 7; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(27) { + --c: 6; + --r: 7; + --w: 1; + --h: 1 + } +} + +.page-6 .group-images a { + grid-column: var(--c) / span var(--w, 1); + grid-row: var(--r) / span var(--h, 1); +} + + +/* NavBar */ +header#navbar { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 10; + background: none; + + display: flex; + align-items: center; + justify-content: center; + height: 54px; +} + +header#navbar>a.logo { + position: absolute; + left: 16px; + height: 100%; + display: flex; + align-items: center; +} + +header#navbar>a.logo img { + height: 32px; + width: auto; +} + +header#navbar nav#menu>ul>hr { + display: none; +} + +header#navbar nav#menu ul.sub-menu hr { + height: 1px; + width: 100%; + background: rgb(255, 255, 255); + opacity: 0.1; +} + +header#navbar ul { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 49px; + list-style: none; +} + +header#navbar ul a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + color: white; + text-decoration: none; + font-size: 16px; + font-weight: 500; + padding: 8px 0; + + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + white-space: nowrap; +} + +header#navbar ul a span { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +header#navbar ul a>span:first-child { + transform: translateY(-1.5px); +} + +header#navbar ul a span svg { + fill: #fff; + width: 10px; + height: auto; + transition: all 0.5s ease; +} + +@media screen and (min-width: 768px) { + header#navbar nav#menu>ul>li>a { + color: var(--nav-color); + } + + header#navbar nav#menu>ul>li>a svg { + fill: var(--nav-color); + } + + header#navbar nav#menu li.nav-link:hover span svg { + transform: rotate(180deg); + } +} + +header#navbar ul.sub-menu { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 0.5rem; + max-height: calc(100vh - 70px); + position: absolute; + background: #181e43; + top: calc(100% + 8px); + padding: 16px 0; + min-width: 180px; + border-radius: 8px; + transition: all .3s ease !important; + overflow: auto; + visibility: hidden; + opacity: 0; +} + +header#navbar ul.sub-menu li a { + padding: 3px 20px; + white-space: nowrap; + display: flex; + align-items: center; + gap: 4px; +} + +header#navbar ul.sub-menu li a img { + height: 1rem; +} + +header#navbar .nav-link.flag-container ul.sub-menu li a { + display: flex; + align-items: center; + gap: 16px; + white-space: nowrap; +} + +header#navbar nav#menu, +header#navbar nav#menu>ul { + height: 100%; +} + +header#navbar .nav-link { + position: relative; +} + +header#navbar .nav-link:hover .sub-menu, +header#navbar .nav-link:focus-within .sub-menu { + visibility: visible; + opacity: 1; + margin-top: 0; +} + +.flag-container>a { + background-color: transparent; + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + color: white; + text-decoration: none; +} + +.flag-container>a svg { + fill: #fff; + width: 10px; + height: auto; +} + +@media screen and (min-width: 768px) { + .flag-container>a { + color: var(--nav-color); + } + + .flag-container>a svg { + fill: var(--nav-color); + } +} + +.flag-container>a p { + font-size: 17px; + font-weight: 500; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + line-height: 1rem; + letter-spacing: 0.05em; + text-transform: uppercase; +} + +.flag-container .sub-menu a div { + display: flex; + align-items: center; + justify-content: center; +} + +.flag-container .sub-menu { + top: 100%; + right: 0; +} + +header#navbar button.theme-switch-btn { + display: flex; + align-items: center; + justify-content: center; + background-color: transparent; + border: none; +} + +header#navbar button.theme-switch-btn svg { + width: 18px; + height: auto; +} + +header#navbar button.theme-switch-btn svg path { + fill: white; + transition: all 0.3s ease; +} + +@media screen and (min-width: 768px) { + header#navbar button.theme-switch-btn svg path { + fill: var(--nav-color); + transition: all 0.3s ease; + } +} + +.right-links { + position: absolute; + right: 16px; + display: flex; + align-items: center; + gap: 1.5rem; +} + +button#cross-btn { + background-color: transparent; + border: none; + display: none; + align-items: center; + justify-content: center; + cursor: pointer; +} + +#cross { + fill: white; + width: 13px; + height: auto; +} + +#mobile-header { + display: none; + padding: 0 1rem; +} + +#mobile-header a.logo img { + height: 32px; +} + +#mobile-header button#hamburger { + height: 36px; + background-color: transparent; + border: none; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +#mobile-header button#hamburger svg { + fill: var(--nav-color) !important; + width: 20px; + height: auto; +} + +@media (max-width: 767px) { + #mobile-header { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 54px; + background: transparent; + + display: flex; + align-items: center; + justify-content: space-between; + z-index: 9; + } + + header#navbar { + height: 100%; + width: 100%; + background: #0a0f2b; + visibility: hidden; + opacity: 0; + transition: all .3s ease; + transform: translateX(-100%); + } + + header#navbar.open { + visibility: visible; + opacity: 1; + transform: translateX(0); + } + + header#navbar>a.logo { + height: fit-content; + top: 16px; + } + + header#navbar>a.logo img { + height: 28px; + } + + .right-links { + top: 16px; + } + + header#navbar ul a span svg { + width: 18px; + } + + header#navbar nav#menu>ul { + flex-direction: column; + justify-content: flex-start; + gap: 0; + } + + header#navbar nav#menu { + position: fixed !important; + top: 54px; + left: 0; + width: 100%; + height: calc(100% - 54px); + overflow: auto; + padding: 0.5rem 0; + } + + header#navbar nav#menu .nav-link { + width: 100%; + } + + header#navbar nav#menu .nav-link a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 300; + font-size: 18px; + width: 100%; + justify-content: space-between; + justify-content: flex-start; + gap: 10px; + padding: 0px; + padding: 6px 2rem; + } + + header#navbar nav#menu .nav-link>a { + font-size: 28px; + padding: 1rem 2rem; + } + + header#navbar nav#menu ul.sub-menu hr { + opacity: 0.2; + width: 100%; + } + + header#navbar nav#menu ul.sub-menu hr { + margin: 1rem 2rem; + width: calc(100% - 4rem); + } + + header#navbar nav#menu ul.sub-menu { + position: static; + } + + header#navbar nav#menu .sub-menu { + max-height: 0; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all .7s ease !important; + overflow: hidden; + border-radius: 0; + background-color: transparent; + margin-top: 0; + padding: 0rem 1.5rem; + gap: 0; + } + + header#navbar nav#menu .sub-menu li { + width: 100%; + } + + header#navbar nav#menu .sub-menu li a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + width: 100%; + } + + header#navbar nav#menu .active .sub-menu { + max-height: 1000px; + transform: translateY(0px); + padding: 0.5rem 1.5rem; + opacity: 1; + visibility: visible; + margin-top: 0; + } + + button#cross-btn { + display: flex; + cursor: pointer; + } +} + +/* underline animation on hover */ +@media (min-width:768px) { + .nav-link-text { + display: inline-block; + position: relative; + } + + .nav-link-text::before { + content: ""; + position: absolute; + width: 0; + height: 1px; + bottom: 0; + right: 0; + background-color: var(--nav-color); + transition: width 0.25s ease-out; + } + + .nav-link:hover .nav-link-text::before { + width: 100%; + left: 0; + right: auto; + } +} + +/* FOOTER STYLES */ +section.page.footer { + height: fit-content; + min-height: fit-content; +} + +@media screen and (max-width: 768px) { + section.page.footer { + height: 100lvh; + min-height: 100lvh; + } + + .chrome-ios section.page, + .safari-ios section.page { + min-height: 110lvh; + height: 110lvh; + padding-bottom: calc(110lvh - 100svh); + } +} + +.footer .container, +.footer .container-fluid, +.footer .container-xxl, +.footer .container-xl, +.footer .container-lg, +.footer .container-md, +.footer .container-sm { + width: 100%; + /* padding: 0 20px; */ + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + + .footer .container-sm, + .footer .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + + .footer .container-xl, + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 1140px; + } +} + +@media (min-width: 1400px) { + + .footer .container-xxl, + .footer .container-xl, + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 1320px; + } +} \ No newline at end of file diff --git a/css/doc.css b/css/doc.css new file mode 100644 index 0000000000..002d6bae0f --- /dev/null +++ b/css/doc.css @@ -0,0 +1,412 @@ +html { + scroll-behavior: smooth; +} + +header { + transition: none; +} + +:focus { + outline: none; +} + +#doc { + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +#doc code, +#doc kbd, +#doc pre, +#doc samp { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; + overflow-x: auto; + overflow-y: hidden; +} + +#doc p { + margin: 0 0 16px; + gap: 2px; + flex-wrap: wrap; + align-items: center; +} + +.dark #doc p { + color: white; +} + +#doc h1 { + font-size: 32px; + font-weight: 700; + letter-spacing: 0.02em; + background: -webkit-linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + background: linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; + + position: relative; + margin: 0px 0px 16px; + padding: 0px 0px 9.6px; +} + +#doc h2 { + font-size: 24px; + font-weight: 700; + color: #3F484B; + position: relative; + margin: 24px 0px 16px; + padding: 0 0 7.2px; +} + +#doc h3 { + font-size: 20px; + font-weight: 700; + letter-spacing: 0.02em; + color: #606C71; + margin: 24px 0px 16px; +} + +#doc h1::after, +#doc h2::after { + content: ''; + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 1px; + background-color: rgb(216, 222, 228); +} + +.dark #doc h1::after, +.dark #doc h2::after { + background-color: transparent; +} + +.dark #doc h1 { + background: -webkit-linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + background: linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; +} + +.dark #doc h2, +.dark #doc h3, +.dark #doc h4 { + color: white; +} + +#doc img { + max-width: 100%; +} + +#doc article ul { + overflow-x: auto; +} + +#doc ul, +#doc ol { + list-style-position: inside; + overflow: auto; + margin: 1rem 0; + padding-left: 1rem; +} + +#doc ul li, +#doc ol li { + margin-right: 0; + margin-left: 0; + -webkit-margin-start: 1.1rem; + color: #000; +} + +.dark #doc ul li, +.dark #doc ol li { + color: #fff; +} + +#doc ul li::marker, +#doc ol li::marker { + color: black; +} + +.dark #doc ul li::marker, +.dark #doc ol li::marker { + color: white; +} + +#doc ul li a, +#doc ol li a { + line-height: 30px; +} + +#doc ul li { + list-style: disc; +} + +#doc ol li { + list-style: decimal; +} + +#doc a { + color: #0053D0; + text-decoration: underline; + text-underline-offset: 4px; +} + +#doc h1 a { + -webkit-text-fill-color: #0053D0; + text-fill-color: #0053D0; +} + +.dark #doc a { + color: #70F0F9; +} + +.dark #doc h1 a { + -webkit-text-fill-color: #70F0F9; + text-fill-color: #70F0F9; +} + +#doc pre { + overflow: auto; +} + +.dark #doc pre { + color: white; +} + +#doc table { + display: block; + border-collapse: collapse; + width: max-content; + max-width: 100%; + overflow: auto; + margin-bottom: 1rem; + border: 1px solid #e1e4e8; +} + +#doc table th, +#doc table td { + border: 1px solid #e1e4e8; + padding: 6px 13px; +} + +#doc table td a { + display: inline-block; +} + +#doc table th { + font-weight: 600; + background-color: #f6f8fa; + text-align: left; +} + +#doc table tbody tr:nth-child(odd) { + background-color: #ffffff; +} + +#doc table tbody tr:nth-child(even) { + background-color: #fafbfc; +} + +.dark #doc table tr, +.dark #doc table th { + color: white; + background-color: transparent !important; +} + +#doc main { + display: flex; +} + +#doc main aside { + width: 320px; + height: calc(100vh - 66px); + position: sticky; + top: 66px; + overflow-y: auto; + background-color: #fff; +} + +.dark #doc main aside { + background-color: #17203D; +} + +#doc main aside ul { + margin: 0; + padding: 0; +} + +#doc main aside ul li { + list-style: none; + margin: 0; +} + +#doc main aside ul li a { + font-size: 14px; + display: block; + color: rgb(60, 60, 60); + text-decoration: none; +} + +#doc main aside ul li a:hover { + color: #000; +} + +.dark #doc main aside ul li a:hover { + color: #fff; +} + +#doc main aside ul li a.active { + color: #0053D0; +} + +.dark #doc main aside ul li a.active { + color: #70F0F9; +} + +#doc main aside p { + margin: 0; + font-weight: 700; + letter-spacing: .8px; + margin-top: 1.2rem; + margin-bottom: .4rem; +} + +#doc main article { + width: calc(100vw - 320px); +} + +@media (max-width: 1024px) { + #doc main aside { + position: fixed; + top: 0; + left: 0; + height: 100vh; + z-index: 100; + transition: all ease .3s; + transform: translateX(-100%); + } + + #doc main.overlay aside { + transform: translateX(0); + } + + #doc main.overlay::after { + content: ""; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #F3F6F7; + opacity: 0.9; + z-index: 99; + } + + .dark #doc main.overlay::after { + background-color: #0C0B13; + } + + #doc main article { + width: 100%; + } +} + +#doc article>div { + max-width: 870px; + margin: 0 auto; + padding: 16px 32px 32px 32px; +} + +@media (max-width: 1024px) { + #doc article>div { + max-width: 600px; + padding-left: 0; + padding-right: 0; + } +} + +#doc .hash-link { + opacity: 0; + font-size: 1.5rem; + text-decoration: none !important; + position: absolute; + left: -16px; + top: 0; + transition: all ease .3s; +} + +#doc h1 a.hash-link { + top: 6px; +} + +#doc h1:hover .hash-link, +#doc h2:hover .hash-link, +#doc h3:hover .hash-link, +#doc h4:hover .hash-link, +#doc h5:hover .hash-link, +#doc h6:hover .hash-link, +#doc .hash-link:hover { + opacity: 1; +} + +#doc .hash-link:hover { + text-decoration: underline !important; +} + +#doc .hash-list { + padding: 1.5rem 2rem !important; +} + +#doc .hash-list li { + list-style: none !important; + width: 100%; + -webkit-margin-start: 0 !important; +} + +#doc .hash-list li a { + text-decoration: none !important; + color: #000 !important; +} + +.dark #doc .hash-list li a { + color: #fff !important; +} + +@media (max-width: 1024px) { + #doc .sub-menu.hash-list { + max-height: fit-content; + } +} + +#doc #back-to-top { + color: #0053D0 !important; + position: relative; + display: block; + width: 100%; +} + +.dark #doc #back-to-top { + color: #70F0F9 !important; +} + +#doc #back-to-top::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: -12px; + height: 1px; + background-color: rgb(216, 222, 228); +} + +.dark #doc #back-to-top::after { + opacity: 0.2; +} \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 0000000000..17952ed2dc --- /dev/null +++ b/css/index.css @@ -0,0 +1,1209 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +body { + font-family: Raleway, Arial, Helvetica, sans-serif; +} +h2, +h3, +p { + color: #062d56; +} +h2 { + font-size: 2.2rem; +} +h3 { + font-size: 1.8rem; +} +@media (max-width: 576px) { + h2 { + font-size: 1.9rem; + } + h3 { + font-size: 1.5rem; + } +} +p { + font-size: 1.1rem; + letter-spacing: 0.6px; + line-height: 30px; +} +a { + color: tomato; + font-size: 1.1rem; + letter-spacing: 0.6px; + text-decoration: none; +} +input, +button, +span.button { + border: none; + outline: none; + padding: 0.8rem 1.5rem; + font-size: 1rem; + letter-spacing: 1px; + border-radius: 25px; +} +input { + color: #062d56; + font-family: Raleway, Arial, Helvetica, sans-serif; + background-color: #f1f1f1; + width: 280px; +} +button, +span.button { + display: inline-block; + background-color: #02c0ff; + color: #fff; + text-align: center; + cursor: pointer; +} +button:active, +button:hover, +span.button:active, +span.button:hover { + filter: saturate(125%); +} +header { + background-color: #fbd561; + width: 100%; + position: sticky; + top: 0; + z-index: 10; + border-bottom: 1px solid #fff; +} +nav { + display: flex; + align-items: center; + justify-content: space-between; +} +nav .nav__buttons { + display: flex; + align-items: center; + flex-direction: row-reverse; + gap: 1rem; +} +nav .nav__buttons .button { + padding: 0.4rem 1.5rem; +} +nav .logo { + padding: 0.6rem 0rem; +} +button, +span.button { + display: inline-block; + background-color: #02c0ff; + color: #fff; + font-family: Raleway; + text-align: center; + cursor: pointer; +} +button:active, +span.button:active { + filter: saturate(125%); +} +.github-button { + visibility: hidden; +} +@media (max-width: 1050px) { + #demo div.all-users { + width: 100%; + } + #demo div.all-users div.user.bob .terminal, + #demo div.all-users div.user.tom .terminal { + width: 477px; + } + #demo div.all-users div.user.bob { + left: 397px; + } +} +@media (min-width: 1050px) { + #demo div.all-users { + width: 1020px; + } + #demo div.all-users div.user.bob .terminal, + #demo div.all-users div.user.tom .terminal { + width: 492px; + } + #demo div.all-users div.user.bob { + left: 528px; + } +} +#demo { + padding: 2rem 0rem; + background-image: url(../img/bg.svg), linear-gradient(180deg, #fbd561 0%, #efa647 100%); + background-size: 800px 800px, auto; + text-align: center; +} +#demo h1 { + font-size: 2.3rem; + margin-bottom: 2.5rem; +} +#demo h3 { + font-size: 1.5rem; + margin-bottom: 2rem; +} +#demo a { + font-weight: 500; +} +#demo div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#demo div.app__links { + width: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: 1.2rem; + line-height: 32px; + vertical-align: middle; + margin-bottom: 2rem; +} +#demo div.app__links p { + font-size: 19px; + padding: 0; + width: fit-content; +} +#demo div.app__links a { + display: inline-flex; + align-items: center; + margin: 0; + font-family: Raleway, Arial, Helvetica, sans-serif; + font-weight: bold; + text-decoration: none; + color: #062d56; + letter-spacing: 0.53px; + font-weight: 400; +} +#demo div.app__links a span { + font-weight: 500; + color: tomato; +} +#demo div.app__links img { + display: inline; + vertical-align: middle; +} +#demo div.all-users { + position: relative; + height: 612px; +} +@media (max-width: 890px) { + #demo div.all-users { + display: flex; + align-items: center; + justify-content: center; + height: 450px; + } + #demo div.all-users div.user { + left: auto; + } +} +#demo div.all-users .simplex_mobile { + right: 30px; +} +@media (max-width: 1050px) { + #demo div.all-users .simplex_mobile { + right: 0; + } +} +#demo div.all-users .run-demo, +#demo div.all-users .run-faster, +#demo div.all-users .try-it { + position: absolute; + width: 140px; + height: 40px; + bottom: 70px; + border-radius: 20px; + font-size: 17px; + letter-spacing: 0.53px; +} +#demo div.all-users .run-demo:disabled, +#demo div.all-users .run-faster:disabled, +#demo div.all-users .try-it:disabled { + filter: brightness(75%); +} +#demo div.all-users .run-demo { + left: 60px; +} +#demo div.all-users .run-faster { + left: 60px; + display: none; +} +#demo div.all-users .try-it { + left: 220px; +} +#demo div.user { + position: absolute; +} +#demo div.user h3 { + position: absolute; + top: -38px; + text-align: left; + padding: 0 0 9px 12px; + color: #ffb; + mix-blend-mode: difference; +} +#demo div.user .terminal { + text-align: left; + position: relative; + background-color: rgba(0, 0, 0, 0.8); + border: 1px solid #fff; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 10px; + color: #fff; + overflow-y: hidden; +} +#demo div.user .terminal:before { + content: ""; + display: block; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 20px; + background: #666 url(../img/topbar.svg) no-repeat 8px center; + border-radius: 10px 10px 0 0; + z-index: 2; +} +#demo div.user .terminal input, +#demo div.user .terminal .input, +#demo div.user .terminal .display { + font-family: Menlo, "Lucida Console", Monaco, monospace; + font-size: 14px; + letter-spacing: 0.27px; + line-height: 28px; + position: absolute; + left: 10px; + right: 10px; +} +#demo div.user .terminal input, +#demo div.user .terminal .input { + color: #fff; + display: block; + height: 30px; + bottom: 0; +} +#demo div.user .terminal input { + background-color: #000; + display: none; + left: 25px; + width: calc(100% - 30px); +} +#demo div.user .terminal .display { + color: #fff; + text-align: left; + bottom: 30px; + z-index: 1; + overflow-x: hidden; + word-wrap: break-word; +} +#demo div.user .terminal .display div.info { + color: #fff; +} +#demo div.user .terminal .display div.error { + color: tomato; +} +#demo div.user .terminal .display div.sent span.group { + color: aqua; +} +#demo div.user .terminal .display div.received span.group { + color: #ff0; +} +#demo div.user .terminal .display span { + font-family: Menlo, Monaco, "Lucida Console", monospace; + text-align: left; + margin: 0 0; +} +#demo div.user .terminal .display span.recipient { + color: aqua; +} +#demo div.user .terminal .display span.sender { + color: #ff0; +} +#demo div.user .terminal .display span.secret { + color: rgba(0, 0, 0, 0.4); + background-color: rgba(0, 0, 0, 0.4); +} +#demo div.user.alice { + left: 0; + top: 68px; +} +#demo div.user.alice .terminal { + width: 503px; + height: 362px; +} +@media (max-width: 570px) { + #demo div.user.alice .terminal { + width: 400px; + } +} +@media (max-width: 440px) { + #demo div.user.alice .terminal { + width: 330px; + } +} +#demo div.user.bob { + top: 38px; +} +#demo div.user.bob .terminal { + height: 282px; +} +#demo div.user.tom { + left: 397px; + top: 358px; +} +#demo div.user.tom .terminal { + height: 254px; +} +#demo .content_copy_with_tooltip { + background-color: #f8f8f6; + border-radius: 50px; + padding-bottom: 4px; + padding-top: 8px; + margin-top: 16px; + margin-bottom: 16px; +} +#demo .content_copy_with_tooltip .tooltip { + vertical-align: -6px; +} +#demo .content_copy_with_tooltip .content { + font-size: 15px; +} +#conn_req h1, +#conn_req h2, +#conn_req h3, +#install_chat h1, +#install_chat h2, +#install_chat h3, +#demo h1, +#demo h2, +#demo h3 { + color: #062d56; +} +#conn_req p.install, +#install_chat p.install, +#demo p.install { + padding: 0.4rem 1.5rem; +} +#conn_req a.github, +#install_chat a.github, +#demo a.github { + vertical-align: -5px; +} +#conn_req a, +#install_chat a, +#demo a { + color: #124d86; +} +#conn_req .content, +#install_chat .content, +#demo .content { + font-family: "Courier New", Courier, monospace; + font-size: 14px; + color: #000; +} +#conn_req .content_copy:hover, +#install_chat .content_copy:hover, +#demo .content_copy:hover { + cursor: pointer; +} +#conn_req .tooltip, +#install_chat .tooltip, +#demo .tooltip { + position: relative; + display: inline-block; +} +#conn_req .tooltip .tooltiptext, +#install_chat .tooltip .tooltiptext, +#demo .tooltip .tooltiptext { + visibility: hidden; + width: 140px; + background-color: rgba(255, 255, 255, 0.8); + text-align: center; + border: 1px solid #ccc; + border-radius: 4px; + padding: 5px; + position: absolute; + z-index: 1; + bottom: 150%; + left: 50%; + margin-left: -75px; + opacity: 0; + transition: opacity 0.3s; + font-size: 14px; +} +#conn_req .tooltip .tooltiptext::after, +#install_chat .tooltip .tooltiptext::after, +#demo .tooltip .tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #062d56 rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0); +} +#conn_req .tooltip:hover .tooltiptext, +#install_chat .tooltip:hover .tooltiptext, +#demo .tooltip:hover .tooltiptext { + visibility: visible; + opacity: 1; +} +#conn_req { + margin-top: 120px; + height: 700px; + position: relative; + display: block; +} +#conn_req .conn_req_uri { + width: 960px; + margin: 0 auto; +} +#conn_req .conn_req_uri .content_copy_with_tooltip { + float: left; + width: 500px; + padding: 24px 0 0 24px; +} +#conn_req .conn_req_uri .content_copy_with_tooltip textarea { + word-break: break-all; + width: 340px; + height: 340px; + resize: none; + outline: none; + padding: 5px; + box-sizing: border-box; + border-radius: 4px; + border-color: #ccc; +} +#conn_req .conn_req_uri canvas { + width: 360px; + height: 360px; + padding-top: 12px; +} +#conn_req span.button { + border-radius: 18px; + height: 40px; + line-height: 40px; + width: 200px; +} +#install_chat { + padding-top: 24px; + height: 345px; + background-color: #f8f8f6; +} +figure.party { + display: flex; + align-items: flex-end; + justify-content: center; + width: 102px; + height: 139px; + background: no-repeat center top; + position: relative; +} +figure.party.small { + width: 90px; + height: 118px; + background-size: 88px 88px; +} +figure.party.small:before { + width: 88px; + height: 88px; +} +figure.party:before { + content: ""; + display: block; + position: absolute; + border-radius: 100%; + top: 0; + left: 1px; + width: 99px; + height: 99px; + background-color: #fff; + z-index: -1; +} +figure.party.transparent:before { + opacity: 25%; +} +figure.party.alice { + background-image: url(../img/alice.svg); +} +figure.party.bob { + background-image: url(../img/bob.svg); +} +#introduction { + padding: 2rem 0rem; + background-image: linear-gradient(180deg, #fbd561 0%, #efa647 100%); +} +#introduction div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#introduction h2 { + color: tomato; + margin-bottom: 2.5rem; +} +#introduction p { + text-align: center; + padding-top: 3px; +} +#introduction p:first-of-type { + padding-top: 36px; +} +#introduction figure.section { + display: flex; + align-items: center; + justify-content: space-between; + max-width: 900px; + margin-top: 70px; +} +#introduction figure.section .feature { + display: flex; + align-items: center; + flex-direction: column; + width: 300px; +} +#introduction figure.section .feature p { + text-align: center; + width: 85%; + padding-top: 12px; +} +#introduction figure.section .feature h4 { + padding-top: 12px; +} +#introduction figure.section .doodle { + border: 4px solid #fff; + border-radius: 100%; + width: 163px; + height: 163px; + position: relative; + margin: 0 auto; + background: url(../img/doodle.svg); + background-size: 400px 400px; + background-clip: content-box; +} +#introduction figure.section .doodle:before { + content: ""; + display: block; + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + border: 7px solid #f8b650; + border-radius: 100%; +} +#introduction figure.section .doodle.control { + background-position: 410px 235px; +} +#introduction figure.section .doodle.privacy { + background-position: 185px 350px; +} +#introduction figure.section .doodle.convenience { + background-position: 305px 160px; +} +@media (max-width: 930px) { + #introduction figure.section { + flex-direction: column; + gap: 2.5rem; + } +} +#problem { + padding: 3rem 0rem; + background-color: #f8f8f6; + position: relative; + z-index: 1; +} +#problem .problem-section { + align-self: start; + overflow: auto; +} +#problem .explained { + display: none; +} +#problem div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#problem h2 { + color: tomato; + text-align: center; + margin-bottom: 2.5rem; +} +#problem h3 { + text-align: center; + margin-bottom: 1.5rem; +} +#problem p { + text-align: center; +} +#problem #problem-explained { + display: none; +} +#problem #problem-explained:target ~ .intro { + display: none; +} +#problem #problem-explained:target ~ .explained { + display: block; +} +#problem #problem-explained:target ~ .pagination .page.intro { + background-color: #cdcdcd; +} +#problem #problem-explained:target ~ .pagination .page.explained { + background-color: #3e96fc; +} +#problem .pagination { + width: 44px; + height: 12px; + margin: 0 auto; +} +#problem .pagination .page { + display: block; + float: left; + background-color: #cdcdcd; + border-radius: 100%; + width: 14px; + height: 14px; +} +#problem .pagination .page.intro { + margin-right: 16px; + background-color: #3e96fc; +} +#problem .communication { + width: 645px; + height: 148px; + margin: 40px auto 15px auto; +} +#problem .communication figure { + float: left; +} +#problem .communication img { + display: block; + float: left; + margin: 20px -12px; + position: relative; + z-index: -2; +} +#problem .communication .tom { + text-align: center; + position: relative; + bottom: 48px; + right: 3px; +} +@supports (background-blend-mode: multiply) and (not (-webkit-touch-callout: none)) { + #solution { + background-image: url(../img/doodle.svg); + background-blend-mode: multiply; + } +} +#solution { + padding: 4rem 0rem; + background-color: #062d56; + background-size: 800px 800px; +} +#solution div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#solution h2 { + color: tomato; + text-align: center; +} +#solution p { + text-align: center; + color: #fff; + padding-top: 12px; +} +#solution p:first-of-type { + padding-top: 53px; +} +#connection { + padding: 2rem 0rem; + background-color: #f8f8f6; +} +#connection h2 { + color: tomato; + margin-bottom: 2rem; + text-align: center; +} +#connection h3 { + margin-bottom: 1.5rem; + text-align: center; +} +#connection h4 { + color: #062d56; + font-size: 21px; + line-height: 29px; + margin-bottom: 1rem; + text-align: center; +} +#connection p { + margin-bottom: 2.5rem; + text-align: center; +} +#connection a { + font-weight: 500; +} +#connection div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#connection figure.section { + display: flex; + align-items: center; + gap: 0.5rem; +} +#connection figure.section .arrow { + width: 40px; +} +#connection figure.section .party { + margin-top: 2rem; +} +#connection figure.conn-stage { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; +} +#connection figure.conn-stage p { + width: 170px; + font-size: 15px; + color: #062d56; + margin-bottom: 0.3rem; +} +#connection figure.device { + width: 185px; +} +@media (max-width: 992px) { + #connection figure.section { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + } + #connection figure.section > *:nth-child(2) { + margin: auto; + width: 50px; + } + #connection figure.section > *:nth-child(4) { + grid-column-start: 3; + margin: auto; + width: 50px; + transform: rotate(90deg); + padding: 3.5rem 0; + } + #connection figure.section > *:nth-child(5) { + grid-column-start: 3; + } + #connection figure.section > *:nth-child(6) { + grid-column-start: 2; + grid-row-start: 3; + margin: auto; + width: 50px; + transform: rotate(180deg); + } + #connection figure.section > *:nth-child(7) { + grid-column-start: 1; + grid-row-start: 3; + } +} +@media (max-width: 500px) { + #connection figure.section { + display: flex; + flex-direction: column; + } + #connection figure.section > *:nth-child(even) { + transform: rotate(90deg); + padding: 1.5rem 0; + } +} +#comparison { + padding: 2rem 0rem; + overflow: hidden; + position: relative; +} +#comparison .table-holder { + /* align-self: start; */ + overflow: auto; +} +#comparison div.container { + display: flex; + flex-direction: column; + align-items: center; +} +#comparison h2 { + color: tomato; + text-align: center; +} +#comparison table, +#comparison ol, +#comparison ul { + font-family: Raleway, Arial, Helvetica, sans-serif; + color: #062d56; +} +#comparison table { + border-collapse: separate; + border-spacing: 10px; + margin: 59px auto 0 auto; + background-color: #f8f8f6; + padding-bottom: 60px; +} +#comparison table th { + font-weight: normal; + height: 40px; +} +#comparison table th.simplex { + font-weight: bold; +} +#comparison table th.simplex img { + width: 25px; + height: 23px; + vertical-align: -6px; +} +#comparison table td, +#comparison table th { + font-size: 15px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.4; + letter-spacing: 0.47px; +} +#comparison table td .equal, +#comparison table th .equal { + font-size: 18px; +} +#comparison table td { + height: 40px; + margin: 0 10px 10px 0; +} +#comparison table td.highlight { + text-align: center; + color: #fff; + font-weight: 500; +} +#comparison table td.bad { + background-color: #f95a2c; +} +#comparison table td.medium { + background-color: #ffbd12; +} +#comparison table td.good { + background-color: #02c0ff; +} +#comparison .table-comments { + padding: 0 2rem; + display: flex; + gap: 4rem; +} +#comparison .table-comments ul.legend, +#comparison .table-comments .footnotes { + font-size: 13px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + margin-top: 29px; +} +#comparison .table-comments ul.legend { + list-style: none; + line-height: 2.31; + letter-spacing: 0.41px; + padding-top: 20px; +} +#comparison .table-comments ul.legend li.bad::before { + background-color: #f95a2c; +} +#comparison .table-comments ul.legend li.medium::before { + background-color: #ffbd12; +} +#comparison .table-comments ul.legend li.good::before { + background-color: #02c0ff; +} +#comparison .table-comments ul.legend li::before { + content: ""; + display: inline-block; + width: 20px; + height: 20px; + margin-right: 10px; + vertical-align: -6px; +} +#comparison .table-comments .footnotes { + line-height: 1.62; + letter-spacing: 0.41px; +} +#comparison .table-comments .footnotes a { + color: #f95a2c; + font-weight: bold; + font-size: 0.8rem; + text-decoration: underline; +} +@media (max-width: 1050px) { + #comparison table { + width: 900px; + } + #comparison table td { + width: 190px; + } + #comparison table td.highlight { + width: 140px; + } + #comparison .table-comments { + max-width: 900px; + } +} +@media (min-width: 1050px) { + #comparison table { + width: 1050px; + } + #comparison table td { + width: 215px; + } + #comparison table td.highlight { + width: 155px; + } + #comparison .table-comments { + max-width: 1050px; + } +} +#messaging { + background-image: linear-gradient(180deg, #fbd561 0%, #efa647 100%); + display: flex; + flex-direction: column; + align-items: center; + padding: 2rem 0rem; +} +#messaging img { + max-width: 100%; +} +#messaging div.container div { + max-width: 750px; + text-align: center; +} +#messaging h2 { + color: tomato; + margin-bottom: 2rem; +} +#messaging h3 { + margin-bottom: 1.5rem; +} +#messaging p { + margin-bottom: 2.5rem; +} +#messaging figure.section { + display: flex; + align-items: center; + justify-content: center; +} +#messaging figure.section .party { + margin: 80px 9px; +} +#chat { + background-color: #f8f8f6; + display: flex; + flex-direction: column; + align-items: center; + padding: 2rem 0rem; +} +#chat img { + max-width: 100%; +} +#chat div.container div { + max-width: 740px; + text-align: center; +} +#chat div.container div h2 { + color: tomato; + margin-bottom: 2rem; +} +#chat div.container div h3 { + margin-bottom: 1.5rem; +} +#chat div.container div p { + margin-bottom: 2.5rem; +} +#chat figure.section { + display: flex; + align-items: center; + justify-content: center; +} +#chat figure.section .party { + margin: 80px 9px; +} +#simplex { + background-color: #fff; + padding: 5rem 0rem; +} +#simplex h3 { + text-align: center; +} +#simplex > div { + display: flex; + justify-content: space-between; + gap: 8rem; +} +#simplex > div .half { + flex: 1; + display: flex; + flex-direction: column; + gap: 1.5rem; + justify-content: space-between; +} +@media (max-width: 1050px) { + #simplex > div { + flex-direction: column; + } +} +#simplex form.sign-up { + width: 100%; +} +#simplex form.sign-up div { + display: flex; + gap: 0.5rem; +} +@media (max-width: 576px) { + #simplex form.sign-up div { + flex-direction: column; + align-items: center; + width: inherit; + gap: 1rem; + } + #simplex form.sign-up div input { + display: block; + width: inherit; + } +} +#simplex #use-simplex a { + font-weight: 500; +} +#simplex #contacts { + display: flex; + flex-direction: column; + gap: 1rem; +} +#simplex #contacts span.button { + width: 100px; +} +#simplex #contacts a { + color: #062d56; + font-size: 1.1rem; + letter-spacing: 0.53px; + line-height: 25px; +} +.d-none { + display: none; +} +footer { + padding: 1rem 0rem; + background-color: #f8f8f6; +} +footer > div { + display: flex; + justify-content: space-between; + align-items: center; +} +@media (max-width: 992px) { + footer > div { + justify-content: center; + } +} +footer p { + display: flex; + align-items: center; + gap: 0.2rem; +} +@media (max-width: 576px) { + footer p { + text-align: center; + } +} +footer .copyright img { + width: 22px; + height: 22px; +} +footer a { + display: flex; + align-items: center; +} +footer .copyright__text_and_links { + display: flex; +} +footer .copyright__text_and_links div { + padding: 0 0.2rem; + display: flex; + gap: 3px; +} +@media (max-width: 576px) { + footer .copyright__text_and_links { + flex-direction: column; + align-items: center; + gap: 1rem; + } +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Regular.woff2); + font-weight: normal; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Medium.woff2); + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(./Raleway-Bold.woff2); + font-weight: bold; +} +.container { + max-width: 1320px; + margin: auto; + padding: 0rem 2rem; +} +@media (max-width: 1200px) { + .container { + max-width: 1140px; + } +} +@media (max-width: 992px) { + .container { + max-width: 960px; + } + .d-none-992 { + display: none !important; + } +} +@media (max-width: 768px) { + .container { + max-width: 720px; + } + .d-none-768 { + display: none !important; + } +} +@media (max-width: 576px) { + .container { + max-width: 100%; + padding: 0rem 1rem; + } + .d-none-576 { + display: none !important; + } +} +@media (min-width: 992px) { + .d-none-on-mobile { + display: none; + } +} +@media (max-width: 890px) { + .d-none-890 { + display: none; + } +} /*# sourceMappingURL=index.css.map */ diff --git a/css/prism-dark.min.css b/css/prism-dark.min.css new file mode 100644 index 0000000000..f5720ca222 --- /dev/null +++ b/css/prism-dark.min.css @@ -0,0 +1,4 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+apacheconf+bash+batch+cmake+dart+docker+git+gradle+haskell+http+java+kotlin+makefile+markdown+markup-templating+nginx+php+plsql+powerquery+powershell+pug+python+jsx+regex+sass+scss+sql+typescript+xml-doc+yaml&plugins=toolbar+copy-to-clipboard */ +code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} \ No newline at end of file diff --git a/css/prism-light.min.css b/css/prism-light.min.css new file mode 100644 index 0000000000..d6fbb50ad0 --- /dev/null +++ b/css/prism-light.min.css @@ -0,0 +1,4 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+css-extras+dart+docker+ejs+git+linker-script+gradle+haskell+http+java+javadoclike+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+js-templates+kotlin+makefile+markdown+markup-templating+n1ql+nginx+plsql+powerquery+powershell+python+sql+swift+typescript+typoscript+xml-doc+xquery+yaml&plugins=normalize-whitespace+toolbar+copy-to-clipboard */ +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} diff --git a/css/reset.css b/css/reset.css new file mode 100644 index 0000000000..69e48f238a --- /dev/null +++ b/css/reset.css @@ -0,0 +1,74 @@ +/* Box sizing rules */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Remove default margin */ +body, +h1, +h2, +h3, +h4, +p, +figure, +blockquote, +dl, +dd { + margin: 0; +} + +/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ +ul[role="list"], +ol[role="list"] { + list-style: none; +} + +/* Set core root defaults */ +html:focus-within { + scroll-behavior: smooth; +} + +/* Set core body defaults */ +body { + min-height: 100vh; + text-rendering: optimizeSpeed; + line-height: 1.5; +} + +/* A elements that don't have a class get default styles */ +a:not([class]) { + text-decoration-skip-ink: auto; +} + +/* Make images easier to work with */ +img, +picture { + max-width: 100%; + display: block; +} + +/* Inherit fonts for inputs and buttons */ +input, +button, +textarea, +select { + font: inherit; +} + +/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */ +@media (prefers-reduced-motion: reduce) { + html:focus-within { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000000..0c67dee478 --- /dev/null +++ b/css/style.css @@ -0,0 +1,1160 @@ +/* ======================= + GT-Walsheim (WOFF2) + Family: "GT-Walsheim" + Weights mapped: Thin(100), Ultra-Light(200), Light(300), Regular(400), + Medium(500), Bold(700), Ultra-Bold(800), Black(900) +======================= */ + +/* Thin */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Thin-Trial.woff2") format("woff2"); + font-weight: 100; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Thin-Oblique-Trial.woff2") format("woff2"); + font-weight: 100; + font-style: oblique; + font-display: swap; +} + +/* Ultra-Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Trial.woff2") format("woff2"); + font-weight: 200; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Oblique-Trial.woff2") format("woff2"); + font-weight: 200; + font-style: oblique; + font-display: swap; +} + +/* Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Light-Trial.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Light-Oblique-Trial.woff2") format("woff2"); + font-weight: 300; + font-style: oblique; + font-display: swap; +} + +/* Regular */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Regular-Trial.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Regular-Oblique-Trial.woff2") format("woff2"); + font-weight: 400; + font-style: oblique; + font-display: swap; +} + +/* Medium */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Medium-Trial.woff2") format("woff2"); + font-weight: 500; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Medium-Oblique-Trial.woff2") format("woff2"); + font-weight: 500; + font-style: oblique; + font-display: swap; +} + +/* Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Bold-Trial.woff2") format("woff2"); + font-weight: 700; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Bold-Oblique-Trial.woff2") format("woff2"); + font-weight: 700; + font-style: oblique; + font-display: swap; +} + +/* Ultra-Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Trial.woff2") format("woff2"); + font-weight: 800; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Oblique-Trial.woff2") format("woff2"); + font-weight: 800; + font-style: oblique; + font-display: swap; +} + +/* Black */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Black-Trial.woff2") format("woff2"); + font-weight: 900; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-Black-Oblique-Trial.woff2") format("woff2"); + font-weight: 900; + font-style: oblique; + font-display: swap; +} + +/* ======================= + Manrope (TTF) + Family: "Manrope" + Weights mapped per name +======================= */ + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraBold.ttf") format("truetype"); + font-weight: 800; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: Gilroy; + src: url("/fonts/GilroyRegular/font.woff2") format("woff2"), url("webFonts/GilroyRegular/font.woff") format("woff"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: Gilroy; + src: url("/fonts/GilroyLight/font.woff2") format("woff2"), url("webFonts/GilroyLight/font.woff") format("woff"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: Gilroy; + src: url("/fonts/GilroyMedium/font.woff2") format("woff2"), url("webFonts/GilroyMedium/font.woff") format("woff"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: Gilroy; + src: url("/fonts/GilroyBold/font.woff2") format("woff2"), url("webFonts/GilroyBold/font.woff") format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: Gilroy; + src: url("/fonts/GilroyRegularItalic/font.woff2") format("woff2"), url("webFonts/GilroyRegularItalic/font.woff") format("woff"); + font-weight: 400; + font-style: italic; +} + +html { + scroll-behavior: smooth; + font-family: GT-Walsheim, Gilroy, Helvetica, sans-serif;; + letter-spacing: 0.003em; +} + +img{ + user-select: none; + -webkit-user-select: none; /* For Safari and older Chrome versions */ + -moz-user-select: none; /* For Firefox */ + -ms-user-select: none; /* For Internet Explorer and Edge */ +} + +a{ + word-wrap: break-word; +} + +/* #comparison::before { + display: block; + content: " "; + margin-top: -80px; + height: 120px; + visibility: hidden; + pointer-events: none; +} */ + +/* .nav-button-active{ + background-color: #00C8FB; + color: #fff; +} */ + +/* NEW SITE */ +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + /* padding: 0 20px; */ + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + + .container-sm, + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + + .container-md, + .container-sm, + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 1140px; + } +} + +@media (min-width: 1400px) { + + .container-xxl, + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 1320px; + } +} + +.gradient-text { + background: -webkit-linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + background: linear-gradient(to bottom, #53C1FF -50%, #0053D0 160%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; +} + +.dark .border-gradient { + background: + linear-gradient(#11182F, #11182F) padding-box, + linear-gradient(to bottom, transparent, #01F1FF 58%) border-box; + border: 1px solid transparent; +} + +.dark .only-light { + display: none; +} + +.only-dark { + display: none; +} + +.dark .only-dark { + display: inherit; +} + +.dark .unique-swiper .border-gradient{ + background: + linear-gradient(#0C0B13, #0C0B13) padding-box, + linear-gradient(to bottom, transparent, #01F1FF 58%) border-box; + border: 1px solid transparent; +} + +/* Nav and Menu */ +#why-simplex::before, +#features::before, +#privacy::before, +#network::before { + display: block; + content: " "; + position: absolute; + top: -26px; + height: 66px; + visibility: hidden; + pointer-events: none; +} + +.menu-link{ + font-size: 16px; + line-height: 33.42px; + color: #0D0E12; +} +.dark .menu-link{ + color: #fff; +} + +.nav-link ul li a.active{ + color: #0053D0; + +} +.dark .nav-link ul li a.active{ + color: #66D9E2; +} + +@media (min-width:1024px) { + .nav-link-text, + .menu-link { + display: inline-block; + position: relative; + color: #0D0E12; + } + + .nav-link-text::before, + .active .nav-link-text::before, + .menu-link::before { + content: ""; + position: absolute; + width: 0; + height: 1px; + bottom: 0; + right: 0; + /* background-color: initial; */ + transition: width 0.25s ease-out; + } + + .menu-link::before { + background-color: #0D0E12; + } + .dark .menu-link::before { + background-color: #fff; + } + + .active .nav-link-text::before { + width: 100%; + } + + .nav-link:hover .nav-link-text::before, + .menu-link:hover::before { + width: 100%; + left: 0; + right: auto; + } +} + + +.sub-menu { + visibility: hidden; + opacity: 0; + color: #505158; +} + +.sub-menu .no-hover{ + color: #505158 !important; +} + +.dark .sub-menu, +.dark .sub-menu .no-hover { + color: #fff !important; +} + +.dark .sub-menu li:hover { + color: #66D9E2; +} + +.sub-menu li:hover { + color: #0053D0; +} + +.sub-menu { + transition: all .3s ease !important; +} + +.nav-link span svg, +header nav { + transition: all 0.5s ease; +} + +.nav-link:hover span svg { + transform: rotate(180deg); +} + +/* @media (max-width: 1400px) { + .landing-page-header-article-paragraph { + width: 21rem; + } + + .socials { + flex-wrap: nowrap; + } +} */ + +@media (min-width:1024px) { + + .nav-link:hover .sub-menu, + .nav-link:focus-within .sub-menu { + visibility: visible; + opacity: 1; + margin-top: 0; + } +} + +@media (max-width: 1024px) { + .sub-menu { + max-height: 0; + transform: translateY(-10px); + transition: all .7s ease !important; + overflow: hidden; + } + + .active .sub-menu { + max-height: 1000px; + transform: translateY(0px); + opacity: 1; + visibility: visible; + margin-top: 0; + } + + header nav { + visibility: hidden; + opacity: 0; + transform: translateX(100%); + overflow-y: auto; + } + + header nav.open { + visibility: visible; + opacity: 1; + transform: translateX(0); + } + + .flag-container .sub-menu{ + max-height: fit-content; + } +} + +.lock-scroll { + overflow: hidden; +} + +/* Swipe Sections */ +.hash-number { + background: linear-gradient(251.16deg, #53C1FF 1.1%, #0053D0 100.82%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.swiper-button-disabled{ + opacity: 0; + pointer-events: none; + display: none !important; +} + +@media (max-width: 767px) { + .swiper-button-next, .swiper-button-prev { + opacity: 0; + pointer-events: none; + display: none !important; + } +} + +.swiper-pagination-bullet { + height: 14.31px; + width: 14.31px; + margin: 0 5px !important; +} +.dark .swiper-pagination-bullet{ + background: #D4D4D433; + opacity: .8; +} + +.swiper-pagination-bullet-active{ + opacity: 1 !important; +} +.swiper-pagination-bullet-active { + background-color: #0197FF !important; +} +.dark .swiper-pagination-bullet-active{ + background-color: #70F0F9 !important; +} + +.swiper-button-next, +.swiper-button-prev { + height: 40px; + width: 40px; +} + +.swiper-button-disabled { + display: none; +} + +.unique-swiper .swiper-slide, +.unique-swiper .swiper-wrapper{ + height: inherit; +} + +.swiper-scrollbar-horizontal { + margin-top: 40px !important; + width: 302.06px !important; + height: 7.73px !important; + left: 50% !important; + transform: translateX(-50%) !important; + transform: translateX(-50%) !important; +} + +.swiper-scrollbar-drag { + /* width: 112px !important; */ + height: 8px !important; + background-color: #0197FF; +} +.dark .swiper-scrollbar-drag{ + background-color: #70F0F9; +} + +.swiper-rtl .swiper-button-prev{ + right: 0 !important; +} + +.swiper-rtl .swiper-button-next{ + left: 0 !important; +} + +/* What makes simplex private */ +.card{ + cursor: pointer; +} + +.card, +.card > div:nth-child(2), +.card > div:nth-child(1) { + transition: all .5s ease; +} + +.card > div:nth-child(2) > *:nth-child(2), +.card > div:nth-child(2) > *:nth-child(3) { + opacity: 0; + max-height: 0; + transform: translateY(20px); + transition: all .5s ease-out; +} +.card > div:nth-child(2) > *:nth-child(3) { + transform: translateY(40px); +} + +.card:not(.no-hover):hover > div:nth-child(1), +.card.hovered > div:nth-child(1) { + height: 200px; +} +.card:not(.no-hover):hover > div:nth-child(2), +.card.hovered > div:nth-child(2) { + height: 270px; +} +.card.card-active > div:nth-child(2) { + height: 480px; +} + +.card:not(.no-hover):hover > div:nth-child(2) > *:nth-child(2), +.card:not(.no-hover):hover > div:nth-child(2) > *:nth-child(3), +.card.card-active > div:nth-child(2) > *:nth-child(2), +.card.card-active > div:nth-child(2) > *:nth-child(3), +.card:not(.no-hover).hovered > div:nth-child(2) > *:nth-child(2), +.card:not(.no-hover).hovered > div:nth-child(2) > *:nth-child(3) { + opacity: 1; + max-height: 480px; + transform: translateY(0px); +} + +.card:not(.no-hover):hover > div:nth-child(2) > *:nth-child(3), +.card:not(.no-hover).hovered > div:nth-child(2) > *:nth-child(3) { + opacity: 0; +} + + +/* SimpleX Unique */ +.simplex-unique-card .card-content{ + transition: all .5s ease-out; +} +@media (max-width: 767px) { + .simplex-unique-card .card-content .content-body{ + height: 0; + opacity: 0; + visibility: hidden; + transform: translateY(80px); + transition: all .7s ease; + } + .simplex-unique-card.active-card .card-content .content-body{ + max-height: 540px; + opacity: 1; + visibility: visible; + transform: translateY(0px); + } + .simplex-unique-card.active-card .card-content{ + height: 540px; + } + .open-card-btn svg, + .close-card-btn svg{ + transition: all .5s ease; + } + .open-card-btn:hover svg, + .close-card-btn:hover svg{ + transform: rotate(180deg); + } +} + + +/* comparison */ +#comparison table thead th{ + font-size: 16px; + line-height: 36px; + font-weight: 500; + text-align: center; +} +#comparison table tbody td{ + font-size: 16px; + line-height: 24px; + font-weight: 500; +} +#comparison table tbody tr > td:first-child{ + font-size: 16px; + line-height: 24px; + font-weight: 500; + text-align: left; +} + +[dir="rtl"] #comparison table tbody tr > td:first-child{ + text-align: right; +} + +@media (min-width: 1024px) { + #comparison table tbody tr > td:first-child{ + font-size: 18px; + line-height: 36px; + } +} + +/* hero */ +header{ + transition: all .7s ease; +} +.primary-header { + background: linear-gradient(270deg, #0053D0 35.85%, #0197FF 94.78%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: 0px 4px 74px #e9e7e2; +} +.dark .primary-header{ + background: linear-gradient(270deg,#70F0F9 100%, #70F0F9 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: none; +} +.secondary-header { + color: #606c71; + text-shadow: 0px 4px 74px #e9e7e2; +} +.dark .secondary-header{ + color: #fff; + text-shadow: none; +} +.hero-phone-background { + background-image: url("/img/new/bg_gfx.png"); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + /* width: 644px; + height: 644px; + margin-bottom: 5rem; */ + + + /* position: fixed; */ + + /* justify-content: center; + align-items: center; + align-content: center; + justify-items: center; + */ +} +#hero-phone-light, #hero-phone-dark { + position: relative; + animation-name: none; + animation-duration: 2s; + animation-fill-mode: forwards; +} + +#hero-phone-video { + /* position: absolute; + border-radius: 10px; + background-color: black; + animation-name: none; */ + /* border-top-right-radius: 25px; */ + /* border-top-left-radius: 32px; */ + animation-duration: 2s; + animation-fill-mode: forwards; + /* height: 580px; + width: 256px; */ + /* margin-left: 0.3rem; + margin-bottom: 0.1rem; */ +} + +.description { + width: 31rem; +} + +@media (max-width: 1400px) { + /* #hero-phone-video { + border-radius: 15px; + height: 500px; + width: 227px; + margin-bottom: 4.7rem; + } */ +} + +@keyframes small { + 0% { + transform: scale(1); + } + + 100% { + transform: scale(0.66); + } +} +@keyframes big { + 0% { + transform: scale(0.66); + } + + 100% { + transform: scale(1); + } +} +@keyframes bigvideo { + 0% { + transform: scale(0.66); + opacity: 0; + } + + 100% { + transform: scale(1); + opacity: 1; + } +} + +/* Overlays */ +.overlay a, +p a{ + color: #0053D0; + text-decoration: underline; + text-underline-offset: 2px; +} +.dark .overlay a, +.dark p a{ + color: #70F0F9; +} + +/* For Contact & Invitation Page */ +.primary-header-contact { + background: linear-gradient(251.16deg, #53c1ff 1.1%, #0053d0 100.82%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: 0px 4px 74px #e9e7e2; +} +.dark .primary-header-contact{ + background: linear-gradient(270deg,#70F0F9 100%, #70F0F9 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: none; +} +.secondary-header-contact { + text-shadow: 0px 4px 74px #e9e7e2; +} +.dark .secondary-header-contact { + text-shadow: none; +} +.content_copy_with_tooltip { + background-color: #f8f8f6; + border-radius: 50px; + padding-bottom: 4px; + padding-top: 8px; + margin-top: 16px; + margin-bottom: 16px; +} +.content_copy_with_tooltip .tooltip { + vertical-align: -6px; +} +.content_copy_with_tooltip .content { + font-size: 15px; +} +.contact-tab > .contact-tab-content, +.job-tab > .job-tab-content{ + opacity: 0; + max-height: 0; + transition: all 0.5s ease; + visibility: hidden; + transform: translateY(10px); + overflow: hidden; +} +.contact-tab svg, +.job-tab svg{ + transform: rotate(-180deg); + transition: all .5s ease; +} +.contact-tab.active > .contact-tab-content, +.job-tab.active > .job-tab-content{ + opacity: 1; + max-height: 300px; + visibility: visible; + transform: translateY(0px); +} +.for-tablet .contact-tab.active > .contact-tab-content, +.for-tablet .job-tab.active > .job-tab-content{ + min-height: 450px; +} +.contact-tab.active svg, +.contact-tab:hover svg, +.job-tab.active svg, +.job-tab:hover svg{ + transform: rotate(0deg); +} + +/* Glossary */ +.glossary-term{ + display: inline-block; + text-decoration: underline; + text-decoration-style: dashed; + text-underline-offset: 3px; + position: relative; + z-index: 10000; +} + +.glossary-term::before{ + content: ''; + position: absolute; + top: -5px; + bottom: -5px; + left: 0; + right: 0; + opacity: 0; + z-index: 9; +} + +.glossary-tooltip { + visibility: hidden; + opacity: 0; + position: fixed; + width: 320px; + max-width: 100%; + z-index: 10001; + transition: opacity .5s; + padding-left: 5px; + padding-right: 5px; +} + +.glossary-tooltip .tooltip-content{ + background-color: #fff; + color: #000; + text-align: left; + padding: .8rem 1.2rem; + border-radius: 7px; + font-size: 14px; + line-height: 1.3rem; + box-shadow: 0 5px 10px rgba(0,0,0,.08); +} + +.dark .glossary-tooltip .tooltip-content{ + background-color: #000; + color: #fff; + box-shadow: none; +} + +.tooltip-title{ + margin-bottom: 0.5rem; + color: #0197FF; + font-weight: 600; + font-size: 1.1rem; +} + +.dark .tooltip-title{ + color: #70F0F9; +} + +.glossary-tooltip .read-more-btn{ + color: #0053D0; + display: block; + text-decoration: underline; + margin-top: .8rem; + text-underline-offset: 2px; +} + +.dark .glossary-tooltip .read-more-btn{ + color: #70F0F9; +} + +.glossary-overlay{ + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: transparent; + align-items: center; + justify-content: center; + padding: 0.75rem; + z-index: 10005; +} + +@media screen and (min-width: 768px) { + .glossary-overlay{ + padding: 2.5rem; + } +} + +.glossary-overlay::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + background-color:#F3F6F7; + opacity: 0.9; +} + +.dark .glossary-overlay::before { + content: ''; + background-color: #0C0B13; +} + +.glossary-overlay .overlay-card{ + width: 100%; + background-color: white; + opacity: 1; + height: 100%; + z-index: 10006; + border-radius: 0.375rem; + box-shadow: 0px 3px 12px rgba(0, 0, 0, 0.2); + padding: 2.5rem 1.5rem; + overflow: auto; + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.dark .glossary-overlay .overlay-card{ + background-color: #17203D; +} + +@media (min-width: 640px) { + .glossary-overlay .overlay-card{ + padding: 3.5rem; + } +} + +@media (min-width: 768px) { + .glossary-overlay .overlay-card{ + width: fit-content; + max-width: 558px; + height: fit-content; + max-height: 660px; + } +} + +.glossary-overlay .overlay-card .overlay-title{ + font-size: 1.875rem; + line-height: 2.25rem; + font-weight: 700; + margin-bottom: 1rem; + margin-bottom: 1.5rem; + --tw-text-opacity: 1; + color: rgb(1 151 255 / var(--tw-text-opacity)); +} + +.glossary-overlay .overlay-card .overlay-content{ + display: flex; + flex-direction: column; + gap: 1.5rem; + font-size: 1rem; + line-height: 1.5rem; + color: #3F484B; +} + +.dark .glossary-overlay .overlay-card .overlay-content{ + color: #fff; +} + +.close-overlay-btn{ + fill: #3F484B; + position: fixed; + right: 1.25rem; + top: 1.25rem; + cursor: pointer; +} + +.dark .close-overlay-btn{ + fill: #fff; +} + +.glossary-overlay ul { + overflow-x: auto; +} + +.glossary-overlay ul, +.glossary-overlay ol { + list-style-position: inside; + overflow: auto; + margin: 1rem 0; + /* padding-left: 1rem; */ +} + +.glossary-overlay ul li, +.glossary-overlay ol li { + margin-right: 0; + margin-left: 0; + -webkit-margin-start: 1.1rem; + color: #000; +} + +.dark .glossary-overlay ul li, +.dark .glossary-overlay ol li { + color: #fff; +} + +.glossary-overlay ul li::marker, +.glossary-overlay ol li::marker { + color: black; +} + +.dark .glossary-overlay ul li::marker, +.dark .glossary-overlay ol li::marker { + color: white; +} + +.glossary-overlay ul li a, +.glossary-overlay ol li a { + line-height: 30px; +} + +.glossary-overlay ul li { + list-style: disc; +} + +.glossary-overlay ol li { + list-style: decimal; +} + +/* media queries for hero section for short height screens */ +.hero-section-1{ + padding-top: 2rem; + padding-bottom: 2rem; +} + +@media screen and (max-height: 760px) and (min-width: 1280px), screen and (max-height: 860px) and (min-width: 1280px) and (max-width: 1399px) { + .hero-section-1{ + height: 100%; + } + + h1{ + font-size: 48px !important; + } + h2{ + font-size: 36px !important; + } +} + +@media screen and (max-height: 780px) { + .hero-phone-background{ + height: 100%; + margin-top: 2rem; + margin-bottom: 4rem; + top: calc(66px + 2rem); + } +} + +.d-none-if-js-disabled{ + display: none !important; +} \ No newline at end of file diff --git a/css/swiper-bundle.min.css b/css/swiper-bundle.min.css new file mode 100644 index 0000000000..916173ac0d --- /dev/null +++ b/css/swiper-bundle.min.css @@ -0,0 +1,13 @@ +/** + * Swiper 8.4.3 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2022 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 6, 2022 + */ + +@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-android .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-pointer-events{touch-action:pan-y}.swiper-pointer-events.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d,.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide,.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top,.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-horizontal.swiper-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-vertical.swiper-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:10px;right:auto}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:10px;left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:50%;background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:10px;top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active,.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-next+.swiper-slide,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden} \ No newline at end of file diff --git a/css/tailwind.css b/css/tailwind.css new file mode 100644 index 0000000000..d27dd75ee8 --- /dev/null +++ b/css/tailwind.css @@ -0,0 +1,2997 @@ +/* +! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.visible { + visibility: visible; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.-left-10 { + left: -2.5rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-\[80px\] { + bottom: 80px; +} + +.left-0 { + left: 0px; +} + +.left-1 { + left: 0.25rem; +} + +.left-\[-3px\] { + left: -3px; +} + +.right-0 { + right: 0px; +} + +.right-1 { + right: 0.25rem; +} + +.right-\[-6px\] { + right: -6px; +} + +.top-0 { + top: 0px; +} + +.top-10 { + top: 2.5rem; +} + +.top-11 { + top: 2.75rem; +} + +.top-\[52\%\] { + top: 52%; +} + +.top-\[66px\] { + top: 66px; +} + +.top-full { + top: 100%; +} + +.z-10 { + z-index: 10; +} + +.z-50 { + z-index: 50; +} + +.z-\[10000\] { + z-index: 10000; +} + +.z-\[10001\] { + z-index: 10001; +} + +.z-\[49\] { + z-index: 49; +} + +.float-right { + float: right; +} + +.m-1 { + margin: 0.25rem; +} + +.m-auto { + margin: auto; +} + +.\!my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.mx-5 { + margin-left: 1.25rem; + margin-right: 1.25rem; +} + +.my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-5 { + margin-top: 1.25rem; + margin-bottom: 1.25rem; +} + +.my-\[40px\] { + margin-top: 40px; + margin-bottom: 40px; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.mb-14 { + margin-bottom: 3.5rem; +} + +.mb-16 { + margin-bottom: 4rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-20 { + margin-bottom: 5rem; +} + +.mb-24 { + margin-bottom: 6rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-32 { + margin-bottom: 8rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-7 { + margin-bottom: 1.75rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.mb-9 { + margin-bottom: 2.25rem; +} + +.mb-\[11px\] { + margin-bottom: 11px; +} + +.mb-\[12px\] { + margin-bottom: 12px; +} + +.mb-\[16px\] { + margin-bottom: 16px; +} + +.mb-\[20px\] { + margin-bottom: 20px; +} + +.mb-\[24px\] { + margin-bottom: 24px; +} + +.mb-\[28px\] { + margin-bottom: 28px; +} + +.mb-\[30px\] { + margin-bottom: 30px; +} + +.mb-\[36px\] { + margin-bottom: 36px; +} + +.mb-\[40px\] { + margin-bottom: 40px; +} + +.mb-\[46px\] { + margin-bottom: 46px; +} + +.mb-\[50px\] { + margin-bottom: 50px; +} + +.mb-\[74px\] { + margin-bottom: 74px; +} + +.mb-\[75px\] { + margin-bottom: 75px; +} + +.mb-\[76px\] { + margin-bottom: 76px; +} + +.mb-\[80px\] { + margin-bottom: 80px; +} + +.mb-\[8px\] { + margin-bottom: 8px; +} + +.mb-auto { + margin-bottom: auto; +} + +.ml-\[-15px\] { + margin-left: -15px; +} + +.ml-\[-6px\] { + margin-left: -6px; +} + +.mr-\[-4px\] { + margin-right: -4px; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-\[-100px\] { + margin-top: -100px; +} + +.mt-\[10px\] { + margin-top: 10px; +} + +.mt-\[14px\] { + margin-top: 14px; +} + +.mt-\[25px\] { + margin-top: 25px; +} + +.mt-\[30px\] { + margin-top: 30px; +} + +.mt-\[60px\] { + margin-top: 60px; +} + +.mt-\[66px\] { + margin-top: 66px; +} + +.mt-\[74px\] { + margin-top: 74px; +} + +.mt-\[8px\] { + margin-top: 8px; +} + +.mt-auto { + margin-top: auto; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.h-1 { + height: 0.25rem; +} + +.h-11 { + height: 2.75rem; +} + +.h-4 { + height: 1rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-\[110px\] { + height: 110px; +} + +.h-\[131px\] { + height: 131px; +} + +.h-\[138px\] { + height: 138px; +} + +.h-\[180px\] { + height: 180px; +} + +.h-\[1px\] { + height: 1px; +} + +.h-\[24px\] { + height: 24px; +} + +.h-\[322px\] { + height: 322px; +} + +.h-\[32px\] { + height: 32px; +} + +.h-\[340px\] { + height: 340px; +} + +.h-\[34px\] { + height: 34px; +} + +.h-\[36px\] { + height: 36px; +} + +.h-\[40px\] { + height: 40px; +} + +.h-\[44px\] { + height: 44px; +} + +.h-\[46px\] { + height: 46px; +} + +.h-\[480px\] { + height: 480px; +} + +.h-\[52px\] { + height: 52px; +} + +.h-\[55\%\] { + height: 55%; +} + +.h-\[66px\] { + height: 66px; +} + +.h-\[80px\] { + height: 80px; +} + +.h-\[calc\(100\%-81\.42px\)\] { + height: calc(100% - 81.42px); +} + +.h-\[calc\(100vh-66px\)\] { + height: calc(100vh - 66px); +} + +.h-\[inherit\] { + height: inherit; +} + +.h-auto { + height: auto; +} + +.h-fit { + height: -moz-fit-content; + height: fit-content; +} + +.h-full { + height: 100%; +} + +.h-screen { + height: 100vh; +} + +.max-h-\[226px\] { + max-height: 226px; +} + +.max-h-\[50px\] { + max-height: 50px; +} + +.min-h-\[131px\] { + min-height: 131px; +} + +.min-h-\[200px\] { + min-height: 200px; +} + +.min-h-\[620px\] { + min-height: 620px; +} + +.min-h-\[inherit\] { + min-height: inherit; +} + +.w-4 { + width: 1rem; +} + +.w-8 { + width: 2rem; +} + +.w-\[175px\] { + width: 175px; +} + +.w-\[235px\] { + width: 235px; +} + +.w-\[238px\] { + width: 238px; +} + +.w-\[36px\] { + width: 36px; +} + +.w-\[44px\] { + width: 44px; +} + +.w-\[630px\] { + width: 630px; +} + +.w-\[inherit\] { + width: inherit; +} + +.w-auto { + width: auto; +} + +.w-full { + width: 100%; +} + +.min-w-\[152px\] { + min-width: 152px; +} + +.min-w-\[170px\] { + min-width: 170px; +} + +.min-w-\[180px\] { + min-width: 180px; +} + +.min-w-\[210px\] { + min-width: 210px; +} + +.min-w-\[300px\] { + min-width: 300px; +} + +.max-w-\[223px\] { + max-width: 223px; +} + +.max-w-\[230px\] { + max-width: 230px; +} + +.max-w-\[234px\] { + max-width: 234px; +} + +.max-w-\[240px\] { + max-width: 240px; +} + +.max-w-\[265px\] { + max-width: 265px; +} + +.max-w-\[280px\] { + max-width: 280px; +} + +.max-w-\[294px\] { + max-width: 294px; +} + +.max-w-\[400px\] { + max-width: 400px; +} + +.max-w-\[448px\] { + max-width: 448px; +} + +.max-w-\[468px\] { + max-width: 468px; +} + +.max-w-\[475px\] { + max-width: 475px; +} + +.max-w-\[500px\] { + max-width: 500px; +} + +.max-w-\[540px\] { + max-width: 540px; +} + +.max-w-\[541px\] { + max-width: 541px; +} + +.max-w-\[602px\] { + max-width: 602px; +} + +.max-w-\[617px\] { + max-width: 617px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-\[1\] { + flex: 1; +} + +.flex-\[2\.5\] { + flex: 2.5; +} + +.flex-grow { + flex-grow: 1; +} + +.border-separate { + border-collapse: separate; +} + +.border-spacing-x-5 { + --tw-border-spacing-x: 1.25rem; + border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); +} + +.border-spacing-y-2 { + --tw-border-spacing-y: 0.5rem; + border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); +} + +.translate-x-\[-30\%\] { + --tw-translate-x: -30%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[-30\%\] { + --tw-translate-y: -30%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-pointer { + cursor: pointer; +} + +.resize { + resize: both; +} + +.list-inside { + list-style-position: inside; +} + +.list-decimal { + list-style-type: decimal; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-col-reverse { + flex-direction: column-reverse; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-10 { + gap: 2.5rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-16 { + gap: 4rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-\[150px\] { + gap: 150px; +} + +.gap-\[50px\] { + gap: 50px; +} + +.gap-x-10 { + -moz-column-gap: 2.5rem; + column-gap: 2.5rem; +} + +.gap-y-32 { + row-gap: 8rem; +} + +.self-center { + align-self: center; +} + +.self-stretch { + align-self: stretch; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-\[12px\] { + border-radius: 12px; +} + +.rounded-\[20px\] { + border-radius: 20px; +} + +.rounded-\[30px\] { + border-radius: 30px; +} + +.rounded-\[34px\] { + border-radius: 34px; +} + +.rounded-\[4px\] { + border-radius: 4px; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-b-\[20px\] { + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; +} + +.border { + border-width: 1px; +} + +.border-\[1px\] { + border-width: 1px; +} + +.border-solid { + border-style: solid; +} + +.border-\[\#0053D0\] { + --tw-border-opacity: 1; + border-color: rgb(0 83 208 / var(--tw-border-opacity)); +} + +.border-\[\#859096\] { + --tw-border-opacity: 1; + border-color: rgb(133 144 150 / var(--tw-border-opacity)); +} + +.border-\[\#A8B0B4\] { + --tw-border-opacity: 1; + border-color: rgb(168 176 180 / var(--tw-border-opacity)); +} + +.border-primary-light { + --tw-border-opacity: 1; + border-color: rgb(0 83 208 / var(--tw-border-opacity)); +} + +.border-opacity-60 { + --tw-border-opacity: 0.6; +} + +.bg-\[\#0053D0\] { + --tw-bg-opacity: 1; + background-color: rgb(0 83 208 / var(--tw-bg-opacity)); +} + +.bg-\[\#0197FF\] { + --tw-bg-opacity: 1; + background-color: rgb(1 151 255 / var(--tw-bg-opacity)); +} + +.bg-\[\#17203D\] { + --tw-bg-opacity: 1; + background-color: rgb(23 32 61 / var(--tw-bg-opacity)); +} + +.bg-\[\#48F6C2\] { + --tw-bg-opacity: 1; + background-color: rgb(72 246 194 / var(--tw-bg-opacity)); +} + +.bg-\[\#D9E7ED\] { + --tw-bg-opacity: 1; + background-color: rgb(217 231 237 / var(--tw-bg-opacity)); +} + +.bg-\[\#D9ECFF\] { + --tw-bg-opacity: 1; + background-color: rgb(217 236 255 / var(--tw-bg-opacity)); +} + +.bg-\[\#F0F1F2\] { + --tw-bg-opacity: 1; + background-color: rgb(240 241 242 / var(--tw-bg-opacity)); +} + +.bg-\[\#F3F6F7\] { + --tw-bg-opacity: 1; + background-color: rgb(243 246 247 / var(--tw-bg-opacity)); +} + +.bg-\[\#fff\] { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(13 14 18 / var(--tw-bg-opacity)); +} + +.bg-card-bg-light { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-card-desc-bg-light { + --tw-bg-opacity: 1; + background-color: rgb(217 231 237 / var(--tw-bg-opacity)); +} + +.bg-primary-bg-light { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-primary-light { + --tw-bg-opacity: 1; + background-color: rgb(0 83 208 / var(--tw-bg-opacity)); +} + +.bg-secondary-bg-light { + --tw-bg-opacity: 1; + background-color: rgb(243 246 247 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-yellow-200 { + --tw-bg-opacity: 1; + background-color: rgb(254 240 138 / var(--tw-bg-opacity)); +} + +.fill-\[rgb\(60\2c 60\2c 60\)\] { + fill: rgb(60,60,60); +} + +.fill-black { + fill: #0D0E12; +} + +.fill-grey-black { + fill: #3F484B; +} + +.fill-primary-light { + fill: #0053D0; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.\!py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.px-0 { + padding-left: 0px; + padding-right: 0px; +} + +.px-20 { + padding-left: 5rem; + padding-right: 5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.px-\[20px\] { + padding-left: 20px; + padding-right: 20px; +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.py-\[20px\] { + padding-top: 20px; + padding-bottom: 20px; +} + +.py-\[24px\] { + padding-top: 24px; + padding-bottom: 24px; +} + +.py-\[50px\] { + padding-top: 50px; + padding-bottom: 50px; +} + +.py-\[75px\] { + padding-top: 75px; + padding-bottom: 75px; +} + +.py-\[90px\] { + padding-top: 90px; + padding-bottom: 90px; +} + +.py-\[95px\] { + padding-top: 95px; + padding-bottom: 95px; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pb-8 { + padding-bottom: 2rem; +} + +.pb-\[90px\] { + padding-bottom: 90px; +} + +.pr-10 { + padding-right: 2.5rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.pt-\[106px\] { + padding-top: 106px; +} + +.pt-\[30px\] { + padding-top: 30px; +} + +.pt-\[40px\] { + padding-top: 40px; +} + +.pt-\[66px\] { + padding-top: 66px; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.\!text-lg { + font-size: 1.125rem !important; + line-height: 1.75rem !important; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-\[12px\] { + font-size: 12px; +} + +.text-\[14px\] { + font-size: 14px; +} + +.text-\[16px\] { + font-size: 16px; +} + +.text-\[18px\] { + font-size: 18px; +} + +.text-\[20px\] { + font-size: 20px; +} + +.text-\[24px\] { + font-size: 24px; +} + +.text-\[25px\] { + font-size: 25px; +} + +.text-\[28px\] { + font-size: 28px; +} + +.text-\[35px\] { + font-size: 35px; +} + +.text-\[38px\] { + font-size: 38px; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.capitalize { + text-transform: capitalize; +} + +.italic { + font-style: italic; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-\[19px\] { + line-height: 19px; +} + +.leading-\[24px\] { + line-height: 24px; +} + +.leading-\[26px\] { + line-height: 26px; +} + +.leading-\[28px\] { + line-height: 28px; +} + +.leading-\[33px\] { + line-height: 33px; +} + +.leading-\[34px\] { + line-height: 34px; +} + +.leading-\[36px\] { + line-height: 36px; +} + +.leading-\[43px\] { + line-height: 43px; +} + +.leading-\[45px\] { + line-height: 45px; +} + +.leading-\[46px\] { + line-height: 46px; +} + +.tracking-\[0\.01em\] { + letter-spacing: 0.01em; +} + +.tracking-\[0\.02em\] { + letter-spacing: 0.02em; +} + +.tracking-\[0\.03em\] { + letter-spacing: 0.03em; +} + +.tracking-\[0\.04em\] { + letter-spacing: 0.04em; +} + +.tracking-\[0\.06em\] { + letter-spacing: 0.06em; +} + +.\!text-\[rgb\(60\2c 60\2c 60\)\] { + --tw-text-opacity: 1 !important; + color: rgb(60 60 60 / var(--tw-text-opacity)) !important; +} + +.\!text-primary-pressed-light { + --tw-text-opacity: 1 !important; + color: rgb(64 122 210 / var(--tw-text-opacity)) !important; +} + +.text-\[\#606C71\] { + --tw-text-opacity: 1; + color: rgb(96 108 113 / var(--tw-text-opacity)); +} + +.text-\[\#A8B0B4\] { + --tw-text-opacity: 1; + color: rgb(168 176 180 / var(--tw-text-opacity)); +} + +.text-\[\#DD0000\] { + --tw-text-opacity: 1; + color: rgb(221 0 0 / var(--tw-text-opacity)); +} + +.text-active-blue { + --tw-text-opacity: 1; + color: rgb(1 151 255 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(13 14 18 / var(--tw-text-opacity)); +} + +.text-grey-black { + --tw-text-opacity: 1; + color: rgb(63 72 75 / var(--tw-text-opacity)); +} + +.text-primary-light { + --tw-text-opacity: 1; + color: rgb(0 83 208 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.\!no-underline { + text-decoration-line: none !important; +} + +.no-underline { + text-decoration-line: none; +} + +.underline-offset-2 { + text-underline-offset: 2px; +} + +.underline-offset-4 { + text-underline-offset: 4px; +} + +.opacity-100 { + opacity: 1; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0_0_3px_rgb\(60_72_88_\/_15\%\)\] { + --tw-shadow: 0 0 3px rgb(60 72 88 / 15%); + --tw-shadow-colored: 0 0 3px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0px_20px_30px_rgba\(0\2c 0\2c 0\2c 0\.12\)\] { + --tw-shadow: 0px 20px 30px rgba(0,0,0,0.12); + --tw-shadow-colored: 0px 20px 30px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0px_3px_12px_rgba\(0\2c 0\2c 0\2c 0\.2\)\] { + --tw-shadow: 0px 3px 12px rgba(0,0,0,0.2); + --tw-shadow-colored: 0px 3px 12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[2px_2px_0px_\#859096\] { + --tw-shadow: 2px 2px 0px #859096; + --tw-shadow-colored: 2px 2px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[inset_0px_2px_2px_rgba\(0\2c 0\2c 0\2c 0\.15\)\] { + --tw-shadow: inset 0px 2px 2px rgba(0,0,0,0.15); + --tw-shadow-colored: inset 0px 2px 2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.invert { + --tw-invert: invert(100%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.placeholder\:text-base::-moz-placeholder { + font-size: 1rem; + line-height: 1.5rem; +} + +.placeholder\:text-base::placeholder { + font-size: 1rem; + line-height: 1.5rem; +} + +.placeholder\:font-normal::-moz-placeholder { + font-weight: 400; +} + +.placeholder\:font-normal::placeholder { + font-weight: 400; +} + +.placeholder\:tracking-\[0\.01em\]::-moz-placeholder { + letter-spacing: 0.01em; +} + +.placeholder\:tracking-\[0\.01em\]::placeholder { + letter-spacing: 0.01em; +} + +.placeholder\:text-grey-black::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(63 72 75 / var(--tw-text-opacity)); +} + +.placeholder\:text-grey-black::placeholder { + --tw-text-opacity: 1; + color: rgb(63 72 75 / var(--tw-text-opacity)); +} + +.before\:absolute::before { + content: var(--tw-content); + position: absolute; +} + +.before\:h-full::before { + content: var(--tw-content); + height: 100%; +} + +.before\:w-full::before { + content: var(--tw-content); + width: 100%; +} + +.before\:bg-black::before { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(13 14 18 / var(--tw-bg-opacity)); +} + +.before\:bg-secondary-bg-light::before { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(243 246 247 / var(--tw-bg-opacity)); +} + +.before\:opacity-90::before { + content: var(--tw-content); + opacity: 0.9; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +:is([dir="ltr"] .ltr\:ml-8) { + margin-left: 2rem; +} + +:is([dir="ltr"] .ltr\:mr-auto) { + margin-right: auto; +} + +:is([dir="ltr"] .ltr\:\!hidden) { + display: none !important; +} + +:is([dir="ltr"] .ltr\:rounded-l-\[34px\]) { + border-top-left-radius: 34px; + border-bottom-left-radius: 34px; +} + +:is([dir="ltr"] .ltr\:rounded-r-\[34px\]) { + border-top-right-radius: 34px; + border-bottom-right-radius: 34px; +} + +:is([dir="rtl"] .rtl\:ml-auto) { + margin-left: auto; +} + +:is([dir="rtl"] .rtl\:mr-8) { + margin-right: 2rem; +} + +:is([dir="rtl"] .rtl\:\!hidden) { + display: none !important; +} + +:is([dir="rtl"] .rtl\:rounded-l-\[34px\]) { + border-top-left-radius: 34px; + border-bottom-left-radius: 34px; +} + +:is([dir="rtl"] .rtl\:rounded-r-\[34px\]) { + border-top-right-radius: 34px; + border-bottom-right-radius: 34px; +} + +:is([dir="rtl"] .rtl\:text-right) { + text-align: right; +} + +:is(.dark .dark\:block) { + display: block; +} + +:is(.dark .dark\:inline-block) { + display: inline-block; +} + +:is(.dark .dark\:flex) { + display: flex; +} + +:is(.dark .dark\:\!hidden) { + display: none !important; +} + +:is(.dark .dark\:hidden) { + display: none; +} + +:is(.dark .dark\:border) { + border-width: 1px; +} + +:is(.dark .dark\:border-none) { + border-style: none; +} + +:is(.dark .dark\:border-primary-dark) { + --tw-border-opacity: 1; + border-color: rgb(112 240 249 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-white) { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:bg-\[\#0C0B13\]) { + --tw-bg-opacity: 1; + background-color: rgb(12 11 19 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#0E2B57\]) { + --tw-bg-opacity: 1; + background-color: rgb(14 43 87 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#11182F\]) { + --tw-bg-opacity: 1; + background-color: rgb(17 24 47 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#171F3A\]) { + --tw-bg-opacity: 1; + background-color: rgb(23 31 58 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#17203D\]) { + --tw-bg-opacity: 1; + background-color: rgb(23 32 61 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[rgba\(112\2c 240\2c 249\2c 0\.2\)\]) { + background-color: rgba(112,240,249,0.2); +} + +:is(.dark .dark\:bg-black) { + --tw-bg-opacity: 1; + background-color: rgb(13 14 18 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-card-bg-dark) { + --tw-bg-opacity: 1; + background-color: rgb(23 32 61 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-card-desc-bg-dark) { + --tw-bg-opacity: 1; + background-color: rgb(27 50 92 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-grey-black) { + --tw-bg-opacity: 1; + background-color: rgb(63 72 75 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-primary-bg-dark) { + --tw-bg-opacity: 1; + background-color: rgb(12 11 19 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-primary-dark) { + --tw-bg-opacity: 1; + background-color: rgb(112 240 249 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-secondary-bg-dark) { + --tw-bg-opacity: 1; + background-color: rgb(17 24 47 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-opacity-\[0\.2\]) { + --tw-bg-opacity: 0.2; +} + +:is(.dark .dark\:bg-gradient-radial-mobile) { + background-image: radial-gradient(77.4% 73.09% at -3.68% 100%, #17203D 0%, #0C0B13 100%); +} + +:is(.dark .dark\:fill-primary-dark) { + fill: #70F0F9; +} + +:is(.dark .dark\:fill-white) { + fill: #fff; +} + +:is(.dark .dark\:\!text-white) { + --tw-text-opacity: 1 !important; + color: rgb(255 255 255 / var(--tw-text-opacity)) !important; +} + +:is(.dark .dark\:text-\[\#70F0F9\]) { + --tw-text-opacity: 1; + color: rgb(112 240 249 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-black) { + --tw-text-opacity: 1; + color: rgb(13 14 18 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-primary-dark) { + --tw-text-opacity: 1; + color: rgb(112 240 249 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-white) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:opacity-\[0\.1\]) { + opacity: 0.1; +} + +:is(.dark .dark\:opacity-\[0\.2\]) { + opacity: 0.2; +} + +:is(.dark .dark\:shadow-none) { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +:is(.dark .placeholder\:dark\:text-white)::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +:is(.dark .placeholder\:dark\:text-white)::placeholder { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:before\:bg-primary-bg-dark)::before { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(12 11 19 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:before\:bg-white)::before { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +@media (min-width: 640px) { + .sm\:block { + display: block; + } + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:flex-row { + flex-direction: row; + } + + .sm\:p-14 { + padding: 3.5rem; + } + + .sm\:px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; + } + + .sm\:px-4 { + padding-left: 1rem; + padding-right: 1rem; + } +} + +@media (min-width: 768px) { + .md\:static { + position: static; + } + + .md\:mb-0 { + margin-bottom: 0px; + } + + .md\:mb-6 { + margin-bottom: 1.5rem; + } + + .md\:mt-6 { + margin-top: 1.5rem; + } + + .md\:block { + display: block; + } + + .md\:inline-block { + display: inline-block; + } + + .md\:flex { + display: flex; + } + + .md\:hidden { + display: none; + } + + .md\:h-fit { + height: -moz-fit-content; + height: fit-content; + } + + .md\:max-h-\[660px\] { + max-height: 660px; + } + + .md\:min-h-fit { + min-height: -moz-fit-content; + min-height: fit-content; + } + + .md\:w-\[168px\] { + width: 168px; + } + + .md\:w-fit { + width: -moz-fit-content; + width: fit-content; + } + + .md\:max-w-\[1276px\] { + max-width: 1276px; + } + + .md\:max-w-\[220px\] { + max-width: 220px; + } + + .md\:max-w-\[490px\] { + max-width: 490px; + } + + .md\:flex-1 { + flex: 1 1 0%; + } + + .md\:flex-\[1\] { + flex: 1; + } + + .md\:flex-\[2\] { + flex: 2; + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:flex-col-reverse { + flex-direction: column-reverse; + } + + .md\:items-start { + align-items: flex-start; + } + + .md\:items-center { + align-items: center; + } + + .md\:gap-14 { + gap: 3.5rem; + } + + .md\:gap-9 { + gap: 2.25rem; + } + + .md\:p-10 { + padding: 2.5rem; + } + + .md\:p-\[60px\] { + padding: 60px; + } + + .md\:px-0 { + padding-left: 0px; + padding-right: 0px; + } + + .md\:px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; + } + + .md\:py-16 { + padding-top: 4rem; + padding-bottom: 4rem; + } + + .md\:py-7 { + padding-top: 1.75rem; + padding-bottom: 1.75rem; + } + + .md\:py-8 { + padding-top: 2rem; + padding-bottom: 2rem; + } + + .md\:text-left { + text-align: left; + } + + .md\:\!text-xl { + font-size: 1.25rem !important; + line-height: 1.75rem !important; + } + + .md\:text-\[35px\] { + font-size: 35px; + } + + .md\:text-\[38px\] { + font-size: 38px; + } + + .md\:text-\[55px\] { + font-size: 55px; + } + + .md\:leading-\[43px\] { + line-height: 43px; + } + + .md\:leading-\[55px\] { + line-height: 55px; + } + + .md\:leading-\[63px\] { + line-height: 63px; + } + + :is([dir="rtl"] .md\:rtl\:inline-block) { + display: inline-block; + } + + :is([dir="rtl"] .md\:rtl\:text-right) { + text-align: right; + } + + :is(.dark .dark\:md\:inline-block) { + display: inline-block; + } + + :is(.dark .md\:dark\:inline-block) { + display: inline-block; + } +} + +@media (min-width: 1024px) { + .lg\:absolute { + position: absolute; + } + + .lg\:relative { + position: relative; + } + + .lg\:top-0 { + top: 0px; + } + + .lg\:mb-0 { + margin-bottom: 0px; + } + + .lg\:mb-8 { + margin-bottom: 2rem; + } + + .lg\:mb-\[90px\] { + margin-bottom: 90px; + } + + .lg\:mt-0 { + margin-top: 0px; + } + + .lg\:mt-\[10px\] { + margin-top: 10px; + } + + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + + .lg\:h-0 { + height: 0px; + } + + .lg\:h-\[642px\] { + height: 642px; + } + + .lg\:h-\[66px\] { + height: 66px; + } + + .lg\:h-\[855px\] { + height: 855px; + } + + .lg\:h-\[888px\] { + height: 888px; + } + + .lg\:h-\[890px\] { + height: 890px; + } + + .lg\:h-\[950px\] { + height: 950px; + } + + .lg\:h-\[calc\(100vh-66px\)\] { + height: calc(100vh - 66px); + } + + .lg\:h-auto { + height: auto; + } + + .lg\:h-fit { + height: -moz-fit-content; + height: fit-content; + } + + .lg\:max-h-\[888px\] { + max-height: 888px; + } + + .lg\:w-2\/5 { + width: 40%; + } + + .lg\:w-3\/5 { + width: 60%; + } + + .lg\:w-auto { + width: auto; + } + + .lg\:max-w-\[240px\] { + max-width: 240px; + } + + .lg\:max-w-\[448px\] { + max-width: 448px; + } + + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .lg\:flex-row { + flex-direction: row; + } + + .lg\:flex-col { + flex-direction: column; + } + + .lg\:items-start { + align-items: flex-start; + } + + .lg\:items-center { + align-items: center; + } + + .lg\:gap-0 { + gap: 0px; + } + + .lg\:gap-16 { + gap: 4rem; + } + + .lg\:gap-28 { + gap: 7rem; + } + + .lg\:gap-5 { + gap: 1.25rem; + } + + .lg\:gap-\[350px\] { + gap: 350px; + } + + .lg\:bg-transparent { + background-color: transparent; + } + + .lg\:bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + } + + .lg\:px-0 { + padding-left: 0px; + padding-right: 0px; + } + + .lg\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + + .lg\:px-7 { + padding-left: 1.75rem; + padding-right: 1.75rem; + } + + .lg\:px-\[20px\] { + padding-left: 20px; + padding-right: 20px; + } + + .lg\:px-\[50px\] { + padding-left: 50px; + padding-right: 50px; + } + + .lg\:py-0 { + padding-top: 0px; + padding-bottom: 0px; + } + + .lg\:py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } + + .lg\:py-4 { + padding-top: 1rem; + padding-bottom: 1rem; + } + + .lg\:py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } + + .lg\:py-\[50px\] { + padding-top: 50px; + padding-bottom: 50px; + } + + .lg\:pt-0 { + padding-top: 0px; + } + + .lg\:text-center { + text-align: center; + } + + .lg\:text-\[32px\] { + font-size: 32px; + } + + .lg\:text-\[35px\] { + font-size: 35px; + } + + .lg\:text-\[38px\] { + font-size: 38px; + } + + .lg\:text-\[45px\] { + font-size: 45px; + } + + .lg\:text-\[65px\] { + font-size: 65px; + } + + .lg\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } + + .lg\:leading-\[36px\] { + line-height: 36px; + } + + .lg\:leading-\[45px\] { + line-height: 45px; + } + + .lg\:shadow-\[0_0_3px_rgb\(60_72_88_\/_15\%\)\] { + --tw-shadow: 0 0 3px rgb(60 72 88 / 15%); + --tw-shadow-colored: 0 0 3px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } + + :is([dir="ltr"] .ltr\:lg\:ml-4) { + margin-left: 1rem; + } + + :is([dir="ltr"] .ltr\:lg\:ml-5) { + margin-left: 1.25rem; + } + + :is([dir="ltr"] .lg\:ltr\:text-left) { + text-align: left; + } + + :is([dir="rtl"] .rtl\:lg\:mr-4) { + margin-right: 1rem; + } + + :is([dir="rtl"] .rtl\:lg\:mr-5) { + margin-right: 1.25rem; + } + + :is([dir="rtl"] .lg\:rtl\:text-right) { + text-align: right; + } + + :is(.dark .dark\:lg\:flex) { + display: flex; + } + + :is(.dark .dark\:lg\:hidden) { + display: none; + } + + :is(.dark .dark\:lg\:bg-black) { + --tw-bg-opacity: 1; + background-color: rgb(13 14 18 / var(--tw-bg-opacity)); + } + + :is(.dark .dark\:lg\:bg-gradient-radial) { + background-image: radial-gradient(88.77% 102.03% at 92.64% -13.22%, #17203D 0%, #0C0B13 100%); + } + + :is(.dark .dark\:lg\:bg-none) { + background-image: none; + } +} + +@media (min-width: 1280px) { + .xl\:absolute { + position: absolute; + } + + .xl\:sticky { + position: sticky; + } + + .xl\:mb-0 { + margin-bottom: 0px; + } + + .xl\:mb-8 { + margin-bottom: 2rem; + } + + .xl\:mb-\[25px\] { + margin-bottom: 25px; + } + + .xl\:block { + display: block; + } + + .xl\:flex { + display: flex; + } + + .xl\:hidden { + display: none; + } + + .xl\:h-\[888px\] { + height: 888px; + } + + .xl\:h-\[calc\(100vh-66px\)\] { + height: calc(100vh - 66px); + } + + .xl\:h-full { + height: 100%; + } + + .xl\:max-h-\[888px\] { + max-height: 888px; + } + + .xl\:min-h-\[565px\] { + min-height: 565px; + } + + .xl\:min-w-\[600px\] { + min-width: 600px; + } + + .xl\:max-w-\[600px\] { + max-width: 600px; + } + + .xl\:flex-row { + flex-direction: row; + } + + .xl\:flex-row-reverse { + flex-direction: row-reverse; + } + + .xl\:items-start { + align-items: flex-start; + } + + .xl\:items-center { + align-items: center; + } + + .xl\:justify-start { + justify-content: flex-start; + } + + .xl\:justify-between { + justify-content: space-between; + } + + .xl\:justify-around { + justify-content: space-around; + } + + .xl\:gap-10 { + gap: 2.5rem; + } + + .xl\:gap-8 { + gap: 2rem; + } + + .xl\:text-left { + text-align: left; + } + + .xl\:text-justify { + text-align: justify; + } + + .xl\:text-\[16px\] { + font-size: 16px; + } + + :is([dir="ltr"] .ltr\:xl\:ml-10) { + margin-left: 2.5rem; + } + + :is([dir="ltr"] .ltr\:xl\:ml-8) { + margin-left: 2rem; + } + + :is([dir="rtl"] .rtl\:xl\:mr-10) { + margin-right: 2.5rem; + } + + :is([dir="rtl"] .rtl\:xl\:mr-8) { + margin-right: 2rem; + } + + :is([dir="rtl"] .xl\:rtl\:text-right) { + text-align: right; + } +} diff --git a/de/contact/index.html b/de/contact/index.html new file mode 100644 index 0000000000..73f19551fa --- /dev/null +++ b/de/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Sie haben eine Adresse zur Verbindung mit SimpleX Chat erhalten

+

Um eine Verbindung zu starten:

+ +
+

Installieren Sie die SimpleX-App

+
+ + + +
+ +
+

1

+
+
+ +
+

Verbinden Sie sich in der Applikation

+ + + Öffnen Sie die SimpleX-App + +
+

2

+
+
+ +
+

Drücken Sie die „Verbinden“-Taste in der Applikation

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Nutzen Sie SimpleX

+

Wir laden Sie ein, sich an der Diskussion zu beteiligen

+ + + +

Melden Sie sich an, um Updates von uns zu erhalten

+ +
+ + + +
+ +
+ +

Laden Sie sich SimpleX herunter desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/de/fdroid/index.html b/de/fdroid/index.html new file mode 100644 index 0000000000..26f011e5f1 --- /dev/null +++ b/de/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat per F-Droid

+ +
+ +
+

SimpleX-Chat-Repository

+
+
+

Von den Entwicklern erstellte stabile und Beta-Versionen

+

Um es Ihrem F-Droid-Client hinzuzufügen, scannen Sie den QR-Code oder nutzen Sie diese URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Fingerabdruck des Signaturschlüssels (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org-Repository

+ +

Von F-Droid.org erstellte stabile Versionen

+

Die Versionen für dieses Repository werden einige Tage später erstellt.

+

SimpleX-Chat- und F-Droid.org-Repositorys signieren ihre Builds mit verschiedenen Schlüsseln. Zum Umschalten bitte die Chat-Datenbank exportieren und die App neu installieren.

+
+
+ +
+
+ + + + + + + + + + diff --git a/de/index.html b/de/index.html new file mode 100644 index 0000000000..312a9cae98 --- /dev/null +++ b/de/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/de/invitation/index.html b/de/invitation/index.html new file mode 100644 index 0000000000..6358878c58 --- /dev/null +++ b/de/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Sie haben einen Einmal-Link zur Verbindung mit SimpleX Chat erhalten

+

Um eine Verbindung zu starten:

+ +
+

Installieren Sie die SimpleX-App

+
+ + + +
+ +
+

1

+
+
+ +
+

Verbinden Sie sich in der Applikation

+ + + Öffnen Sie die SimpleX-App + +
+

2

+
+
+ +
+

Drücken Sie die „Verbinden“-Taste in der Applikation

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Nutzen Sie SimpleX

+

Wir laden Sie ein, sich an der Diskussion zu beteiligen

+ + + +

Melden Sie sich an, um Updates von uns zu erhalten

+ +
+ + + +
+ +
+ +

Laden Sie sich SimpleX herunter desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/de/learn-more/index.html b/de/learn-more/index.html new file mode 100644 index 0000000000..1417760958 --- /dev/null +++ b/de/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Warum ist SimpleX einmalig

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Sie erhalten eine vollumfängliche Privatsphäre

+
+ +
+ +
+

+ SimpleX schützt die Privatsphäre Ihres Profils, Ihrer Kontakte und Metadaten und verbirgt sie vor den SimpleX-Netzwerk-Servern und weiteren möglichen Beobachtern. +

+

+ Im Gegensatz zu allen anderen bestehenden Messaging-Netzwerken werden den Nutzern von SimpleX keine Kennungen zugewiesen — nicht einmal Zufallszahlen. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Sie sind geschützt vor
Spam und Missbrauch

+
+ +
+ +
+

+ Da Sie keine Kennung oder feste Adresse im SimpleX-Netzwerk haben, kann Sie niemand kontaktieren, es sei denn, Sie geben eine einmalige oder vorübergehende Benutzeradresse in Form eines QR-Codes oder Links weiter. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sie haben die Kontrolle über Ihre Daten

+
+ +
+ +
+

+ SimpleX speichert Benutzerdaten nur auf den Endgeräten und das in einem portablen, verschlüsselten Datenbankformat — welches auf ein anderes Gerät übertragen werden kann. +

+

+ Die Ende-zu-Ende-verschlüsselten Nachrichten werden vorübergehend auf SimpleX-Relay-Servern gespeichert, bis sie vom Endgerät empfangen und danach endgültig gelöscht werden. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Sie besitzen das SimpleX-Netzwerk

+
+ +
+ +
+

+ Das SimpleX-Netzwerk ist vollständig dezentralisiert und unabhängig von Kryptowährungen oder anderen Netzwerken außer dem Internet. +

+

+ Sie können SimpleX mit Ihren eigenen Servern oder mit den von uns zur Verfügung gestellten Servern verwenden — und sich trotzdem mit jedem Benutzer verbinden. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funktionen

+ +
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Nachrichten mit Markdowns und Bearbeitungsmöglichkeiten

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte
Bilder, Videos und Dateien

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte dezentralisierte Gruppen — Nur die Nutzer wissen, dass diese überhaupt existieren

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Sprachnachrichten

+
+ +
+
+ + +
+

Verschwindende geheime Unterhaltungen

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Sprach- und Videoanrufe

+
+ +
+
+ + +
+

Portable und verschlüsselte App-Datenspeicherung — verschieben Sie das komplette Profil einfach auf ein anderes Gerät

+
+ +
+
+ + +
+

Inkognito-Modus —
Einzigartig in SimpleX Chat

+
+ +
+
+
+ + +
+
+

Was macht SimpleX vertraulich

+ +
+
+ + +
+
+ + +
+
+

Temporäre, anonyme paarweise Kennungen

+
+ +

SimpleX nutzt für jeden Nutzer-Kontakt oder jedes Gruppenmitglied eigene temporäre, anonyme und paarweise Adressen und Berechtigungsnachweise.

+ +

SimpleX erlaubt es, Nachrichten ohne Nutzerprofil-Bezeichner zu versenden und bietet dabei bessere Metadaten-Privatsphäre an als andere Alternativen.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Out-of-Band-
Schlüsselaustausch

+
+ +

Viele Kommunikations-Netzwerke sind für MITM-Angriffe durch Server oder Netzwerk-Anbieter anfällig.

+ +

Um das zu verhindern, werden von SimpleX Einmal-Schlüssel Out-of-Band weitergeleitet, wenn Sie eine Adresse als Link oder QR-Code teilen.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Zwei Schichten der
Ende-zu-Ende-Verschlüsselung

+
+ +

Double-Ratchet-Protokoll —
Off-the-Record-Nachrichten mit Perfect Forward secrecy, Abstreitbarkeit und Wiederherstellung nach einer Kompromittierung.

+ +

NaCL-Kryptobox in jeder Warteschlange, um eine Korrelation des Datenverkehrs zwischen Nachrichtenwarteschlangen zu verhindern, falls TLS kompromittiert wurde.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Nachrichten-Integritäts-
Überprüfung

+
+ +

Um die Integrität von Nachrichten sicherzustellen, werden sie sequentiell durchnummeriert und beinhalten den Hash der vorhergehenden Nachricht.

+ +

Der Empfänger wird alarmiert, sobald eine Nachricht ergänzt, entfernt oder verändert wird.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Zusätzliche Schicht der
Server-Verschlüsselung

+
+ +

Zusätzliche Server-Verschlüsselungs-Schicht für die Zustellung an den Empfänger, um eine Korrelation zwischen empfangenen und gesendeten Server-Daten zu vermeiden, falls TLS kompromittiert wurde.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Mischen von Nachrichten,
um Korrelationen zu reduzieren

+
+ +

Die SimpleX-Server arbeiten als Mix-Knoten mit geringer Verzögerung — eingehende und ausgehende Nachrichten haben eine unterschiedliche Reihenfolge.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Sichere authentifizierte
TLS-Transportschicht

+
+ +

Für Client-Server-Verbindungen wird nur TLS 1.2/1.3 mit starken Algorithmen verwendet.

+ +

Server-Fingerabdrücke und Kanalbindung verhindern MITM- und Replay-Angriffe.

+ +

Die Wiederaufnahme von Verbindungen ist deaktiviert, um Sitzungs-Angriffe zu verhindern.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Optionaler
Zugang per Tor

+
+ +

Um Ihre IP-Adresse zu schützen, können Sie per Tor oder irgendeinem anderen Transportschichten-Netzwerk auf Server zugreifen.

+ +

Um SimpleX per Tor zu nutzen, installieren Sie unter Android bitte die Orbot-App und aktivieren Sie den SOCKS5-Proxy oder unter iOS per VPN.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Unidirektionale
Nachrichten-Warteschlangen

+
+ +

Jede Nachrichten-Warteschlange leitet Nachrichten mit unterschiedlichen Sende- und Empfängeradressen jeweils nur in einer Richtung weiter.

+ +

Verglichen mit traditionellen Nachrichten-Brokern, werden mögliche Angriffs-Vektoren und vorhandene Metadaten reduziert.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Mehrere Schichten der
Inhalteauffüllung

+
+ +

SimpleX nutzt Inhalte-Auffüllung für jede Verschlüsselungs-Schicht, um Angriffe auf die Nachrichtengröße zu vereiteln.

+ +

Erzeugt Nachrichten mit unterschiedlichen Größen, die für Server und Netzwerk-Beobachter identisch aussehen.

+ +
+

Zum Schließen drücken

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX-Netzwerk

+

Durch die Kombination der Vorteile von P2P und föderierten Netzwerken stellt SimpleX die bestmögliche Privatsphäre zur Verfügung.

+ +
+
+
+ + +
+
+

Im Gegensatz zu P2P-Netzwerken

+

+ Alle Nachrichten werden über Server versandt, was sowohl einen besseren Schutz der Metadaten als auch eine zuverlässigere asynchrone Nachrichtenübermittlung ermöglicht und dabei Vieles vermeidet Probleme von P2P-Netzwerken. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Im Gegensatz zu föderierten Netzwerken

+

+ SimpleX-Relay-Server speichern KEINE Benutzerprofile, Kontakte und zugestellte Nachrichten und stellen KEINE Verbindungen untereinander her, und es gibt KEIN Serververzeichnis. +

+
+
+ + + +
+
+ + +
+
+

SimpleX-Netzwerk

+

+ Die Server stellen unidirektionale Warteschlangen zur Verfügung, um die Benutzer miteinander zu verbinden. Sie haben aber keinen Einblick in den Verbindungs-Graphen des Netzwerks — Diesen haben nur die Benutzer selbst. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX erklärt

+ + + + + + + +
+
+ +
+
1. Wie es die Nutzer erleben
+
+ +

+ Sie können Kontakte und Gruppen erstellen und haben Zwei-Wege-Kommunikation wie in jedem anderen Messenger. +

+

+ Wie funktioniert das mit den unidirektionalen Warteschlangen und ohne Profilkennungen? +

+
+
+ +
+
2. Wie es funktioniert
+
+ +

+ Für jede Verbindung nutzen Sie zwei separate Nachrichten-Warteschlangen, um die Nachrichten über verschiedene Server zu senden und zu empfangen. +

+

+ Die Server leiten Nachrichten immer nur in eine Richtung weiter, ohne den vollständigen Verlauf der Nutzer-Unterhaltungen oder seiner Verbindungen zu kennen. +

+
+
+ +
+
3. Was die Server sehen
+
+ +

+ Die Server nutzen für jede Warteschlange separate, anonyme Anmeldeinformationen und wissen nicht, welchem Nutzer diese gehören. +

+

+ Durch die Verwendung von Tor-Zugangsservern können Nutzer ihre Metadaten-Privatsphäre weiter verbessern und Korellationen von IP-Adressen verhindern. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vergleich mit anderen Protokollen

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, große PlattformenXMPP / MatrixP2P-Protokolle
Benötigt eine globale KennungNein – vertraulichJa 1Ja 2Ja 3
Möglichkeit eines MITM-AngriffsNein – sicher 4Ja 5JaJa
Abhängigkeit vom DNS-SystemNein – widerstandsfähigJaJaNein
Einzelnes oder zentralisiertes NetzwerkNein – dezentralisiertJaNein – föderiert 6Ja 7
Zentrale Komponente oder andere Netzwerk-weite AngriffeNein – widerstandsfähigJaJa 2Ja 8
+
+ +
+ +
+
+
    +
  1. Normalerweise auf der Grundlage einer Telefonnummer, in einigen Fällen auf der Grundlage von Benutzernamen
  2. +
  3. DNS-basierte Adressen
  4. +
  5. Öffentlicher Schlüssel oder eine andere weltweit eindeutige ID
  6. +
  7. SimpleX-Relais können die E2E-Verschlüsselung nicht kompromittieren. Überprüfen Sie den Sicherheitscode, um einen möglichen Angriff auf den Out-of-Band-Kanal zu entschärfen
  8. +
  9. Wenn die Server des Betreibers kompromittiert werden. In Signal und weiteren Apps kann der Sicherheitscode überprüft werden, um dies zu entschärfen
  10. +
  11. Die Privatsphäre-Metadaten des Nutzers werden nicht geschützt
  12. +
  13. P2P sind zwar verteilt, aber nicht föderiert — sie arbeiten als ein einziges Netzwerk
  14. +
  15. P2P-Netzwerke haben entweder eine zentrale Verwaltung oder das gesamte Netzwerk kann kompromittiert werden - Siehe hier
  16. +
+
+
+
+
+ + +

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Peer-to-peer

Peer-to-peer (P2P) is the network architecture when participants have equal rights and communicate directly via a general purpose transport or overlay network. Unlike client-server architecture, all peers in a P2P network both provide and consume the resources. In the context of messaging, P2P architecture usually means that the messages are sent between peers, without user accounts or messages being stored on any servers. Examples are Tox, Briar, Cwtch and many others.

+ + + + + + + + + + diff --git a/directory/index.html b/directory/index.html new file mode 100644 index 0000000000..5ba56499a9 --- /dev/null +++ b/directory/index.html @@ -0,0 +1,810 @@ + + + + + + + SimpleX Directory + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + + + +
+
+

SimpleX Directory

+

Welcome to the selected users' communities that you can join via SimpleX Chat + app.

+

SimpleX Directory is also available as a SimpleX chat bot.

+

Read about how to add your community.

+
+ + +
+
+ +
+
+ + + + + + + + + + diff --git a/docs/android.html b/docs/android.html new file mode 100644 index 0000000000..a2dafd3f07 --- /dev/null +++ b/docs/android.html @@ -0,0 +1,1096 @@ + + + + + + + + + Accessing files in Android app + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 07.02.2023 | EN, CZ, FR, PL |

+

Accessing files in Android app

+

SimpleX uses databases and stores its preferences inside private data directory in Android. The directory contains:

+
    +
  • databases
  • +
  • sent and received files
  • +
  • temporary files that will be deleted when not needed
  • +
  • user preferences.
  • +
+

If you want to view what's stored inside SimpleX data directory you need to have:

+
    +
  • Unix-based operating system (or MinGW on Windows)
  • +
  • ADB (Android Debug Bridge) tool installed on a computer (download it here and install)
  • +
  • your device connected via USB or Wi-Fi to the computer.
  • +
+

The process:

+
    +
  • open SimpleX, go to Database passphrase & export, enable App data backup. This will make other steps working
  • +
  • optional: if you want to view database contents, change database passphrase from random to yours. To do this, stop a chat in Database passphrase & export screen, open Database passphrase, enter new passphrase and confirm it, then update it. Do not forget it, otherwise you'll lose all your data in case passphrase will be asked again later
  • +
  • open a terminal emulator (Windows CMD/Powershell will not work) and change directory to the one you want to use for storing the backup:
  • +
+
cd /tmp  # just an example
+
+

Then run the following:

+
adb -d backup -f chat.ab -noapk chat.simplex.app && 
+tail -n +5 chat.ab > chat.dat && 
+printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - chat.dat > chat.gz && 
+tar -xvzf chat.gz
+
+

Now unlock the device and confirm a backup operation without using a password for encryption, otherwise the commands will not work.

+

After that the backup should be ended. If you see an error saying tar: Error is not recoverable: exiting now but before that you have printed some file names, don't worry, it's ok.

+

Now the backed-up files will be inside ./apps/chat.simplex.app/.

+

Please, note, that if you use a modern version of SimpleX, the databases will be encrypted, and you'll not be able to view contents of them without using sqlcipher application and without knowing decryption passphrase (you need to change it to yours from randomly generated in the app firstly).

+

Decrypting databases

+

In order to view database data you need to decrypt it first. Install sqlcipher using your favorite package manager and run the following commands in the directory with databases:

+
sqlcipher files_chat.db
+pragma key="youDecryptionPassphrase";
+# Ensure it works fine
+select * from users;
+
+

If you see Parse error: no such table: users, make sure you entered correct passphrase, and you have changed passphrase from random in Android app (if you got this database from Android device, of course).

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/business.html b/docs/business.html new file mode 100644 index 0000000000..38082b0f43 --- /dev/null +++ b/docs/business.html @@ -0,0 +1,1009 @@ + + + + + + + + + SimpleX for business + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Using SimpleX Chat in business

+

SimpleX Chat (aka SimpleX) is a decentralized communication network that provides private and secure messaging. Its users are rapidly growing, and providing customer services via SimpleX can offer you a unique opportunity to engage people who are the most enthusiastic about trying out early stage technology products and services.

+

This document aims to help you make the best use of SimpleX Chat if you choose to engage with its users.

+

Communcate with customers via business address

+

In the same way you can connect to our "SimpleX Chat team" profile via the app, you can provide the address for your existing and prospective customers:

+
    +
  • to buy your product and services via chat,
  • +
  • to ask any questions, make suggestions and provide feedback,
  • +
  • to discover more information about your business.
  • +
+

Customers who value privacy and security, and want to engage with you without sharing any personal data and minimizing any metadata that is shared with you, will be really happy to use this communication channel.

+

From v6.2 SimpleX Chat supports business addresses. Their design allows you to accept requests from multiple customers, with the app creating a new business chat with each of them.

+

Business chats operate in a way similar to dedicated customer support systems by combining features of direct conversations and groups, and the only widely used messenger that provides such functionality is WeChat with Chinese business accounts.

+

When a customer connects to your business via the business contact address, a new conversation is created. Similarly to how direct chats work, the customer will see the name and logo of your business, and you will see the name and avatar of your customer.

+

But the business conversation works as a group - once the customer is connected, other people from the business can be added to the conversation, and the customers will see who are they talking with. This can be used to transfer business conversation to another person, or for escalation - in the same way as with the dedicated support systems.

+

SimpleX Chat profile with the business address can be used in one of these ways:

+
    +
  • for small teams it can be managed by one person running the app on their desktop computer, who would respond to customer questions and manually add to the conversation other people in the business, as required.
  • +
  • if you have multiple support agents, you can run business profile in CLI client running in cloud VM or on any machine with high speed Internet (see Technical advice below), and they can connect to this client from desktop client, in turns. This is how we use our business profile ourselves, even though it requires some configuration. You can manage 100s of thousands of connected customers in this way.
  • +
  • For larger teams, it would be appropriate to have this profile managed by chat bot that can reply to some simple questions, and to add support agents, based on their availability and the questions asked. These scenarios would require programming a chat bot, and we are currently working to simplify it.
  • +
+

In any case, it is important that the client application remains running and connected to the Internet for you to receive support requests.

+

Customer broadcasts

+

While currently supported only via CLI clients (or via chat console in desktop and mobile clients), it can be used to broadcast important announcements to all connected customers. We will be adding this feature to desktop clients soon. We use it to broadcast release updates to a very large number of users who are connected to our own support profile.

+

Community groups and promotion in group directory

+

In addition to providing support to clients individually, you can create a community group, and promote it via our experimental and growing directory of public groups. Community groups require ongoing moderation.

+

Limitations

+

With all advantages in privacy and security of e2e encryption in SimpleX Chat, there are some important limitations:

+
    +
  • protecting your data from loss is your responsibility. This is the price of privacy - if you lose your device, or database passphrase, there is absolutely no way we would be able to support you to recover access. There are ways to work around these limitations.
  • +
  • you cannot access the same profile from multiple devices. For all communication products it's a basic expectation, and yet there is not a single one that delivered it without some very serious privacy and security compromises. Better solutions are possible, and we will be implementing it, but reasonably secure approach is much more complex to implement than what is affordable at the current stage. You can access mobile or CLI profile from desktop, and the latter allows to use one profile by multiple people in turns, as we explain below.
  • +
  • your owner role in the groups cannot be restored if you lose the device. The solution is to create owner profiles on multiple devices for all your important groups. This way if you lose device or data for one of profiles, you won't lose control of the group, and you can add a new one. Think about it as about keys to your cryptowallet.
  • +
  • current groups are highly experimental. Message delivery can be delayed or fail in some cases, lists of members can be out of sync. There are approaches to make them more stable we use for our groups.
  • +
+

Technical advice

+

Running SimpleX Chat in the cloud

+

To install SimpleX Chat CLI in the cloud, follow this:

+
    +
  1. +

    Create dedicated user for CLI:

    +
    useradd -m -s /bin/bash simplex-cli
    +
    +
  2. +
  3. +

    Create new tmux session

    +
    tmux new -s simplex-cli
    +
    +
  4. +
  5. +

    Login to dedicated user:

    +
    su - simplex-cli
    +
    +
  6. +
  7. +

    Install CLI:

    +
    curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
    +
    +
  8. +
  9. +

    Run the CLI:

    +
    simplex-chat
    +
    +
  10. +
+

To deattach from running CLI simply press Ctrl+B and then D.

+

To reattach back to CLI, run: tmux attach -t simplex-cli.

+

Using remote profiles via Desktop app

+

To use CLI from Desktop app, follow this:

+
    +
  1. +

    Enable Developer tools in desktop app.

    +
  2. +
  3. +

    In the Desktop app, click - Linked mobile -> + Link a mobile, choose local address 127.0.0.1, enter some fixed port (can be any free port, e.g. 12345), and copy the link.

    +
  4. +
  5. +

    In the same machine where Desktop app is running, execute:

    +

    Change PORT to port, chosen in the previous step in Desktop app and SERVER_IP to your server.

    +
    ssh -R PORT:127.0.0.1:PORT -N root@SERVER_IP
    +
    +
  6. +
  7. +

    In the CLI on the server:

    +

    Change LINK to link, copied in the first step and enter the following:

    +
    /crc LINK
    +
    +

    CLI will print verification code:

    +
    Compare session code with controller and use:
    +/verify remote ctrl ...
    +
    +

    Simply copy the whole line starting with /verify ... from the terminal and paste it. Now you can control the CLI from your Desktop app.

    +
  8. +
+

Organizations using SimpleX Chat for customer service, support and sales

+

Please let us know if you use SimpleX Chat to communicate with your customers and want to be included in this list.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/cli.html b/docs/cli.html new file mode 100644 index 0000000000..a25f3cf234 --- /dev/null +++ b/docs/cli.html @@ -0,0 +1,1226 @@ + + + + + + + + + Terminal CLI + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 31.01.2023 | Languages: EN, FR, CZ, PL |

+

SimpleX Chat terminal (console) app for Linux/MacOS/Windows

+

Table of contents

+ +

Terminal chat features

+
    +
  • 1-to-1 chat with multiple people in the same terminal window.
  • +
  • Group messaging.
  • +
  • Sending files to contacts and groups.
  • +
  • User contact addresses - establish connections via multiple-use contact links.
  • +
  • Messages persisted in a local SQLite database.
  • +
  • Auto-populated recipient name - just type your messages to reply to the sender once the connection is established.
  • +
  • Demo SMP servers available and pre-configured in the app - or you can deploy your own server.
  • +
  • No global identity or any names visible to the server(s), ensuring full privacy of your contacts and conversations.
  • +
  • Two layers of E2E encryption (double-ratchet for duplex connections, using X3DH key agreement with ephemeral Curve448 keys, and NaCl crypto_box for SMP queues, using Curve25519 keys) and out-of-band passing of recipient keys (see How to use SimpleX chat).
  • +
  • Message integrity validation (via including the digests of the previous messages).
  • +
  • Authentication of each command/message by SMP servers with automatically generated Ed448 keys.
  • +
  • TLS 1.3 transport encryption.
  • +
  • Additional encryption of messages from SMP server to recipient to reduce traffic correlation.
  • +
+

Public keys involved in key exchange are not used as identity, they are randomly generated for each contact.

+

See Encryption Primitives Used for technical details.

+

+

🚀 Installation

+

Download chat client

+

Linux and MacOS

+

To install or update simplex-chat, you should run the install script. To do that, use the following cURL or Wget command:

+
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+
wget -qO- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+

Once the chat client downloads, you can run it with simplex-chat command in your terminal.

+

Alternatively, you can manually download the chat binary for your system from the latest stable release and make it executable as shown below.

+
chmod +x <binary>
+mv <binary> ~/.local/bin/simplex-chat
+
+

(or any other preferred location on PATH).

+

On MacOS you also need to allow Gatekeeper to run it.

+

Windows

+
move <binary> %APPDATA%/local/bin/simplex-chat.exe
+
+

Build from source

+
+

Please note: to build the app use source code from stable branch.

+
+

Using Docker

+

On Linux, you can build the chat executable using docker build with custom output:

+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+DOCKER_BUILDKIT=1 docker build --output ~/.local/bin .
+
+
+

Please note: If you encounter version `GLIBC_2.28' not found error, rebuild it with haskell:8.10.7-stretch base image (change it in your local Dockerfile).

+
+

In any OS

+
    +
  1. Install Haskell GHCup, GHC 9.6.3 and cabal 3.10.1.0:
  2. +
+
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
+
+

You can use ghcup tui to check or add GHC and cabal versions.

+
    +
  1. Clone the source code:
  2. +
+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+# or to build a specific version:
+# git checkout v5.3.0-beta.8
+
+

master is a development branch, it may contain unstable code.

+
    +
  1. Prepare the system:
  2. +
+

On Linux:

+
apt-get update && apt-get install -y build-essential libgmp3-dev zlib1g-dev
+cp scripts/cabal.project.local.linux cabal.project.local
+
+

On Mac:

+
brew install openssl@3.0
+cp scripts/cabal.project.local.mac cabal.project.local
+
+

You may need to amend cabal.project.local to point to the actual openssl location.

+
    +
  1. Build the app:
  2. +
+
cabal update
+cabal install simplex-chat
+
+

Usage

+

Running the chat client

+

To start the chat client, run simplex-chat from the terminal.

+

By default, app data directory is created in the home directory (~/.simplex, or %APPDATA%/simplex on Windows), and two SQLite database files simplex_v1_chat.db and simplex_v1_agent.db are initialized in it.

+

To specify a different file path prefix for the database files use -d command line option:

+
$ simplex-chat -d alice
+
+

Running above, for example, would create alice_v1_chat.db and alice_v1_agent.db database files in current directory.

+

Three default SMP servers are hosted on Linode - they are pre-configured in the app.

+

If you deployed your own SMP server(s) you can configure client via -s option:

+
$ simplex-chat -s smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@smp.example.com
+
+

Base64url encoded string preceding the server address is the server's offline certificate fingerprint which is validated by client during TLS handshake.

+

You can still talk to people using default or any other server - it only affects the location of the message queue when you initiate the connection (and the reply queue can be on another server, as set by the other party's client).

+

Run simplex-chat -h to see all available options.

+

Access messaging servers via Tor

+

Install Tor and run it as SOCKS5 proxy on port 9050, e.g. on Mac you can:

+
brew install tor
+brew services start tor
+
+

Use -x option to access servers via Tor:

+
simplex-chat -x
+
+

You can also use option --socks-proxy=ipv4:port or --socks-proxy=:port to configure host and port of your SOCKS5 proxy, e.g. if you are running it on some other host or port.

+

How to use SimpleX chat

+

Once you have started the chat, you will be prompted to specify your "display name" and an optional "full name" to create a local chat profile. Your display name is an alias for your contacts to refer to you by - it is not unique and does not serve as a global identity. If some of your contacts chose the same display name, the chat client adds a numeric suffix to their local display name.

+

The diagram below shows how to connect and message a contact:

+
+ +
+

Once you've set up your local profile, enter /c (for /connect) to create a new connection and generate an invitation. Send this invitation to your contact via any other channel.

+

You are able to create multiple invitations by entering /connect multiple times and sending these invitations to the corresponding contacts you'd like to connect with.

+

The invitation can only be used once and even if this is intercepted, the attacker would not be able to use it to send you the messages via this queue once your contact confirms that the connection is established. See agent protocol for explanation of invitation format.

+

The contact who received the invitation should enter /c <invitation> to accept the connection. This establishes the connection, and both parties are notified.

+

They would then use @<name> <message> commands to send messages. You may also just start typing a message to send it to the contact that was the last.

+

Use /help in chat to see the list of available commands.

+

Groups

+

To create a group use /g <group>, then add contacts to it with /a <group> <name>. You can then send messages to the group by entering #<group> <message>. Use /help groups for other commands.

+

simplex-chat

+
+

Please note: the groups are not stored on any server, they are maintained as a list of members in the app database to whom the messages will be sent.

+
+

Sending files

+

You can send a file to your contact with /f @<contact> <file_path> - the recipient will have to accept it before it is sent. Use /help files for other commands.

+

simplex-chat

+

You can send files to a group with /f #<group> <file_path>.

+

User contact addresses

+

As an alternative to one-time invitation links, you can create a long-term address with /ad (for /address). The created address can then be shared via any channel, and used by other users as a link to make a contact request with /c <user_contact_address>.

+

You can accept or reject incoming requests with /ac <name> and /rc <name> commands.

+

User address is "long-term" in a sense that it is a multiple-use connection link - it can be used until it is deleted by the user, in which case all established connections would still remain active (unlike how it works with email, when changing the address results in people not being able to message you).

+

Use /help address for other commands.

+

simplex-chat

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/code_of_conduct.html b/docs/code_of_conduct.html new file mode 100644 index 0000000000..952c1a88d8 --- /dev/null +++ b/docs/code_of_conduct.html @@ -0,0 +1,924 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Code of Conduct

+

We’re building great software through engineering excellence, prioritizing users’ needs, and collaboration based on merit and respect.

+

Everyone is welcome to contribute by following these guidelines:

+

Contribution Acceptance: We evaluate contributions iteratively based on quality, user needs, and project goals. Discuss plans early to align efforts, as acceptance depends on refinement guided by maintainers’ feedback.

+

Equal Treatment: All contributors are valued equally, regardless of background or beliefs. Discrimination or policies favoring specific groups are not allowed.

+

Constructive Criticism: Share clear, evidence-based and respectful criticism to improve the project.

+

Focus on Work: Avoid fear, uncertainty, doubt (FUD), or personal attacks.

+

Relevant Discussions: Stick to software and project goals, avoiding politics, ideology, or unrelated topics.

+

Violations may lead to warnings, temporary bans, or removal, at maintainers’ discretion.

+

Let’s create great software together!

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/contributing.html b/docs/contributing.html new file mode 100644 index 0000000000..c74138905d --- /dev/null +++ b/docs/contributing.html @@ -0,0 +1,1177 @@ + + + + + + + + + Contributing guide + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 25.07.2025 | Languages: EN, FR, CZ, PL |

+

Contributing guide

+

Compiling with SQLCipher encryption enabled

+

Add cabal.project.local to project root with the location of OpenSSL headers and libraries and flag setting encryption mode:

+
cp scripts/cabal.project.local.mac cabal.project.local
+# or
+# cp scripts/cabal.project.local.linux cabal.project.local
+
+

OpenSSL on MacOS

+

MacOS comes with LibreSSL as default, OpenSSL must be installed to compile SimpleX from source.

+

OpenSSL can be installed with brew install openssl@3.0

+

You will have to add /opt/homebrew/opt/openssl@3.0/bin to your PATH in order to have things working properly

+

Project branches

+

In simplex-chat repo

+
    +
  • +

    stable - stable release of the apps, can be used for updates to the previous stable release (GHC 9.6.3).

    +
  • +
  • +

    stable-android - used to build stable Android core library with Nix (GHC 8.10.7) - only for Android armv7a.

    +
  • +
  • +

    master - branch for beta version releases (compatible with both GHC 9.6.3 and 8.10.7).

    +
  • +
  • +

    master-android - used to build beta Android core library with Nix (GHC 8.10.7) - only for Android armv7a.

    +
  • +
+

In simplexmq repo

+
    +
  • master - compatible with both GHC 9.6.3 and 8.10.7.
  • +
+

Development & release process

+
    +
  1. +

    Make PRs to master branch only for both simplex-chat and simplexmq repos.

    +
  2. +
  3. +

    To build core libraries for Android, iOS and windows:

    +
  4. +
+
    +
  • merge master branch to master-android branch.
  • +
  • push to GitHub.
  • +
+
    +
  1. +

    All libraries should be built from master branch, Android armv7a - from master-android branch.

    +
  2. +
  3. +

    To build Desktop and CLI apps, make tag in master branch, APK files should be attached to the release.

    +
  4. +
  5. +

    After the public release to App Store and Play Store, merge:

    +
  6. +
+
    +
  • master to stable
  • +
  • master to master-android (and compile/update code)
  • +
  • master-android to stable-android
  • +
+
    +
  1. Independently, master branch of simplexmq repo should be merged to stable branch on stable releases.
  2. +
+

Branches and PRs

+

Use change scope (or comma separated scopes) as the first word in the PR names, followed by the colon. Commit name itself should be lowercase, in present tense.

+

The PR names in simplex-chat repo are used in release notes, they should describe the solved problem and not the change. Possible PR scopes:

+
    +
  • ios
  • +
  • android
  • +
  • desktop
  • +
  • core
  • +
  • docs
  • +
  • website
  • +
  • ci
  • +
+

We squash PRs, do not rewrite branch history after the review.

+

For some complex features we create feature branches that will be merged once ready - do not make commits directly to them, make PRs to feature branches.

+

Differences between GHC 8.10.7 and GHC 9.6.3

+
    +
  1. The main difference is related to DuplicateRecordFields extension.
  2. +
+

It is no longer possible in GHC 9.6.3 to specify type when using selectors, instead OverloadedRecordDot extension and syntax are used that need to be removed in GHC 8.10.7:

+
{-# LANGUAGE DuplicateRecordFields #-}
+-- use this in GHC 9.6.3 when needed
+{-# LANGUAGE OverloadedRecordDot #-}
+
+-- GHC 9.6.3 syntax
+let x = record.field
+
+-- GHC 8.10.7 syntax removed in GHC 9.6.3
+let x = field (record :: Record)
+
+

It is still possible to specify type when using record update syntax, use this pragma to suppress compiler warning:

+
-- use this in GHC 9.6.3 when needed
+{-# OPTIONS_GHC -fno-warn-ambiguous-fields #-}
+
+let r' = (record :: Record) {field = value}
+
+
    +
  1. Most monad functions now have to be imported from Control.Monad, and not from specific monad modules (e.g. Control.Monad.Except).
  2. +
+
-- use this in GHC 9.6.3 when needed
+import Control.Monad
+
+

This PR has all the differences.

+

Improving compatibility between versions for remote desktop connection

+

UI already can handle failed JSON conversions of chats and chat items, and it helps both debugging and downgrading.

+

While we can increase versions for remote connections to make different versions incompatible, it degrades remote connection UX, as in many cases users can't upgrade mobile or desktop apps at the same time because of different release cycles.

+

It is especially problematic for Android app users, as they can only downgrade via Export/Import - older version can't be installed on top of newer version.

+

PR #6105 improved it by:

+
    +
  • adding CInfoInvalidJSON constructor, so that chats that cannot be parsed will show as "invalid chat" via remote connection (as when UI has field not present in API),
  • +
  • changing JSON parsing for CIContent, so that it falls back to CIInvalidJSON in platform-specific JSON parser.
  • +
+

To avoid "invalid" chats in the list we need to maintain forward compatibility on JSON encoding level of AChat type and subtypes:

+
    +
  • add new fields as optional to these types,
  • +
  • add omittedField method to FromJSON instances of types of new fields to provide a default value, where appropriate,
  • +
  • define primitive non-optional fields as newtype with omittedField in JSON instance.
  • +
+

To avoid fallback to invalid JSON in chat items we should do the same for ChatItem type and subtypes. It's especially important when adding fields to types used for all CIContent, as otherwise all items will be broken.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/directory.html b/docs/directory.html new file mode 100644 index 0000000000..3c14561742 --- /dev/null +++ b/docs/directory.html @@ -0,0 +1,889 @@ + + + + + + + + + SimpleX Directory + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

SimpleX Directory

+

You can use SimpleX Directory to discover the groups created and registered by other users.

+

Searching for groups

+

SimpleX Directory is available at simplex.chat/directory or via this onion link.

+

You can also connect to SimpleX Directory via this address and send the message containing the words you want to find in the group name or welcome message. You will receive up to 10 groups with the largest number of members in the response, together with the links to join these groups.

+

Please note that your search queries can be kept by the bot as the conversation history, but you can use incognito mode when connecting to the bot, to avoid correlation with any other communications. See Privacy policy for more details.

+

Adding groups to the directory

+

How to add a group

+

To add a group you must be its owner. Once you connect to the directory service and send /help, the service will guide you through the process.

+
    +
  1. Invite SimpleX Service Directory to the group as admin member. You can also set the role to admin after inviting the directory service.
  2. +
+

The directory service needs to be admin to provide a good user experience of joining the group, as it will create a new link to join the group, which is expected to be online 99% of the time.

+
    +
  1. +

    Add the link sent to you by the directory service to the group welcome message. This has to be done by the same group member who invited the directory service to the group. This member will be the owner of the group record in the directory service.

    +
  2. +
  3. +

    Once the link is added, the group will need to be approved by the directory service admins. This link is functional even before the group is approved, and you can continue using this link even if the group is not approved.

    +
  4. +
+

The group is usually approved within 24 hours. Please see below which groups can be added.

+

Once the group is approved, it will appear in search results.

+

You can list all the groups you submitted by sending /list to the directory service.

+

How to remove the group from the directory

+

Changing the group profile in any way (e.g., changing the group name, welcome message, or removing the link to join the group from the welcome message) will remove the group from the search results until the group is approved again by the directory service admins.

+

If it is undesirable that the service cannot be found in search during this time, please coordinate the time of this change with the directory service admins for quick approval.

+

Changing the role of the directory service will temporarily remove the group from the search results, and unless you changed the role to the owner, it will also permanently disrupt the members that were in the process of connecting to other members via the directory service.

+

To remove the group from the directory:

+
    +
  1. Remove the group link created by the directory service from the welcome message. This will not disrupt the members from joining the group, even via this link, but will remove the group from the search results.
  2. +
  3. After some time (we recommend 3-4 days) remove the directory service from the group - it will stop receiving the messages and the group will be permanently removed from the search results.
  4. +
+

Removing the group does not prevent you from registering the group again in the future.

+

Why limit which groups can be added

+

The reason to restrict the acceptable content is to have a better experience for a wider range of the users, and to comply with the content policies of app distribution channels (App Store, Play Store, etc.), once the directory service is available via the app without additional configuration. To achieve that, the content in the listed groups should be restricted to be generally appropriate.

+

Doesn't it go against the idea of decentralization and freedom of speech?

+

We believe it does not, because:

+
    +
  1. The service only restricts the content in the groups that you choose to register – we have no register of all existing groups, and no access to their content.
  2. +
  3. The service itself is open-source, and can be self-hosted, so anybody can run an alternative directory service with the different content policies, or without any policies at all.
  4. +
  5. Freedom of speech should respect legal rights and freedoms of others, so agreeing some boundaries seems necessary.
  6. +
+

Which groups can be added

+

The below is not the final policy, it is a work in progress.

+

Currently, the group registration is limited and manual, as we have limited resources to evaluate the content of the groups, so the initial content policy is quite restrictive - we believe it is better to be able to extend what is allowed, than to have to reduce it.

+

To be "listed in the directory" *, the group must have at least 10 members. Both the group and group owner profiles must include relevant, appropriate, non-offensive avatar images, that do not use the existing trademarks.

+

Please ONLY submit the groups on the following subjects:

+
    +
  • communications solutions and providers (messengers, social networks, Internet, etc.)
  • +
  • privacy and security
  • +
  • cryptocurrencies
  • +
  • product and software development
  • +
  • science and technology
  • +
  • media and entertainment: books, music, movies and games
  • +
  • politics, society, culture and education
  • +
+

The content in the group must be "appropriate" for the general audience, starting from 12 years old.

+

The content in the listed groups must:

+
    +
  • be legal for the jurisdiction you are in.
  • +
  • NOT contain spam and advertising.
  • +
  • NOT contain violence, calls for violence, calls for public demonstrations, or any other disturbing content.
  • +
  • NOT contain pornography, nudity, erotic or any sex-related content.
  • +
  • NOT contain racism, hate speech, or any other content that promotes discrimination.
  • +
  • NOT contain information about drugs, alcohol, or any other substances.
  • +
  • NOT contain NSFW content.
  • +
  • NOT be offensive – this needs to be clarified.
  • +
+

Group owners are expected to moderate the content in the groups, if members post inappropriate or excessive amount of content and group owners do not moderate it, the group is likely to be removed from the directory.

+

We reserve the right to not accept the group listing in the directory or cancel its listing, and there may be cases when we can't provide an explanation. We will certainly try to avoid it by communicating with the group owners first.

+

The combination of display name and full name has to be unique for the listed groups. If a group uses the name or logo of SimpleX, SimpleX network or SimpleX Chat it must be consistent with Permitted Uses or SimpleX trademark.

+

Once the group is listed in the directory, the bot will invite you to join the group of the group owners, where you can send any ideas or suggestions for how the groups functionality should evolve, and help steer both the product and the policies.

+

* "listed" means discoverable via search or any other directory service functions by any connected users other than the user who submitted the registration

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/glossary.html b/docs/glossary.html new file mode 100644 index 0000000000..52fa63b2c2 --- /dev/null +++ b/docs/glossary.html @@ -0,0 +1,1022 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Glossary

+

Choosing a private messenger requires the understanding of many technical terms, that many users, even quite technical, often misunderstand. This list is aiming to fill this knowledge gap. Please suggest any changes or additions.

+

While this glossary aims to be factual and objective, it is not completely unbiased. We designed SimpleX to be the most private, secure and resilient communication network, and some definitions reflect this view.

+

Address portability

+

Similarly to phone number portability (the ability of the customer to transfer the service to another provider without changing the number), the address portability means the ability of a communication service customer to change the service provider without changing the service address. Many federated networks support SRV records to provide address portability, but allowing service users to set up their own domains for the addresses is not as commonly supported by the available server and client software as for email.

+

Anonymous credentials

+

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

+

Digital credential on Wikipedia

+

Blockchain

+

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

+

In a more narrow sense, particularly in media, blockchain is used to refer specifically to distributed ledger, where each record also includes the hash of the previous record, but the blocks have to be agreed by the participating peers using some consensus protocol.

+

Wikipedia

+

Break-in recovery

+

Post-compromise security.

+

Centralized network

+

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

+

Content padding

+

Message padding.

+

Decentralized network

+

Decentralized network is often used to mean "the network based on decentralized blockchain". In its original meaning, decentralized network means that there is no central authority or any other point of centralization in the network, other than network protocols specification. The advantage of decentralized networks is that they are resilient to censorship and to the provider going out of business. The disadvantage is that they are often slower to innovate, and the security may be worse than with the centralized network.

+

The examples of decentralized networks are email, web, DNS, XMPP, Matrix, BitTorrent, etc. All these examples have a shared global application-level address space. Cryptocurrency blockchains not only have a shared address space, but also a shared state, so they are more centralized than email. Tor network also has a shared global address space, but also a central authority. SimpleX network does not have a shared application-level address space (it relies on the shared transport-level addresses - SMP relay hostnames or IP addresses), and it does not have any central authority or any shared state.

+

Defense in depth

+

Originally, it is a military strategy that seeks to delay rather than prevent the advance of an attacker, buying time and causing additional casualties by yielding space.

+

In information security, defense in depth represents the use of multiple computer security techniques to help mitigate the risk of one component of the defense being compromised or circumvented. An example could be anti-virus software installed on individual workstations when there is already virus protection on the firewalls and servers within the same environment.

+

SimpleX network applies defense in depth approach to security by having multiple layers for the communication security and privacy:

+
    +
  • double ratchet algorithm for end-to-end encryption with perfect forward secrecy and post-compromise security,
  • +
  • additional layer of end-to-end encryption for each messaging queue and another encryption layer of encryption from the server to the recipient inside TLS to prevent correlation by ciphertext,
  • +
  • TLS with only strong ciphers allowed,
  • +
  • mitigation of man-in-the-middle attack on client-server connection via server offline certificate verification,
  • +
  • mitigation of replay attacks via signing over transport channel binding,
  • +
  • multiple layers of message padding to reduce efficiency of traffic analysis,
  • +
  • mitigation of man-in-the-middle attack on client-client out-of-band channel when sending the invitation,
  • +
  • rotation of delivery queues to reduce efficiency of traffic analysis,
  • +
  • etc.
  • +
+

Wikipedia

+

Double ratchet algorithm

+

It is used by two parties to exchange end-to-end encrypted messages. The parties will use some key agreement protocol to agree on the initial shared secret key.

+

Double Ratchet algorithm provides perfect forward secrecy and post-compromise security. It is designed by Signal, and used in SimpleX Chat and many other secure messengers. Most experts consider it the state-of-the-art encryption protocol in message encryption.

+

End-to-end encryption

+

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

+

End-to-end encryption requires agreeing cryptographic keys between the sender and the recipient in a way that no eavesdroppers can access the agreed keys. See key agreement protocol. This key exchange can be compromised via man-in-the-middle attack, particularly if key exchange happens via the same communication provider and no out-of-band channel is used to verify key exchange.

+

Wikipedia

+

Federated network

+

Federated network is provided by several entities that agree upon the standards and operate the network collectively. This allows the users to choose their provider, that will hold their account, their messaging history and contacts, and communicate with other providers' servers on behalf of the user. The examples are email, XMPP, Matrix and Mastodon.

+

The advantage of that design is that there is no single organization that all users depend on, and the standards are more difficult to change, unless it benefits all users. There are several disadvantages: 1) the innovation is slower, 2) each user account still depends on a single organization, and in most cases can't move to another provider without changing their network address – there is no address portability, 3) the security and privacy are inevitably worse than with the centralized networks.

+

Federation on Wikipedia

+

Forward secrecy

+

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

+

Wikipedia

+

Key agreement protocol

+

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

+

Wikipedia

+

Key exchange

+

Key agreement protocol.

+

Man-in-the-middle attack

+

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

+

This attack can be used to compromise end-to-end encryption by intercepting public keys during key exchange, substituting them with the attacker's keys, and then intercepting and re-encrypting all messages, without altering their content. With this attack, while the attacker does not change message content, but she can read the messages, while the communicating parties believe the messages are end-to-end encrypted.

+

Such attack is possible with any system that uses the same channel for key exchange as used to send messages - it includes almost all communication systems except SimpleX, where the initial public key is always passed out-of-band. Even with SimpleX, the attacker may intercept and substitute the key sent via another channel, gaining access to communication. This risk is substantially lower, as attacker does not know in advance which channel will be used to pass the key.

+

To mitigate such attack the communicating parties must verify the integrity of key exchange - SimpleX and many other messaging apps, e.g. Signal and WhatsApp, have the feature that allows it.

+

Wikipedia.

+

Merkle directed acyclic graph

+

Also known as Merkle DAG, a data structure based on a general graph structure where node contains the cryptographic hashes of the previous nodes that point to it. Merkle trees are a subset of Merkle DAGs - in this case each leaf contains a cryptographic hash of the parent.

+

This structure by design allows to verify the integrity of the whole structure by computing its hashes and comparing with the hashes included in the nodes, in the same way as with blockchain.

+

The motivation to use DAG in distributed environments instead of a simpler linear blockchain is to allow concurrent additions, when there is no requirement for a single order of added items. Merkle DAG is used, for example, in IPFS and will be used in decentralized SimpleX groups.

+

Wikipedia.

+

Message padding

+

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

+

Wikipedia.

+

Onion routing

+

A technique for anonymous communication over a computer network that uses multiple layers of message encryption, analogous to the layers of an onion. The encrypted data is transmitted through a series of network nodes called "onion routers," each of which "peels" away a single layer, revealing the data's next destination. The sender remains anonymous because each intermediary knows only the location of the immediately preceding and following nodes.

+

The most widely used onion network is Tor.

+

Some elements of SimpleX network use similar ideas in their design - different addresses for the same resource used by different parties, and additional encryption layers. Currently though, SimpleX messaging protocol does not protect sender network address, as the relay server is chosen by the recipient. The delivery relays chosen by sender that are planned for the future would make SimpleX design closer to onion routing.

+

Wikipedia

+

Overlay network

+

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+

SimpleX Clients also form a network using SMP relays and IP or some other overlay network (e.g., Tor), to communicate with each other. SMP relays, on another hand, do not form a network.

+

Wikipedia

+

Non-repudiation

+

The property of the cryptographic or communication system that allows the recipient of the message to prove to any third party that the sender identified by some cryptographic key sent the message. It is the opposite to repudiation. While in some context non-repudiation may be desirable (e.g., for contractually binding messages), in the context of private communications it may be undesirable.

+

Wikipedia

+

Pairwise pseudonymous identifier

+

Generalizing the definition from NIST Digital Identity Guidelines, it is an opaque unguessable identifier generated by a service used to access a resource by only one party.

+

In the context of SimpleX network, these are the identifiers generated by SMP relays to access anonymous messaging queues, with a separate identifier (and access credential) for each accessing party: recipient, sender and and optional notifications subscriber. The same approach is used by XFTP relays to access file chunks, with separate identifiers (and access credentials) for sender and each recipient.

+

Peer-to-peer

+

Peer-to-peer (P2P) is the network architecture when participants have equal rights and communicate directly via a general purpose transport or overlay network. Unlike client-server architecture, all peers in a P2P network both provide and consume the resources. In the context of messaging, P2P architecture usually means that the messages are sent between peers, without user accounts or messages being stored on any servers. Examples are Tox, Briar, Cwtch and many others.

+

The advantage is that the participants do not depend on any servers. There are multiple downsides to that architecture, such as no asynchronous message delivery, the need for network-wide peer addresses, possibility of network-wide attacks, that are usually mitigated only by using a centralized authority. These disadvantages are avoided with proxied P2P architecture.

+

Wikipedia.

+

Perfect forward secrecy

+

Forward secrecy.

+

Post-compromise security

+

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

+

Post-quantum cryptography

+

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2023 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum cryptographic systems in combination with the traditional cryptographic systems.

+

Wikipedia

+

Privacy

+

Someone's right to keep (or the state when they keep) their personal matters and relationships secret (e.g., Cambridge dictionary). Privacy of communication systems should include the privacy of connections and meta-data, not only the privacy of the content of messages. End-to-end encryption on its own does not provide privacy, as it only protects message content and not connections or meta-data.

+

Wikipedia

+

Proxied peer-to-peer

+

Network topology of the communication system when peers communicate via proxies that do not form the network themselves. Such design is used in Pond, that has a fixed home server for each user, and in SimpleX, that uses multiple relays providing temporary connections.

+

Recovery from compromise

+

Post-compromise security.

+

Repudiation

+

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+

See also non-repudiation.

+

User identity

+

In a communication system it refers to anything that uniquely identifies the users to the network. Depending on the communication network, it can be a phone number, email address, username, public key or a random opaque identifier. Most messaging networks rely on some form of user identity. SimpleX appears to be the only messaging network that does not rely on any kind of user identity - see this comparison.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/app-settings.html b/docs/guide/app-settings.html new file mode 100644 index 0000000000..ba817b26b7 --- /dev/null +++ b/docs/guide/app-settings.html @@ -0,0 +1,1057 @@ + + + + + + + + + App settings + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

App settings

+

Opening the app settings

+

To open app settings:

+
    +
  • Open the app.
  • +
  • Tap on your user profile image in the upper left-hand of the screen.
  • +
  • If you have more than one profile, tap the current profile again or choose Settings.
  • +
+

Your profile settings

+

This section is labelled "You" in the app settings.

+

Your active profile

+

Tap on your avatar/name to update your current profile names and avatar.

+

Display name cannot have any spaces and it is recommended to use latin characters and numbers to make it easier to type these names to the users who use SimpleX Chat for the terminal (CLI).

+

Please note: When you save your profile, the update will be sent to all your contacts (excluding the contacts with whom your incognito profiles were shared). If you have a large number of contacts it can take several seconds.

+

Your chat profiles

+

This page allows adding and configuring your chat profiles. Please see Your chat profiles for more details.

+

Incognito

+

This feature is unique to SimpleX Chat – it is independent from chat profiles.

+

When "Incognito” is turned on, your current profile name and image are NOT shared with your new contacts. It allows connections with other people without any shared data – when you make new connections or join groups via a link a new random profile name will be generated for each contact or group.

+

Please read more in this post.

+

Your SimpleX contact address

+

  

+

This page allows you to create a long term address that can be used by other people to connect with you. Unlike 1-time invitation links, these addresses can be used many times, that makes them good to share online, e.g. on other social media platforms.

+

When people connect to you via this address, you will receive a connection request that you can accept or reject. You can configure an automatic acceptance of connection request and an automatic welcome message that will be sent to the new contacts.

+

If you start receiving too many requests via this address it is always safe to remove it – all the connections you created via this address will remain active, as this address is not used to deliver the messages.

+

See the comparison with 1-time invitation links.

+

Read more in this post.

+

Chat preferences

+

This page allows to configure the chat preferences that would apply to all contacts - they can be changed separately for each contact:

+
    +
  • disappearing messages - to allow disappearing messages in the conversations with you, only if your contacts allow them.
  • +
  • delete for everyone - to allow irreversible message deletion (by default messages are marked as deleted, not fully deleted). "Yes" setting would allow it only if they allow it for you, and "Always" - even if they don't allow.
  • +
  • voice messages - to allow sending voice messages.
  • +
+

To set chat preferences in each contact, tap contact name on top of the conversation and then choose "Contact preferences".

+

Group owners can set similar preferences for their groups, when the group is created or later: tap group name on top of the conversation and then choose "Group preferences".

+

Your app settings

+

This section is labelled "Settings" in the app settings.

+

Notifications

+

This page allows to configure the notifications mode: instant, periodic or only when the app is running. There are some differences in how these options work on iOS and Android. Please read more in this post about how notifications work.

+

You can also configure whether the message preview is shown when the message arrives.

+

Please note: For instant and periodic notifications to work on Android, you need to disable power optimization when prompted by the app, or later via the settings. Also, some variants of Android system require additional settings, for example MIU system on Xiaomi phones requires to enable "Auto start" for the app for the notification service to work. Please read Don't kill my app guide for any settings that may be required on your device.

+

Also, currently instant notifications have the highest battery consumption - we are working to reduce it to be less or the same as for periodic notifications.

+

Network & servers

+

This page allows to configure your own SMP relays and change other network settings.

+ +

SMP servers

+

     

+

By default, the app has preset relays configured – you can change them to your own.

+

This page also allows testing the connection with the servers.

+

Read more in this post.

+

Use SOCKS proxy (Android only)

+

This option makes the app connect via a SOCKS proxy that should be provided by some other app running on your device.

+

The most typical use for this is to run Orbot app that provides a SOCKS proxy to connect via Tor network, but it can be some other app and it can proxy connections via some other overlay network.

+

Use .onion hosts

+
Android
+

Use .onion hosts option is only available when Use SOCKS proxy is enabled. You can choose:

+
    +
  • no: never use .onion hosts. Choose this option if your SOCKS proxy does not connect via Tor network.
  • +
  • when available (default): when SOCKS proxy is enabled the app assumes that it provides connections via Tor network and use .onion host addresses when SMP relays include them in their configuration.
  • +
  • required: always use .onion hosts. Choose this option if your SOCKS proxy connects via Tor network and you want to avoid connections without Tor. In this case, if the SMP relay address does not include .onion host, the connection will fail.
  • +
+
iOS
+

 

+

While iOS does not support SOCKS proxies, you can install Orbot app that works as VPN provider. You can choose:

+
    +
  • no (default): do not use .onion hosts. Choose this option if you do not use Orbot or if you use VPN that proxies connections via some other overlay network.
  • +
  • when available: use .onion host addresses when SMP relays include them in their configuration. Orbot VPN must be enabled for this option to work.
  • +
  • required: always use .onion hosts. Choose this option if you use Orbot VPN and you want to avoid connections without Tor. In this case, if the SMP relay address does not include .onion host, the connection will fail. If you use this option, you can enable "Disable Orbot for non-onion traffic" option in Orbot settings making the rest of your device traffic to not use Tor.
  • +
+

Please note VPN on iOS can send some traffic to the usual network, if, for example, VPN app crashes. You can configure enable always-on VPN mode on managed iOS devices, but this is not applicable to most individual devices.

+

Transport isolation (BETA)

+

This option is only available if you have enabled developer tools.

+

Please read the details in this post.

+

Advanced network settings

+ +

If your network is slow, and connections to the servers keep failing (you would see a spinner on your contacts), please increase TCP and protocol timeouts in this page.

+

Privacy and security

+

SimpleX Lock

+

SimpleX Lock when enabled requires to pass the device authentication when you open the app or use some security- or privacy-sensitive features.

+

You will be offered to enable it after you open the app a few times.

+

To enable it later:

+
    +
  • Open the app settings.
  • +
  • Tap on "Privacy & security".
  • +
  • Toggle on "SimpleX Lock" slider.
  • +
  • Confirm your phone credentials.
  • +
+

Done! Now you will be required to authenticate when you start or resume the app after 30 seconds in background.

+

Protect app screen

+ +

This option hides the app screen in recent apps - it is enabled by default. On Android it also prevents screenshots.

+

Auto Accept Images

+

Auto-accepting images may reduce privacy – your contacts will know you are online.

+ + +

Enabling sending link previews may reduce privacy – your app will be loading link preview from the website.

+ + +

This option affects how the links to connect to other SimpleX users or to join groups are shown in the conversations. You can choose between:

+
    +
  • description (default): only the link description and server host name are shown. The link won't be opened in the browser.
  • +
  • full link: the full link is shown. The link will still not be opened in the browser.
  • +
  • via browser: the full link is shown, and it will be opened in the browser. In this case, if the link domain is different from simplex.chat, the link will be shown in red color, as it might be malicious.
  • +
+

Read more about SimpleX Links security.

+

Appearance

+

This page allows configuring:

+
    +
  • interface language
  • +
  • app icon
  • +
  • accent color
  • +
+

Database passphrase & export

+

This page allows to change the database passphrase, export and import the database and configure the message retention period.

+

Read more in Managing Your Data page.

+

Help & feedback

+

This section has information on how to use the app and the links to connect to the team. Please use Send questions and ideas to connect to us via the chat to ask any questions, make any suggestions and report any issues.

+

Support SimpleX Chat

+
    +
  • contribute - the link to the information about how to contribute and to donate to the project.
  • +
  • rate the app - rate and review it on the App Store or Play Store - your feedback helps a lot.
  • +
  • star on GitHub - that also helps us grow very much.
  • +
+

Thank you for your support!

+

Developer tools

+

This page has options that normally are only needed for app developers and can be used to debug the app in case something is not working.

+

Chat console

+

Here you can see and use console command with the chat core. None of this information is sent over the network, this is an internal communication between different parts of the app.

+

Please be careful - some of the commands can disrupt app functioning, only use them if you know what you are doing or were instructed by the team.

+

Please note: the log in console can contain what looks like errors. Unless you experience any issues in the app UI, these errors should not be considered as the app malfunction - they are likely to be normal and expected behavior.

+

Confirm database upgrades

+

This option is off by default - the app database is migrated to the new version without any confirmations. Starting from v4.6.2 these migrations are reversible - you can rollback to the previous version(s) of the app (not earlier than v4.6.1). If you want to be asked a confirmation every time database is upgraded you may enable this option - this is not recommended, as it happens almost on every app update, and should not cause any concerns.

+

Show developer options

+

This option currently enables Transport isolation mode option and also enables showing database IDs in contacts, groups and group members to simplify debugging via console commands.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/audio-video-calls.html b/docs/guide/audio-video-calls.html new file mode 100644 index 0000000000..73272bf6c0 --- /dev/null +++ b/docs/guide/audio-video-calls.html @@ -0,0 +1,982 @@ + + + + + + + + + Audio & video Calls + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Audio and Video Calls

+

SimpleX Chat allows you to make end-to-end encrypted audio and video calls with your contacts via WebRTC. Note: Group calls are not supported at this time.

+

Making and accepting the calls

+

How to make an audio call

+
    +
  1. Tap on a contact.
  2. +
  3. Tap on the phone icon to the right of your contact's name at the top of the screen.
  4. +
+

How to make a video call

+
    +
  1. Tap on a contact.
  2. +
  3. Tap on the three vertical dots on the top right-hand corner of the screen to access more options.
  4. +
  5. Choose Video call.
  6. +
+

Accepting the calls

+

When there is an incoming call you have three options:

+
    +
  • accept: to connect the call
  • +
  • reject: to reject the call, without notifying the caller.
  • +
  • ignore: to temporarily dismiss the call, but in a way that it can be accepted later, if the caller is still waiting, via the Accept call message in the conversation with this contact.
  • +
+

There is no time limit that the call invitation can remain active - as long as the caller is still waiting, you can accept the call any time later.

+

The call can be accepted from the lock screen, both on Android (it needs to be enabled via options) and on iOS (by default, using native iOS call interface that can be disabled).

+

Calls on lock screen on Android

+

SimpleX Chat shows an incoming call on your device's lock screen by default. However, you can change this behavior in the app settings menu.

+
    +
  1. Open the app settings menu.
  2. +
  3. Tap Audio and Video calls.
  4. +
  5. On the Calls on lock screen drop-down list, choose from the following three options: +
      +
    • Disable - the call will show as a notification.
    • +
    • Show - the call will show on the lock screen, you need to unlock the device and the app to accept it.
    • +
    • Accept - the call can be accepted and rejected directly from the lock screen, without opening the app.
    • +
    +
  6. +
+

Please note: some Android systems/devices prohibit full screen views on lock screen - in this case the call will show as a usual notification.

+

Calls on lock screen on iOS

+ +

By default, SimpleX Chat uses native iOS call interface, where allowed, to show incoming calls on the lock screen. You can disable it:

+
    +
  1. Open the app settings menu.
  2. +
  3. Tap Audio and Video calls.
  4. +
  5. Toggle the Use iOS call interface switch off.
  6. +
+

Please note: iOS call interface allows accepting the calls without unlocking the device and the app. If this is undesirable, please disable it – the calls will show as notifications in this case.

+

Read more in this post.

+

Advanced call settings

+

WebRTC ICE servers

+ +

SimpleX Chat uses a preset relay server to hide your IP address from your contacts by default, but it can also observe the duration of your calls. If you don't want that, you can configure and use your self-hosted WebRTC relay servers instead for further control of your calls.

+
    +
  1. Open the app settings menu.
  2. +
  3. Tap Audio and Video calls.
  4. +
  5. Tap WebRTC ICE servers.
  6. +
  7. Toggle the Configure ICE servers switch on.
  8. +
  9. Enter your ICE server addresses (one per line).
  10. +
  11. Tap Save.
  12. +
+

Please note: unlike messaging relays (SMP servers), the configuration of WebRTC ICE servers is stored on the current device, not in the chat database. if you transfer the chat database to another device you need to update this configuration.

+

Always use relay

+

Audio and video calls on SimpleX Chat are routed via a TURN relay server by default. Optionally you can disable this and use peer-to-peer (P2P) instead, when it is supported by your network. However, your IP address will be known to your contacts.

+
    +
  1. Open the app settings menu.
  2. +
  3. Tap Audio and Video calls.
  4. +
  5. Toggle the Always use relay switch on to use a relay server or off for P2P.
  6. +
+

Please note: disabling this option allows P2P calls, but it does not prohibit the use of TURN relays – in case your network providers block P2P connections, the call will still use relays if the are available. To prohibit the use of relays you need to change WebRTC ICE server configuration to only include STUN servers, for example:

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/chat-profiles.html b/docs/guide/chat-profiles.html new file mode 100644 index 0000000000..32a8fd059d --- /dev/null +++ b/docs/guide/chat-profiles.html @@ -0,0 +1,996 @@ + + + + + + + + + Chat profiles + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Your chat profiles

+

Creating additional chat profiles

+

SimpleX Chat allows creating as many chat profiles as you like. Same as the first profile, they are only stored locally on your device.

+ +

To create an additional SimpleX Chat profile:

+
    +
  • Open the app settings.
  • +
  • Select "Your chat profiles".
  • +
  • Unlock option via fingerprint or PIN.
  • +
  • Tap on "+ Add profile”.
  • +
  • Create a new profile by inputting your display name and full name (optional).
  • +
  • Tap on "Create".
  • +
+

Hiding and muting chat profiles

+

v4.6 added the ability to mute and to hide chat profiles.

+

     

+

These actions are available via long-press (Android) or swipe (iOS) on the profile in the list.

+

To unhide hidden profiles, enter the full password in the search bar.

+

Switching between profiles

+ +
    +
  • Tap on your user profile image in the upper right-hand of the screen.
  • +
  • Select which profile you want to use.
  • +
+

You can also switch profile via Your chat profiles in the settings.

+

Incognito mode

+

+

This feature is unique to SimpleX Chat – it is independent from chat profiles.

+

When "Incognito Mode” is turned on, your currently chosen profile name and image are hidden from your new contacts. It allows anonymous connections with other people without any shared data – when you make new connections or join groups via a link a new random profile name will be generated for each connection.

+

To toggle the incognito mode on/off:

+ +

Please read more in this post.

+

Edit your profile

+

To edit your profile:

+
    +
  • Open the app settings.
  • +
  • Select your profile.
  • +
  • Tap on "Edit".
  • +
  • Input your desired profile name and/or update your full name.
  • +
  • You can also set and change profile image.
  • +
  • Tap on "Save and notify contacts".
  • +
+

Move your chat profiles to another device

+

SimpleX Chat stores all user data only on client devices using a portable encrypted database format that can be exported and transferred to any supported device.

+

To export your SimpleX Chat data:

+
    +
  • Open the app settings.
  • +
  • Select "Database passphrase & export".
  • +
  • Stop chat by toggling "Chat is running" (tap "Stop” in the confirmation dialog).
  • +
  • Confirm it with fingerprint or PIN, in case you have SimpleX Lock enabled.
  • +
  • If you didn't set it before, set a passphrase in "Database passphrase". Initially, the database is encrypted with a random passphrase that is stored in KeyChain (iOS) or with KeyStore (Android).
  • +
  • Tap on "Export database" - it won't allow exporting unless you have set a passphrase.
  • +
  • Save the file on your device or share it via any available option.
  • +
+

To import your SimpleX Chat data in the app on another device:

+
    +
  • Transfer the database file to the new device.
  • +
  • Install SimpleX Chat app.
  • +
  • Create chat profile with any name by following the steps in Create your first chat profile – you will replace it soon.
  • +
  • Open the app settings
  • +
  • Select "Database passphrase & export".
  • +
  • Stop chat by tapping the switch on "Chat is running".
  • +
  • Tap "Import database".
  • +
  • Select the .zip file of the exported chat data.
  • +
  • Tap "Import” in the confirmation dialog.
  • +
  • Start chat via toggle or close and start the app – you will be prompted to enter the passphrase for your chat database.
  • +
+

Please note:

+
    +
  1. +

    Currently you cannot move some of the profiles, only the whole database containing all profiles can be moved.

    +
  2. +
  3. +

    You must NOT use the exported database on more than one device at a time, as it may disrupt some of the connections. You also must always use the latest version of the chat database - using the old one is also likely to disrupt your connections.

    +
  4. +
  5. +

    There is no way to recover lost passphrase - make sure to store it securely.

    +
  6. +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/making-connections.html b/docs/guide/making-connections.html new file mode 100644 index 0000000000..4df0fc8fe8 --- /dev/null +++ b/docs/guide/making-connections.html @@ -0,0 +1,980 @@ + + + + + + + + + Making connections + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Connect to somebody in the chat

+

Work in progress

+

Because you have no identifier on the SimpleX platform, nobody can contact you unless you share a one-time or temporary user address, such as a QR code or a link.

+

Even with the optional user address, while it can be used to send spam contact requests, you can change or completely delete it without losing any of your connections.

+

Private Connection — connect using an invitation link or QR code via video or in-person.

+

Group Chat — Users have the option to create a secret group, share their contact link [which can be deleted later on], or generate a one-time invitation link.

+

Your SimpleX contact address

+

You can create an optional long term address for other people to connect with you. Unlike 1-time invitation links, these addresses can be used many times, that makes them good to share online, e.g. on social media platforms, or in email signatures. That helps more people discover SimpleX Chat, so please do it!

+

When people connect to you via this address, you will receive a connection request that you can accept or reject. You can configure an automatic acceptance of connection request and an automatic welcome message that will be sent to the new contacts. You can also share this address as part of your SimpleX profile, so group members can connect to you, and your contacts can share it with others - if this is something that you want.

+

If you start receiving too many requests via this address it is always safe to remove it – all the connections you created via this address will remain active, as this address is not used to deliver the messages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1-time invitation linkSimpleX contact address
Can be used many times?NoYes
Can be included in user profile?No, as it can only be used once.Yes, to allow group members to connect directly, and your contacts to pass it on to their contacts.
When to use it?With somebody you know, via another communication channel or QR code (in person or during a video call)Where many people can see and connect via it, e.g. in email signature, website, social media or group chat.
SecurityMore secure, as can only be used once, and the initial connection request (including profile) is encrypted with double ratchet.Initial connection request is also e2e encrypted, but without double ratchet (it is initialized when request is accepted).
IdentificationBoth sides know who they connect to, as they know with whom and by who the link was shared. You can attach alias to this invitation as soon as you share it or use it, to identify the other person when connection is established.Only the person using the address knows who they connect to, via the channel where they found the address (email, social media, etc.). The address owner can only see the user profile of the request, and has no proof of identity from the person sending the request*.
Advantages over other platformsThere is no direct analogy, other platforms don’t offer one-time invitations without any fixed part identifying the user.Unlike addresses in other platforms, SimpleX addresses are not used to deliver the messages — only the initial connection requests.
It means that removing this address will not break the contacts made via it (like changing an email address would), it would only prevent new connections, which makes it a good solution against spam and abuse.
Vulnerability to attacksUntil the connection is established, anybody who intercepts this link can connect to it, so it has to be verified with the original contact that the connection succeeded.These addresses are vulnerable to connection request spam. Unlike other platforms, you can delete or change the address, without losing any contacts (see above).
Passive attacks on connection linksBoth types of links are not vulnerable if simply observed — they only contain public keys. So they can be safely shared via insecure or public channels, as long as you can confirm that you connected to the intended person.
Active attacks on connection linksIf the link is substituted via the attack on the channel used to share it, the connection security can be compromised, and the original messages monitored (man-in-the-middle attack). If it is a real risk then security code should be verified to mitigate it - doing so proves** that the link and keys were not substituted, and that the end-to-end encryption is secure.
+

* Adding optional verified identities that we plan in the future will change it — the address owner will have an option to request identity verification before accepting the connection.

+

** Connection security code is the cryptographic hash (SHA256) of combined public keys of both sides — there are 2256 possible security codes (1 with 77 zeros – about 1000 times smaller than the estimated number of atoms in the visible universe).

+

Conversation preferences

+

Tap on one of your conversations to open conversation preferences.
+Here you can choose whether you wish to allow disappearing messages, deleting messages for everyone and voice messages.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/managing-data.html b/docs/guide/managing-data.html new file mode 100644 index 0000000000..61cc538b83 --- /dev/null +++ b/docs/guide/managing-data.html @@ -0,0 +1,938 @@ + + + + + + + + + Managing data + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Managing Your Data

+

Automatic message deletion

+

Here you can choose to delete messages from your local chat database after a set period of time.

+

Please note: This option does not delete messages for other users, only for you. This option is set independently for each chat profile.

+

Chat Database

+

To open your chat database settings:

+ +

Database passphrase

+ +

By default, database passphrase is random, you have to set it manually to be able to export it.

+

App data backup

+

Here you can allow the system to back up app data, wherever it is configured. A database passphrase must be set to use this.

+

Export database

+

Here you can export the chat database to a file.

+

Import database

+

Here you can import the chat database from a file.

+

Delete database

+

Here you can delete your chat database. WARNING: Results in a loss of all your SimpleX Chat data! Unless you have just exported the chat database.

+

Delete files and media

+ +

You can delete all sent and received files and media stored in the app via this option, without deleting the messages.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/privacy-security.html b/docs/guide/privacy-security.html new file mode 100644 index 0000000000..f26556ea17 --- /dev/null +++ b/docs/guide/privacy-security.html @@ -0,0 +1,851 @@ + + + + + + + + + Privacy & security + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Privacy and Security

+

SimpleX Chat default configuration aims to balance privacy, security and convenience. You may want to change the default options.

+

This page lists all the features and options that affect privacy and security.

+

Privacy and Security settings

+

These settings are available in the Privacy & Security settings.

+

Security code verification

+ +

While SimpleX Chat always establishes connection via link passed via an independent channel, so it is already more protected than other apps, there are scenarios when the invitation links can be substituted in transit (MITM attack). To protect against such attacks, you should verify the security code with your contacts:

+
    +
  • open the conversation with the contact
  • +
  • tap the contact name on top of the conversation
  • +
  • tap "Verify security code"
  • +
  • ask your contact to do the same
  • +
  • the connection is secure if you and your contact have the same security code
  • +
+

This can be validated by one of the following:

+
    +
  • one of you can scan the security code from their device, if the codes match the contact will be marked as verified on the device that scanned the code.
  • +
  • simply tap mark verified if you trust the confirmation from your contact that the code is verified.
  • +
  • you can also read the contact over the voice call.
  • +
+

Read more in this post

+

Database passphrase

+

When installed, the app generates a random passphrase for the chat database and stores it securely in KeyChain (iOS) or using KeyStore (Android, TPM module is used when available). You can set your own passphrase and also remove it from the device, in which case you will need to enter it every time you start the app, and notifications may be limited, in the Database passphrase & export settings.

+

Incognito mode

+

This feature generates a random profile name for each new contact. Read more in Incognito mode.

+

Hidden profiles

+

This feature allows to hide some of your chat profiles with the password. Read more in Hiding and muting chat profiles.

+

Network settings

+

Transport isolation (BETA) allows to isolate you traffic with each contact in a different TCP connection (and Tor circuit).

+

Using Tor

+

 

+

To connect to SMP relays (messaging servers) via Tor you need to install Orbot app.

+

Android: use Orbot app as SOCKS proxy on port 9050 (default) and enable Use SOCKS proxy.

+

iOS: use Orbot app as VPN provider and enable VPN.

+

You can also change which server addresses are used with Use .onion hosts option.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/readme.html b/docs/guide/readme.html new file mode 100644 index 0000000000..c1368073e6 --- /dev/null +++ b/docs/guide/readme.html @@ -0,0 +1,973 @@ + + + + + + + + + Quick start + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

SimpleX Chat User Guide

+

The first messaging platform that has no user identifiers of any kind — 100% private by design.

+

Contents

+ +

Quick start

+

Create your first chat profile

+

After downloading SimpleX Chat via the links at https://simplex.chat:

+
    +
  • Open the app.
  • +
  • Create a new profile by inputting your display name and full name (optional).
  • +
  • Tap on "Create".
  • +
+

This profile is local to the device, it is not stored anywhere else

+

Choose notifications mode

+

After you have created the chat profile the app will ask you to choose notifications mode.

+ +

Please read their description, as on iOS it is trade-off between convenience and privacy, with instant notifications sharing more meta-data with the servers, and on Android it is a trade-off between notification delays and battery life.

+

You can read more about the differences between notifications work on Android and iOS.

+

Connect to developers

+

When you just start using the app, you can tap "chat with the developers" to ask any questions or just to test the app - feel free to send any test messages.

+

This button will disappear once you make the first connection. To connect to the developers later:

+ +

Join some user groups

+

There are links to join several user groups on our GitHub page - join them to ask any questions and discuss ideas.

+

You can also find some other user-managed groups via online search.

+

To join a group via a link:

+
    +
  • Get a link to a SimpleX user group, which you can get from your existing SimpleX conversations or by finding it online.
  • +
  • Tap on a button in the lower right-hand of the screen.
  • +
  • Tap on "Connect via link / QR code" button.
  • +
+

Connect to friends

+
    +
  • Tell your friends to download SimpleX Chat app via one of the links here: https://simplex.chat
  • +
  • Create a one-time link for each of you friends by tapping new chat button (Android: a floating pencil button in the bottom right corner, iOS: a pencil button in the top right corner)
  • +
  • Tap Create one-time invitation link.
  • +
  • Share each link with a different friend, or alternatively let them scan a QR code.
  • +
  • You can optionally assign a different alias to each link, to know when they connect who is who, if they use incognito mode, for example.
  • +
  • To use your link or QR code, tell your friends to tap new chat button and then tap on "Connect via link / QR code".
  • +
  • They can either scan QR code or paste the link. If they opened the link in the browser, they need to tap "Open in mobile app" button on the page.
  • +
+

Watch the video on the website that shows how it works.

+

You can also create a long-term contact address.

+

Explore the app

+

Most app settings are shared for all profiles, but some settings are specific to chat profile.

+

Read more in App settings page.

+

Many conversation actions are available via long-press or swipe – try them!

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/secret-groups.html b/docs/guide/secret-groups.html new file mode 100644 index 0000000000..aa55197431 --- /dev/null +++ b/docs/guide/secret-groups.html @@ -0,0 +1,964 @@ + + + + + + + + + Secret groups + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Secret groups

+

Secret groups are anonymous and private, they are designed to be hard to track by outsiders. Every message and file gets sent separately to every member in the group, which makes secret groups only fit for smaller groups.

+

Creating a group

+

+
    +
  • Tap on a button in the lower right-hand of the screen.
  • +
  • Tap on "Create secret group".
  • +
  • Enter group display name.
  • +
  • Tap on "Create".
  • +
+

Group preferences

+

Here you can choose whether you want to allow disappearing messages, direct messages, deleting for everyone and voice messages.

+

Adding members

+
    +
  • Open a group.
  • +
  • Tap on + button in the upper right-hand of the screen.
  • +
  • Select contacts you wish to invite.
  • +
  • Tap on "Invite to group".
  • +
+

Joining a group

+ +

When you receive the invitation to join the group you can accept it both from the conversation with your contact and from the list of conversations.

+

Leaving a group

+ +

Tap and hold (Android) or swipe (iOS) the group in the list of the conversations to leave the group.

+

You can also leave the group from the group page:

+
    +
  • Open a group conversation.
  • +
  • Tap group name on top.
  • +
  • Scroll to the bottom and tap "Leave group".
  • +
+

Member permissions

+

Open a group and tap on group's name to view members list, there you can tap on a member and change their role.

+
    +
  • Observer: can only read messages (and delete or mark deleted the messages they sent before their role was changed).
  • +
  • Member: can send messages and delete own messages.
  • +
  • Admin: Same as member, but can delete the messages of others and remove members from the group.
  • +
  • Owner: Same as admin, but can change group preferences.
  • +
+ +

  

+

If you are a group owner or admin, you can create a link that can be used by anyone to join the group, making a group more public.

+
    +
  • Open a group conversation.
  • +
  • Tap group name.
  • +
  • Tap on "Create group link.
  • +
+

Once the link is created, you can also change the role assigned to members when they join.

+

Welcome message

+

If you are a group owner you can create a welcome message that will be shown to all new members joining group.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/guide/send-messages.html b/docs/guide/send-messages.html new file mode 100644 index 0000000000..3d526d121f --- /dev/null +++ b/docs/guide/send-messages.html @@ -0,0 +1,982 @@ + + + + + + + + + Sending messages + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Sending, editing and deleting messages

+

Sending text messages on SimpleX Chat is pretty straightforward, tap on your contact and then tap on text area, type in your message and tap on "Send" button.

+

You need to open a conversation to send messages.

+

Sending messages

+

Sending text messages

+

You can send, edit and quote messages in a conversation.

+

To send, simply type in the message in the entry box and tap "Send".

+

To edit or quote a message, tap and hold the message and choose the action.

+

Sending images and files

+
    +
  • Tap 📎 (paperclip) button on the left of the message entry box.
  • +
  • Choose between "Use Camera", "From Gallery" and "Choose file".
  • +
  • Once you have chosen what you wish to send, tap on "Send" button.
  • +
+

On iOS you can also paste images from the clipboard.

+

Sending voice messages

+ +
    +
  • Tap 🎤 (microphone) button on the right of the message entry box.
  • +
  • Allow SimpleX Chat to record the voice if prompted. You will have to tap on the microphone button once again if this happens.
  • +
  • Speak, once you've finished the recording, tap on the square stop icon on the right.
  • +
  • You may listen to the recording before sending it, and re-record if necessary.
  • +
  • Tap on "Send" button to send the recorded voice message.
  • +
+

You can also tap and hold the microphone button to record a voice message. In this case the recording will stop once you release the button. You still need to tap "Send" to send the message.

+

Please note: if the microphone button is gray, that means voice messages are disabled in this conversation. Ask your contact or group owner to enable them (they are enabled by default).

+

How to use disappearing messages

+

  

+
    +
  • Tap on name of the conversation.
  • +
  • Toggle the slider next to "Disappearing messages".
  • +
  • Choose how long until messages are deleted after being sent in "Delete after".
  • +
+

Please note: Your contact must also enable disappearing messages. In a group, only group owner can enable disappearing messages.

+

Sending "live" messages

+ +

You can use "live" messages for your recipients to see the messages as you type them, without having to tap "Send" button until it's completed. It can be useful in these scenarios:

+
    +
  1. Real-time conversation, like talking in person or in a discussion club. You can retract what you wrote, but your recipients would see it. Also people don’t need to guess what you’re typing. This allows to avoid interrupting the flow of conversation and still send longer messages.
  2. +
  3. An activist doing live reporting when there is a risk to lose the phone or connection at any moment. This feature allows to send as much as possible, up to the last word, without having to send only very short messages.
  4. +
+

To send a "live" message:

+
    +
  • Tap ⚡️ (lightning) button on the right of the message entry box.
  • +
  • When you do it first time, you would see and alert explaining the feature. Tap "OK", and tap it again.
  • +
  • Now you can start typing the messages, the app will be periodically sending the updates to your recipients, as you type (every few seconds, and only complete words).
  • +
+

Sending stickers and animated messages

+

  

+

While there are no stickers and GIFs in the app itself, you can send them using third-party (such as GIPHY on iOS) or native (Android 13+) keyboards.

+

Message drafts

+

  

+

Messages are kept in the chat until they are sent, even if you leave the chat.

+

For privacy and simplicity, we decided to allow only one message draft and keep it only until the app is stopped.

+

Read more in this post.

+

Deleting messages

+

  

+

To delete a message, tap and hold the message and choose "Delete".

+

If you sent this message yourself within the last 24 hours, you will be offered two options:

+
    +
  • delete for everyone - this will either mark the message as deleted for you and the recipient(s) (this is the default) or fully delete the message on your and recipients' devices (if you have enabled "Delete for everyone" in the conversation preferences)
  • +
  • delete for me - this will delete the message only locally.
  • +
+

Please read about reasons for not allowing full deletion by default. TL;DR: data sovereignty.

+

Moderating messages in the groups

+

Group admins can delete member messages that are inappropriate for the groups.

+

To remove a message of another member, tap and hold the message and choose "Moderate".

+

Please read about group moderation.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/images/simplex-desktop-dark-1.png b/docs/images/simplex-desktop-dark-1.png new file mode 100644 index 0000000000..c0b441f623 Binary files /dev/null and b/docs/images/simplex-desktop-dark-1.png differ diff --git a/docs/images/simplex-desktop-dark-2.png b/docs/images/simplex-desktop-dark-2.png new file mode 100644 index 0000000000..2a9d9b8fe2 Binary files /dev/null and b/docs/images/simplex-desktop-dark-2.png differ diff --git a/docs/images/simplex-desktop-light.png b/docs/images/simplex-desktop-light.png new file mode 100644 index 0000000000..d28b7b88ca Binary files /dev/null and b/docs/images/simplex-desktop-light.png differ diff --git a/docs/images/weblate_1.png b/docs/images/weblate_1.png new file mode 100644 index 0000000000..a8b2c60c3e Binary files /dev/null and b/docs/images/weblate_1.png differ diff --git a/docs/images/weblate_2.png b/docs/images/weblate_2.png new file mode 100644 index 0000000000..f73f3de649 Binary files /dev/null and b/docs/images/weblate_2.png differ diff --git a/docs/lang/cs/android.html b/docs/lang/cs/android.html new file mode 100644 index 0000000000..e0ab6d1601 --- /dev/null +++ b/docs/lang/cs/android.html @@ -0,0 +1,1060 @@ + + + + + + + + + Přístup k souborům v aplikaci Android + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 07.02.2023 | Jazyky: CZ, EN, PL |

+

Přístup k souborům v aplikaci Android

+

SimpleX používá databáze a ukládá své předvolby do soukromého datového adresáře v systému Android. Adresář obsahuje:

+
    +
  • Databáze
  • +
  • odeslané a přijaté soubory
  • +
  • dočasné soubory, které budou smazány, když nebudou potřeba
  • +
  • uživatelské předvolby.
  • +
+

Pokud chcete zobrazit, co je uloženo v datovém adresáři SimpleX, musíte mít:

+
    +
  • Unixový operační systém (nebo MinGW na Windows).
  • +
  • Nástroj ADB (Android Debug Bridge) nainstalovaný v počítači (stáhněte si jej zde a nainstalujte).
  • +
  • zařízení připojené přes USB nebo Wi-Fi k počítači.
  • +
+

Postup:

+
    +
  • Otevřete SimpleX, přejděte na Databáze passphrase & export, povolte Zálohování dat aplikace. Tím se zprovozní další kroky
  • +
  • Volitelné: pokud chcete zobrazit obsah databáze, změňte přístupovou frázi databáze z náhodné na svou. Chcete-li to provést, zastavte chat na obrazovce Database passphrase & export, otevřete Database passphrase, zadejte novou passphrase a potvrďte ji, poté ji aktualizujte. Nezapomeňte ji, jinak přijdete o všechna svá data v případě, že bude passphrase později znovu požadována.
  • +
  • otevřete emulátor terminálu (Windows CMD/Powershell nebude fungovat) a změňte adresář na ten, který chcete použít pro uložení zálohy:
  • +
+
cd /tmp # jen příklad
+
+

Poté spusťte následující příkaz:

+
adb -d backup -f chat.ab -noapk chat.simplex.app && 
+tail -n +5 chat.ab > chat.dat && 
+printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - chat.dat > chat.gz && 
+tar -xvzf chat.gz
+
+

Nyní odemkněte zařízení a potvrďte operaci zálohování bez použití hesla pro šifrování, jinak příkazy nebudou fungovat.

+

Poté by mělo být zálohování ukončeno. Pokud se zobrazí chybové hlášení tar: Error is not recoverable: exiting now, ale předtím jste vypsali názvy některých souborů, nebojte se, je to v pořádku.

+

Nyní budou zálohované soubory uvnitř ./apps/chat.simplex.app/.

+

Upozorňujeme, že pokud používáte moderní verzi SimpleX, budou databáze zašifrované a jejich obsah nebudete moci zobrazit bez použití aplikace sqlcipher a bez znalosti dešifrovací fráze (musíte ji nejprve změnit na svou z náhodně vygenerovaných v aplikaci).

+

Dešifrování databází

+

Chcete-li zobrazit data v databázi, musíte je nejprve dešifrovat. Nainstalujte sqlcipher pomocí svého oblíbeného správce balíčků a v adresáři s databázemi spusťte následující příkazy:

+
sqlcipher files_chat.db
+pragma key="youDecryptionPassphrase";
+# Ujistěte se, že vše funguje správně
+select * from users;
+
+

Pokud se zobrazí Parse error: no such table: users, ujistěte se, že jste zadali správnou přístupovou frázi a že jste ji v aplikaci pro Android změnili z náhodné (pokud jste tuto databázi získali ze zařízení s Androidem, samozřejmě).

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/cli.html b/docs/lang/cs/cli.html new file mode 100644 index 0000000000..bdc61784e9 --- /dev/null +++ b/docs/lang/cs/cli.html @@ -0,0 +1,1177 @@ + + + + + + + + + SimpleX Chat terminálová + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 31.01.2023 | Jazyky: CZ, EN, FR, PL |

+

SimpleX Chat terminálová (konzolová) aplikace pro Linux/MacOS/Windows

+

Obsah

+ +

Funkce chatu v terminálu

+
    +
  • Chat 1:1 s více lidmi v jednom okně terminálu.
  • +
  • Skupinové zasílání zpráv.
  • +
  • Posílání souborů kontaktům a skupinám.
  • +
  • Kontaktní adresy uživatelů - navázání spojení prostřednictvím odkazů na více kontaktů.
  • +
  • Zprávy uchovávané v místní databázi SQLite.
  • +
  • Automaticky vyplňované jméno příjemce - po navázání spojení stačí napsat zprávu a odpovědět odesílateli.
  • +
  • K dispozici ukázkové servery SMP, které jsou v aplikaci předkonfigurovány - nebo si můžete nasadit vlastní server.
  • +
  • Žádná globální identita ani žádná jména nejsou pro server(y) viditelná, což zajišťuje plné soukromí vašich kontaktů a konverzací.
  • +
  • Dvě vrstvy šifrování E2E (double-ratchet pro duplexní spojení s použitím dohody klíčů X3DH s efemérními klíči Curve448 a NaCl crypto_box pro fronty SMP s použitím klíčů Curve25519) a předávání klíčů příjemců mimo pásmo (viz Jak používat chat SimpleX).
  • +
  • Ověřování integrity zpráv (pomocí zahrnutí digestů předchozích zpráv).
  • +
  • Ověřování každého příkazu/zprávy servery SMP pomocí automaticky generovaných klíčů Ed448.
  • +
  • Transportní šifrování TLS 1.3.
  • +
  • Dodatečné šifrování zpráv od serveru SMP k příjemci za účelem snížení korelace provozu.
  • +
+

Veřejné klíče zapojené do výměny klíčů se nepoužívají jako identita, jsou náhodně generovány pro každý kontakt.

+

Technické podrobnosti viz Použité šifrovací primitivy.

+

+

🚀 Instalace

+

Stáhněte si klienta chatu

+

Linux a MacOS

+

Chcete-li nainstalovat nebo aktualizovat simplex-chat, měli byste spustit instalační skript. K tomu použijte následující příkaz cURL nebo Wget:

+
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+
wget -qO- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+

Jakmile se chatovací klient stáhne, můžete jej spustit pomocí příkazu simplex-chat v terminálu.

+

Případně můžete binární soubor chatu pro váš systém stáhnout ručně z latest stable release a spustit jej podle následujícího návodu.

+
chmod +x <binary>
+mv <binary> ~/.local/bin/simplex-chat
+
+

(nebo v jakémkoli jiném preferovaném umístění v PATH).

+

V systému MacOS musíte také povolit spuštění nástroje Gatekeeper.

+

Windows

+
move <binary> %APPDATA%/local/bin/simplex-chat.exe
+
+

Sestavení ze zdrojových kódů

+
+

Upozornění: pro sestavení aplikace použijte zdrojový kód ze stabilní větve.

+
+

Použití nástroje Docker

+

V systému Linux můžete spustitelný soubor chatu sestavit pomocí docker build with custom output:

+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+DOCKER_BUILDKIT=1 docker build --output ~/.local/bin .
+
+
+

Upozornění: Pokud narazíte na chybu verze `GLIBC_2.28' nenalezena, obnovte jej pomocí základního obrazu haskell:8.10.7-stretch (změňte jej ve svém lokálním Dockerfile).

+
+

V libovolném operačním systému

+
    +
  1. Nainstalujte Haskell GHCup, GHC 8.10.7 a cabal:
  2. +
+
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
+
+
    +
  1. Sestavte projekt:
  2. +
+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+# v Linuxu
+apt-get update && apt-get install -y build-essential libgmp3-dev zlib1g-dev
+cp scripts/cabal.project.local.linux cabal.project.local
+# nebo na MacOS:
+# brew install openssl@3.0
+# cp scripts/cabal.project.local.mac cabal.project.local
+# možná budete muset změnit cabal.project.local tak, aby ukazoval na skutečné umístění openssl
+cabal update
+cabal install
+
+

Použití

+

Spuštění klienta chatu

+

Chcete-li spustit klienta chatu, spusťte z terminálu příkaz simplex-chat.

+

Ve výchozím nastavení je datový adresář aplikace vytvořen v domovském adresáři (~/.simplex nebo %APPDATA%/simplex ve Windows) a jsou v něm inicializovány dva databázové soubory SQLite simplex_v1_chat.db a simplex_v1_agent.db.

+

Chcete-li zadat jiný prefix cesty k souborům databáze, použijte volbu příkazového řádku -d:

+
$ simplex-chat -d alice
+
+

Spuštění výše uvedeného příkladu vytvoří databázové soubory alice_v1_chat.db a alice_v1_agent.db v aktuálním adresáři.

+

Na serveru Linode jsou umístěny tři výchozí servery SMP - jsou předkonfigurovány v aplikaci.

+

Pokud jste nasadili vlastní SMP server(y), můžete klienta nakonfigurovat pomocí volby -s:

+
$ simplex-chat -s smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@smp.example.com
+
+

Řetězec zakódovaný v Base64url před adresou serveru je offline otisk certifikátu serveru, který je ověřován klientem během TLS handshake.

+

S lidmi můžete stále hovořit pomocí výchozího nebo jakéhokoli jiného serveru - ovlivňuje to pouze umístění fronty zpráv při navazování spojení (a fronta odpovědí může být na jiném serveru, jak nastaví klient druhé strany).

+

Spusťte simplex-chat -h a zobrazte všechny dostupné možnosti.

+

Přístup k serverům pro zasílání zpráv přes Tor

+

Nainstalujte Tor a spusťte jej jako proxy server SOCKS5 na portu 9050, např. na Macu můžete:

+
brew install tor
+brew services start tor
+
+

Pro přístup k serverům přes Tor použijte volbu -x:

+
simplex-chat -x
+
+

Můžete také použít volbu --socks-proxy=ipv4:port nebo --socks-proxy=:port pro konfiguraci hostitele a portu vašeho SOCKS5 proxy serveru, např. pokud jej provozujete na jiném hostiteli nebo portu.

+

Jak používat SimpleX chat

+

Po spuštění chatu budete vyzváni k zadání svého "zobrazovacího jména" a volitelného "celého jména" pro vytvoření místního profilu chatu. Vaše zobrazované jméno je přezdívka, pod kterou se na vás mohou obracet vaše kontakty - není jedinečné a neslouží jako globální identita. Pokud si některé vaše kontakty zvolily stejné zobrazovací jméno, přidá chatovací klient k jejich místnímu zobrazovacímu jménu číselnou příponu.

+

Následující schéma ukazuje, jak se připojit ke kontaktu a poslat mu zprávu:

+
+ +
+

Po nastavení místního profilu zadejte /c (pro /connect) pro vytvoření nového spojení a vygenerování pozvánky. Tuto pozvánku odešlete svému kontaktu prostřednictvím jakéhokoli jiného kanálu.

+

Můžete vytvořit více pozvánek zadáním /connect vícekrát a odesláním těchto pozvánek příslušným kontaktům, se kterými se chcete spojit.

+

Pozvánku lze použít pouze jednou, a i kdyby byla zachycena, útočník by ji nemohl použít k odeslání zpráv prostřednictvím této fronty, jakmile váš kontakt potvrdí, že spojení bylo navázáno. Vysvětlení formátu pozvánky naleznete v protokolu agenta.

+

Kontakt, který obdržel pozvánku, by měl zadat /c <pozvánka>, aby spojení přijal. Tím se spojení naváže a obě strany jsou o tom informovány.

+

Poté by měly použít příkazy @<jméno> <zpráva> k odesílání zpráv. Můžete také prostě začít psát zprávu a odeslat ji kontaktu, který byl poslední.

+

Seznam dostupných příkazů zobrazíte pomocí /help v chatu.

+

Skupiny

+

Skupinu vytvoříte příkazem /g <group> a kontakty do ní přidáte příkazem /a <group> <name>. Do skupiny pak můžete posílat zprávy zadáním #<skupina> <zpráva>. Pro další příkazy použijte /help groups.

+

simplex-chat

+
+

Upozornění: skupiny nejsou uloženy na žádném serveru, jsou vedeny jako seznam členů v databázi aplikace, kterým budou zprávy zasílány.

+
+

Odesílání souborů

+

Soubor můžete odeslat kontaktu pomocí /f @<contact> <soubor_cesta> - příjemce jej bude muset před odesláním přijmout. Pro další příkazy použijte /help files.

+

simplex-chat

+

Soubory můžete posílat skupině pomocí /f #<skupina> <soubor_cesta>.

+

Kontaktní adresy uživatelů

+

Jako alternativu k jednorázovým pozvánkovým odkazům můžete vytvořit dlouhodobou adresu pomocí /ad (pro /adresa). Vytvořenou adresu pak můžete sdílet libovolným kanálem a používat ji ostatními uživateli jako odkaz na žádost o kontakt pomocí /c <uživatelská_kontaktní_adresa>.

+

Příchozí žádosti můžete přijmout nebo odmítnout pomocí příkazů /ac <jméno> a /rc <jméno>.

+

Uživatelská adresa je "dlouhodobá" v tom smyslu, že se jedná o odkaz pro vícenásobné použití - lze ji používat, dokud ji uživatel nesmaže, v takovém případě by všechna navázaná spojení zůstala stále aktivní (na rozdíl od toho, jak to funguje u e-mailu, kdy změna adresy vede k tomu, že vám lidé nemohou posílat zprávy).

+

Pro ostatní příkazy použijte /help address.

+

simplex-chat

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/contributing.html b/docs/lang/cs/contributing.html new file mode 100644 index 0000000000..8a6e1629f7 --- /dev/null +++ b/docs/lang/cs/contributing.html @@ -0,0 +1,1031 @@ + + + + + + + + + Průvodce přispíváním + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 31.01.2023 | Jazyky: CZ, EN, FR, PL |

+

Průvodce přispíváním

+

Kompilace s povoleným šifrováním SQLCipher

+

Do kořenového adresáře projektu přidejte cabal.project.local s umístěním hlaviček a knihoven OpenSSL a příznakem nastavujícím režim šifrování:

+
cp scripts/cabal.project.local.mac cabal.project.local
+# nebo
+# cp scripts/cabal.project.local.linux cabal.project.local
+
+

OpenSSL na MacOS

+

Systém MacOS je standardně dodáván s LibreSSL, pro kompilaci SimpleX ze zdrojových kódů je nutné nainstalovat OpenSSL.

+

OpenSSL lze nainstalovat pomocí brew install openssl@3.0.

+

Aby vše fungovalo správně, musíte do své cesty PATH přidat /opt/homebrew/opt/openssl@3.0/bin.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/server.html b/docs/lang/cs/server.html new file mode 100644 index 0000000000..6b8b7bcfa6 --- /dev/null +++ b/docs/lang/cs/server.html @@ -0,0 +1,1316 @@ + + + + + + + + + Hostování vlastního serveru SMP + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + +
+
+ V angličtině je novější verze této stránky. Klikněte pro zobrazení +
+
+ + +
+
+ + + +
+
+

| Aktualizováno 05.06.2023 | Jazyky: CZ, EN, FR, PL |

+

Hostování vlastního serveru SMP

+

Přehled

+

SMP server je relay server používaný k předávání zpráv v síti SimpleX. Aplikace SimpleX Chat mají přednastavené servery (pro mobilní aplikace jsou to smp11, smp12 a smp14.simplex.im), ale konfiguraci aplikace můžete snadno změnit a používat jiné servery.

+

Klienti SimpleX pouze určují, který server bude použit pro příjem zpráv, a to pro každý kontakt (nebo spojení skupiny s členem skupiny) zvlášť, přičemž tyto servery jsou pouze dočasné, protože adresa pro doručování se může změnit.

+

Upozornění: když změníte servery v konfiguraci aplikace, ovlivní to pouze to, který server bude použit pro nové kontakty, stávající kontakty se na nové servery automaticky nepřesunou, ale můžete je přesunout ručně pomocí tlačítka "Změnit adresu příjmu" na stránkách s informacemi o kontaktech/členech - brzy bude automatizováno.

+

Instalace

+
    +
  1. +

    Nejprve nainstalujte smp-server:

    + +
  2. +
+

Ruční instalace vyžaduje několik předběžných úkonů:

+
    +
  1. +

    Vytvoření uživatele a skupiny pro smp-server:

    +
    sudo useradd -m smp
    +
    +
  2. +
  3. +

    Vytvořte potřebné adresáře a přiřaďte jim oprávnění:

    +
    sudo mkdir -p /var/opt/simplex /etc/opt/simplex
    +sudo chown smp:smp /var/opt/simplex /etc/opt/simplex /etc/opt/simplex
    +
    +
  4. +
  5. +

    Povolte port smp-server ve firewallu:

    +
    # Pro Ubuntu
    +sudo ufw allow 5233/tcp
    +# Pro Fedora
    +sudo firewall-cmd --permanent --add-port=5223/tcp && \
    +sudo firewall-cmd --reload
    +
    +
  6. +
  7. +

    Volitelné - Pokud používáte distribuci s systemd, vytvořte soubor /etc/systemd/system/smp-server.service s následujícím obsahem:

    +
    [Unit]
    +Description=SMP server
    +[Service]
    +User=smp
    +Group=smp
    +Type=simple
    +ExecStart=smp-server start
    +ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
    +KillSignal=SIGINT
    +TimeoutStopSec=infinity
    +Restart=vždy
    +RestartSec=10
    +LimitNOFILE=65535
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    A spusťte sudo systemctl daemon-reload.

    +
  8. +
+

Konfigurace

+

Chcete-li zjistit, které možnosti jsou k dispozici, spusťte smp-server bez příznaků:

+
sudo su smp -c smp-server
+
+...
+Dostupné příkazy:
+  init Inicializace serveru - vytvoří /etc/opt/simplex a
+                           /var/opt/simplex adresáře a konfigurační soubory.
+  start Spustí server (konfigurace:
+                           /etc/opt/simplex/smp-server.ini).
+  delete Odstranění konfiguračních a protokolových souborů
+
+

Další nápovědu můžete získat příkazem sudo su smp -c "smp-server <příkaz> -h"

+

Poté musíme nakonfigurovat smp-server:

+

Interaktivně

+

Spusťte následující příkaz:

+
sudo su smp -c "smp-server init"
+
+

Je třeba zvážit několik možností:

+
    +
  • +

    Povolit ukládání protokolu pro obnovení front a zpráv při restartu serveru (Yn):

    +

    Zadáním y povolíte ukládání a obnovu spojení a zpráv při restartu serveru.

    +

    Pozor: je důležité použít SIGINT pro restart serveru, protože jinak nebudou nedoručené zprávy obnoveny. Spojení budou obnovena bez ohledu na to, jakým způsobem je server restartován, protože na rozdíl od zpráv jsou při každé změně přidávána do protokolu pouze pro doplnění.

    +
  • +
  • +

    Zapnout protokolování denních statistik (yN):

    +

    Zadáním y povolíte protokolování statistik ve formátu CSV, které lze například použít k zobrazení souhrnných grafů využití v Grafanu.

    +
  • +
+

Tyto statistiky zahrnují denní počty vytvořených, zajištěných a smazaných front, odeslaných a přijatých zpráv a také denní, týdenní a měsíční počty aktivních front (tj. front, které byly použity pro nějaké zprávy). Domníváme se, že tyto informace neobsahují nic, co by umožňovalo korelovat různé fronty jako patřící stejným uživatelům, ale pokud se domníváte, že to lze nějak zneužít, dejte nám prosím důvěrně vědět.

+
    +
  • +

    Vyžadovat heslo pro vytvoření nové fronty zpráv?

    +

    Zadejte r nebo své libovolné heslo pro ochranu heslem smp-server nebo n pro vypnutí ochrany heslem.

    +
  • +
  • +

    Zadejte FQDN serveru nebo IP adresu pro certifikát (127.0.0.1):

    +

    Zadejte svou doménu nebo ip adresu, na které běží váš smp-server - bude zahrnuta do certifikátů serveru a také vypsána jako součást adresy serveru.

    +
  • +
+

Prostřednictvím voleb příkazového řádku

+

Spusťte následující příkaz:

+
sudo su smp -c "smp-server init -h"
+
+...
+Dostupné možnosti:
+  -l,--store-log Povolit protokol úložiště pro perzistenci
+  -s,--daily-stats Povolí protokolování denních statistik serveru
+  -a,--sign-algorithm ALG Algoritmus podpisu používaný pro certifikáty TLS:
+                           ED25519, ED448 (výchozí: ED448).
+  --ip IP IP adresa serveru, používaná jako Common Name pro TLS online
+                           certifikátu, pokud není zadáno FQDN
+                           (výchozí: "127.0.0.1")
+  -n,--fqdn FQDN FQDN serveru použitý jako Common Name pro certifikát TLS online
+                           certifikát
+  --no-password Povolit vytváření nových front bez hesla
+  --password PASSWORD Nastavení hesla pro vytváření nových front zpráv
+  -y,--yes Neinteraktivní inicializace pomocí příkazového řádku
+                           volby
+  -h,--help Zobrazí text nápovědy
+
+

Měli byste určit, které příznaky jsou pro váš případ použití potřebné, a poté spustit smp-server init s příznakem -y pro neinteraktivní inicializaci:

+
sudo su smp -c "smp-server init -y -<vůj příznak> <vaše volba>"
+
+

Spusťte například:

+
sudo su smp -c "smp-server init -y -l --ip 192.168.1.5 --heslo test"
+
+

a inicializujte konfiguraci smp-serveru pomocí:

+
    +
  • obnovení spojení a zpráv při restartu serveru (příznak -l),
  • +
  • IP adresa 192.168.1.5,
  • +
  • chránit smp-server heslem test.
  • +
+
+

Poté je instalace dokončena a ve výstupu teminálu byste měli vidět něco takového:

+
Certificate request self-signature ok
+subject=CN = 127.0.0.1
+Server je inicializován, konfiguraci můžete upravit v souboru /etc/opt/simplex/smp-server.ini.
+Spusťte `smp-server start` pro spuštění serveru.
+----------
+Měli byste bezpečně uložit soukromý klíč CA a odstranit jej ze serveru.
+Pokud dojde ke kompromitaci pověření TLS serveru, lze tento klíč použít k podpisu nového, přičemž zůstane zachována stejná identita serveru a navázaná spojení.
+Umístění soukromého klíče CA: /etc/opt/simplex/ca.key.
+----------
+SMP server v3.4.0
+Otisk prstu: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Adresa serveru: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+
+

Výše uvedená adresa serveru by měla být použita v konfiguraci klienta a pokud jste přidali heslo k serveru, mělo by být sdíleno s ostatními lidmi pouze tehdy, když jim chcete povolit používat váš server pro příjem zpráv (všechny vaše kontakty budou moci posílat zprávy, protože nevyžadují heslo). Pokud jste při inicializaci předali IP adresu nebo názvy hostitelů, budou vypsány jako součást adresy serveru, jinak nahraďte <hostnames> skutečnými adresami serverů.

+

Dokumentace

+

Všechny potřebné soubory pro smp-server jsou umístěny ve složce /etc/opt/simplex/.

+

Uložené zprávy, spojení, statistiky a protokol serveru jsou umístěny ve složce /var/opt/simplex/.

+

Adresa serveru SMP

+

Adresa serveru SMP má následující formát:

+
smp://<otisk prstu>[:<heslo>]@<jméno_veřejného_hostitele>[,<jméno_hostitele>]
+
+
    +
  • +

    <otisk prstu>

    +

    Váš otisk certifikátu smp-server. Otisk svého certifikátu můžete zkontrolovat v souboru /etc/opt/simplex/fingerprint.

    +
  • +
  • +

    nepovinné <heslo>

    +

    Vaše nakonfigurované heslo smp-serveru. Nakonfigurované heslo můžete zkontrolovat v souboru /etc/opt/simplex/smp-server.ini v sekci [AUTH] v poli create_password:.

    +
  • +
  • +

    <public_hostname>, volitelně <onion_hostname>.

    +

    Vaše nakonfigurované jméno (jména) hostitele smp-serveru. Nakonfigurované hostitele můžete zkontrolovat v souboru /etc/opt/simplex/smp-server.ini, v části [TRANSPORT] v poli host:.

    +
  • +
+

Příkazy Systemd

+

Chcete-li spustit smp-server při startu hostitele, spusťte:

+
sudo systemctl enable smp-server.service
+
+Vytvořen symlink /etc/systemd/system/multi-user.target.wants/smp-server.service → /etc/systemd/system/smp-server.service.
+
+

Chcete-li spustit smp-server, spusťte:

+
sudo systemctl start smp-server.service
+
+

Chcete-li zkontrolovat stav smp-serveru, spusťte:

+
sudo systemctl status smp-server.service
+
+● smp-server.service - server SMP
+     Načteno: načteno (/etc/systemd/system/smp-server.service; povoleno; předvolba dodavatele: povoleno)
+     Aktivní: aktivní (běží) od so 2022-11-23 19:23:21 UTC; před 1min 48s
+   Hlavní PID: 30878 (smp-server)
+     CGroup: /docker/5588ab759e80546b4296a7c50ffebbb1fb7b55b8401300e9201313b720989aa8/system.slice/smp-server.service
+             └─30878 smp-server start
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Spuštěn SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Adresa serveru: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Uložit protokol: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Naslouchání na portu 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: neaktivní klienti nevypršeli.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: vytváření nových front vyžaduje heslo
+
+

Chcete-li zastavit smp-server, spusťte:

+
sudo systemctl stop smp-server.service
+
+

Chcete-li zkontrolovat ocas protokolu smp-server, spusťte:

+
sudo journalctl -fu smp-server.service
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Spuštěn SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Adresa serveru: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Uložit protokol: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Naslouchání na portu 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: neaktivní klienti nevypršeli.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: vytváření nových front vyžaduje heslo
+
+

Monitoring

+

Statistiky smp-serveru pro Grafana dashboard můžete povolit nastavením hodnoty on v souboru /etc/opt/simplex/smp-server.ini v sekci [STORE_LOG] v poli log_stats:.

+

Protokoly budou uloženy jako soubor csv v souboru /var/opt/simplex/smp-server-stats.daily.log. Pole pro soubor csv jsou:

+
fromTime,qCreated,qSecured,qDeleted,msgSent,msgRecv,dayMsgQueues,weekMsgQueues,monthMsgQueues
+
+
    +
  • +

    fromTime - časová značka; datum a čas události

    +
  • +
  • +

    qCreated - int; vytvořené fronty

    +
  • +
  • +

    qSecured - int; vytvořené fronty

    +
  • +
  • +

    qDeleted - int; smazané fronty

    +
  • +
  • +

    msgSent - int; odeslané zprávy

    +
  • +
  • +

    msgRecv - int; přijaté zprávy

    +
  • +
  • +

    dayMsgQueues - int; aktivní fronty za den

    +
  • +
  • +

    weekMsgQueues - int; aktivní fronty za týden

    +
  • +
  • +

    monthMsgQueues - int; aktivní fronty za měsíc

    +
  • +
+

Pro import csv do Grafana je třeba:

+
    +
  1. +

    Nainstalovat zásuvný modul Grafana: Grafana - CSV datasource

    +
  2. +
  3. +

    Povolit místní režim připojením následujícího:

    +
    [plugin.marcusolsson-csv-datasource].
    +allow_local_mode = true
    +
    +

    ... do /etc/grafana/grafana.ini

    +
  4. +
  5. +

    Přidejte zdroj dat CSV:

    +
      +
    • V postranní nabídce klikněte na záložku Configuration (ikona ozubeného kola).
    • +
    • V pravém horním rohu karty Zdroje dat klikněte na tlačítko Přidat zdroj dat.
    • +
    • Do vyhledávacího pole zadejte "CSV" a vyhledejte zdroj dat CSV.
    • +
    • Klikněte na výsledek hledání s nápisem "CSV".
    • +
    • Do pole URL zadejte soubor, který odkazuje na obsah CSV
    • +
    +
  6. +
  7. +

    Hotovo! Měli byste být schopni vytvořit vlastní řídicí panel se statistikami.

    +
  8. +
+

Další dokumentaci naleznete na adrese: CSV Data Source for Grafana - Documentation

+

Konfigurace aplikace pro použití serveru

+

Chcete-li aplikaci nakonfigurovat tak, aby používala váš server pro zasílání zpráv, zkopírujte jeho úplnou adresu včetně hesla a přidejte ji do aplikace. Máte možnost používat svůj server společně s přednastavenými servery nebo bez nich - můžete je odebrat nebo zakázat.

+

Adresu svého serveru můžete také sdílet se svými přáteli tak, že je necháte naskenovat QR kód z nastavení serveru - ten bude obsahovat heslo serveru, takže budou moci přijímat zprávy i prostřednictvím vašeho serveru.

+

Upozornění: pro podporu hesla je třeba mít SMP server verze 4.0. Pokud již máte nasazený server, můžete heslo přidat přidáním do souboru INI serveru.

+

     

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/simplex.html b/docs/lang/cs/simplex.html new file mode 100644 index 0000000000..f060eca99e --- /dev/null +++ b/docs/lang/cs/simplex.html @@ -0,0 +1,1130 @@ + + + + + + + + + Platforma SimpleX + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 07.02.2023 | Jazyky: CZ, EN, FR, PL |

+

Platforma SimpleX - motivace a srovnání

+

Problémy

+

Stávající chatovací platformy a protokoly mají některé nebo všechny následující problémy:

+
    +
  • Nedostatek soukromí uživatelského profilu a kontaktů (soukromí metadat).
  • +
  • Žádná ochrana (nebo pouze volitelná ochrana) implementací E2EE před útoky MITM prostřednictvím poskytovatele.
  • +
  • Nevyžádané zprávy (spam a zneužití).
  • +
  • Chybějící vlastnictví a ochrana dat.
  • +
  • Složitost použití všech necentralizovaných protokolů pro netechnické uživatele.
  • +
+

Koncentrace komunikace v malém počtu centralizovaných platforem činí řešení těchto problémů poměrně obtížným.

+ +

Navrhovaný zásobník protokolů řeší tyto problémy tím, že zprávy i kontakty jsou uloženy pouze v klientských zařízeních, čímž se role serverů omezuje na pouhé zprostředkovatele zpráv, kteří vyžadují pouze autorizaci zpráv odesílaných do front, ale NEvyžadují autentizaci uživatelů - chráněny jsou nejen zprávy, ale i metadata, protože uživatelé nemají přiřazeny žádné identifikátory - na rozdíl od jiných platforem.

+

Více informací o cílech a technickém návrhu platformy naleznete v dokumentu SimpleX whitepaper.

+

Proč používat SimpleX

+

Jedinečný přístup SimpleX k ochraně soukromí a zabezpečení

+

Každý by měl dbát na soukromí a bezpečnost své komunikace - i obyčejné konverzace vás mohou ohrozit.

+

Úplné soukromí vaší identity, profilu, kontaktů a metadat.

+

Na rozdíl od všech ostatních existujících platforem pro zasílání zpráv nemá SimpleX žádné identifikátory přiřazené uživatelům - k identifikaci svých uživatelů nepoužívá telefonní čísla (jako Signal nebo WhatsApp), adresy založené na doméně (jako e-mail, XMPP nebo Matrix), uživatelská jména (jako Telegram), veřejné klíče nebo dokonce náhodná čísla (jako všechny ostatní messengery) - ani nevíme, kolik lidí SimpleX používá.

+

K doručování zpráv místo identifikátorů uživatelů, které používají všechny ostatní platformy, používá SimpleX adresy jednosměrných (simplexních) front zpráv. Používání služby SimpleX je jako mít pro každý kontakt jinou e-mailovou adresu nebo telefonní číslo, ale bez starostí se správou všech těchto adres. V blízké budoucnosti budou aplikace SimpleX také automaticky měnit fronty zpráv a přesouvat konverzace z jednoho serveru na druhý, aby uživatelům poskytly ještě lepší soukromí.

+

Tento přístup chrání soukromí toho, s kým komunikujete, a skrývá ho před servery platformy SimpleX a před jakýmikoli pozorovateli. Své soukromí můžete dále zlepšit nastavením přístupu k síti tak, abyste se k serverům SimpleX připojovali prostřednictvím některé překryvné transportní sítě, např. sítě Tor.

+

Nejlepší ochrana proti spamu a zneužití

+

Protože na platformě SimpleX nemáte žádný identifikátor, nelze vás kontaktovat, pokud nesdílíte odkaz s jednorázovou pozvánkou nebo volitelnou dočasnou uživatelskou adresu. I v případě volitelných uživatelských adres je sice lze využít k zasílání nevyžádaných kontaktů, ale můžete je změnit nebo zcela odstranit, aniž byste přišli o jakékoli spojení.

+

Úplné vlastnictví, kontrola a zabezpečení vašich údajů

+

SimpleX ukládá všechna uživatelská data v klientských zařízeních, zprávy jsou pouze dočasně uchovávány na relay serverech SimpleX, dokud nejsou přijaty.

+

Používáme přenosný formát databáze, který lze použít na všech podporovaných zařízeních - brzy přidáme možnost exportovat databázi chatu z mobilní aplikace, aby ji bylo možné použít na jiném zařízení.

+

Na rozdíl od serverů federativních sítí (e-mail, XMPP nebo Matrix) servery SimpleX neukládají uživatelské účty, pouze předávají zprávy příjemcům, čímž chrání soukromí obou stran. Mezi odesílaným a přijímaným provozem serveru nejsou žádné společné identifikátory ani šifrované zprávy, a to díky dodatečné vrstvě šifrování doručovaných zpráv. Pokud tedy kdokoli sleduje provoz serveru, nemůže snadno zjistit, kdo s kým komunikuje (známé útoky na korelaci provozu viz SimpleX whitepaper).

+

Uživatelé vlastní síť SimpleX

+

Můžete používat SimpleX s vlastními servery a přitom komunikovat s lidmi, kteří používají servery předkonfigurované v aplikacích nebo jakékoli jiné servery SimpleX.

+

Platforma SimpleX používá otevřený protokol a poskytuje SDK pro vytváření chatovacích botů, což umožňuje implementaci služeb, s nimiž mohou uživatelé komunikovat prostřednictvím aplikací SimpleX Chat - opravdu se těšíme, jaké služby SimpleX bude možné vytvořit.

+

Pokud uvažujete o vývoji s platformou SimpleX, ať už jde o služby chatovacích botů pro uživatele aplikací SimpleX, nebo o integraci knihovny SimpleX Chat do vašich mobilních aplikací, obraťte se na nás pro případné rady a podporu.

+

Srovnání s jinými protokoly

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SimpleX chatSignal, big platformsXMPP, MatrixP2P protocols
Vyžaduje uživatelské identifikátoryNe = privateAno1Ano2Yes3
Možnost MITM útokuŽádná = bezpečnéAno4AnoAno
Závislost na DNSNe = neumlčitelnéAnoAnoNe
Single operator or networkNe = decentralizovanéAnoNeAno5
Centrální součást nebo jiný celosíťový útokNe = neumlčitelnéAnoAno2Ano6
+
    +
  1. Obvykle na základě telefonního čísla, v některých případech na základě uživatelských jmen.
  2. +
  3. Založeno na DNS.
  4. +
  5. Veřejný klíč nebo jiné globálně jedinečné ID.
  6. +
  7. Pokud jsou servery provozovatele kompromitovány.
  8. +
  9. Sítě P2P a sítě založené na kryptoměnách jsou sice distribuované, ale nejsou decentralizované - fungují jako jediná síť s jediným jmenným prostorem uživatelských adres.
  10. +
  11. Sítě P2P mají buď centrální autoritu, nebo může být kompromitována celá síť - viz následující část.
  12. +
+

Srovnání s protokoly pro zasílání zpráv P2P.

+

Existuje několik protokolů P2P pro chatování/zprávy a jejich implementací, jejichž cílem je vyřešit problém soukromí a centralizace, ale mají svůj vlastní soubor problémů, kvůli kterým jsou méně spolehlivé než navrhovaný návrh, složitější na implementaci a analýzu a zranitelnější vůči útokům.

+
    +
  1. +

    Sítě P2P používají k směrování zpráv/požadavků v síti některou variantu DHT. Implementace DHT mají složité návrhy, které musí vyvažovat spolehlivost, záruku doručení a latenci. Navrhovaný návrh má lepší záruky doručení i nižší latenci (zpráva je předávána vícekrát paralelně, pokaždé přes jeden uzel, přičemž se používají servery vybrané příjemcem, zatímco v sítích P2P je zpráva předávána přes O(log N) uzlů postupně, přičemž se používají uzly vybrané algoritmem).

    +
  2. +
  3. +

    Navrhovaný návrh na rozdíl od většiny sítí P2P nemá žádné globální identifikátory uživatelů, a to ani dočasné.

    +
  4. +
  5. +

    P2P samo o sobě neřeší problém útoku MITM a většina existujících řešení nepoužívá pro počáteční výměnu klíčů zprávy mimo pásmo. Navrhované řešení využívá pro počáteční výměnu klíčů zprávy mimo pásmo nebo v některých případech již existující bezpečná a důvěryhodná spojení.

    +
  6. +
  7. +

    Implementace P2P mohou být blokovány některými poskytovateli internetu (jako například BitTorrent). Navrhovaný návrh je transportně agnostický - může fungovat přes standardní webové protokoly a servery mohou být nasazeny na stejných doménách jako webové stránky.

    +
  8. +
  9. +

    Všechny známé sítě P2P jsou pravděpodobně zranitelné vůči Sybilovu útoku, protože každý uzel je zjistitelný a síť funguje jako celek. Známá opatření ke snížení pravděpodobnosti Sybilova útoku buď vyžadují centralizovanou složku, nebo nákladný proof of work. Navrhovaný návrh naopak nemá žádnou zjistitelnost serverů - servery nejsou propojeny, nejsou známy navzájem ani všem klientům. Síť SimpleX je fragmentovaná a funguje jako několik izolovaných spojení. To znemožňuje útoky na celou síť SimpleX - i když jsou některé servery kompromitovány, ostatní části sítě mohou fungovat normálně a postižení klienti mohou přejít na používání jiných serverů, aniž by ztratili kontakty nebo zprávy.

    +
  10. +
  11. +

    Sítě P2P jsou pravděpodobně zranitelné vůči útoku DRDoS. V navrhovaném návrhu klienti pouze předávají provoz ze známého důvěryhodného spojení a nelze je použít k odrážení a zesilování provozu v celé síti.

    +
  12. +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/translations.html b/docs/lang/cs/translations.html new file mode 100644 index 0000000000..c2f73ecd60 --- /dev/null +++ b/docs/lang/cs/translations.html @@ -0,0 +1,1083 @@ + + + + + + + + + Přispívání překladů do SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 07.02.2023 | Jazyky: CZ, EN, PL |

+

Přispívání překladů do SimpleX Chat

+

Obrovské díky za váš zájem o překlady SimpleX Chat - velmi nám to pomáhá zpřístupnit jej širšímu okruhu uživatelů a vaší pomoci si opravdu vážíme.

+

Vyžaduje to značnou časovou investici - většina lidí ji zpočátku podceňuje - a průběžnou údržbu v průběhu vývoje aplikace.

+

Tento dokument vznikl proto, abychom tento proces urychlili, a podělili se s vámi o některé důležité "háčky", které jsme objevili při práci s Weblate - platformou, kterou používáme pro překlady rozhraní.

+

Než začnete překládat

+
    +
  1. +

    Vytvořte si účet na Weblate a použijte stejný e-mail, který používáte na GitHubu - díky tomu budou vaše příspěvky spojeny s vaším účtem na GitHubu a v některých případech vám to může pomoci. Jakmile bude překlad uvolněn pro uživatele, přidáme jméno vašeho účtu do seznamu překladatelů.

    +
  2. +
  3. +

    Před zahájením překladu je třeba podepsat jednoduchou smlouvu s přispěvatelem prostřednictvím Weblate - to proto, aby se předešlo případným konfliktům kolem práv duševního vlastnictví.

    +
  4. +
  5. +

    Můžeme vás také přidat do skupiny překladatelů pro případné dotazy a aktualizace - spojte se se mnou přes chat.

    +
  6. +
+

Průběh překladu

+
    +
  1. +

    Začněte prosím od aplikace pro Android, a to jak při časově nejnáročnějším počátečním překladu, tak při pozdějším přidávání případných řetězců. Za prvé, řetězce pro iOS se mohou ve Weblate objevit s určitým zpožděním, protože to od nás vyžaduje ruční krok, než se zobrazí. Zadruhé, aplikace Android je nastavena jako slovník pro aplikaci iOS a 2/3 všech řetězců vyžadují jen kliknutí pro jejich převod z Androidu do iOS (to ještě nějakou dobu trvá, Weblate to bohužel neautomatizuje).

    +
  2. +
  3. +

    Některé řetězce není třeba překládat, ale přesto je třeba je překopírovat - v uživatelském rozhraní Weblate je k tomu tlačítko:

    +
  4. +
+weblate: zkopírovat zdroj do překladu +
    +
  1. +

    Weblate má také automatické návrhy, které mohou proces urychlit. Někdy je lze použít tak, jak jsou, jindy je třeba je upravit - kliknutím je použijete v překladu.

    +
  2. +
  3. +

    Jakmile jsou všechny řetězce v aplikaci pro Android přeloženy, zkontrolujte je, abyste zajistili konzistentní styl a jazyk, aby se pro podobné uživatelské akce důsledně používala stejná slova jako v angličtině. Někdy budete muset použít různá slova v případech, kdy angličtina má jen jedno, snažte se prosím tyto volby používat důsledně v podobných kontextech, aby to bylo pro koncové uživatele jednodušší.

    +
  4. +
  5. +

    Při překladu aplikace pro iOS je velká část řetězců naprosto stejná - lze je jedním kliknutím překopírovat do sekce glosář. Vizuální nápovědou, že to lze provést, je to, že celý zdrojový řetězec je zvýrazněn žlutě. Mnoho dalších řetězců je velmi podobných, liší se pouze syntaxí interpolace nebo způsobem použití tučného písma - vyžadují minimální úpravy. Existují některé řetězce, které jsou jedinečné pro platformu iOS - ty je třeba přeložit zvlášť.

    +
  6. +
+weblate: automatické návrhy +

Po dokončení překladu

+

Jakmile budou aplikace pro Android i iOS přeloženy, dejte nám prosím vědět.

+

My pak:

+
    +
  • zkontrolujeme všechny překlady a navrhneme případné opravy - to také zabere trochu času :)
  • +
  • sloučíme je do zdrojového kódu - během toho bude weblate uzamčen pro změny.
  • +
  • vytvoříme beta verze aplikací pro iOS i Android - můžeme vás také přidat do interních skupin testerů, abyste mohli aplikace instalovat dříve než ostatní.
  • +
  • Vydáme ji pro naše uživatele beta verzí - jedná se o více než tisíc lidí, kteří používají naše beta verze.
  • +
  • Vydání aplikace a uvedení nového jazyka v oznámení.
  • +
+

Upozornění: pokud je to možné, snažíme se zachovat konzistentní funkce aplikace mezi platformami Android a iOS, takže nový jazyk vydáme a oznámíme, až budou obě platformy přeloženy. Neznamená to, že to musíte udělat vy, ale budeme muset počkat, až druhou platformu přeloží někdo jiný. Pokud ale začnete od Androidu, přidání iOS obvykle trvá 3-4x kratší dobu.

+

Co bude dál

+
    +
  1. +

    Jakmile budeme aplikaci aktualizovat, zveřejníme aktualizace ve skupině překladatelů. Nemáte absolutně žádnou povinnost tyto dodatečné řetězce překládat. Nesmírně si však vážíme toho, pokud tak učiníte, protože uživatelé mají mnohem lepší zážitek, když jsou závislí na vašich překladech, než když nějaká nová část aplikace přeložena není.

    +
  2. +
  3. +

    Adopci ve vaší zemi / jazykové skupině můžete pomoci také překládáním našich dokumentů - právě jsme s tím začali - a také obsahu našich webových stránek. Objevilo se mnoho žádostí o to a v současné době přidáváme překladový rámec pro webové stránky.

    +
  4. +
  5. +

    Také pokud chcete být moderátorem/adminem skupiny uživatelů ve vašem jazyce, jakmile bude aplikace přeložena, můžeme takovou skupinu hostit - připravujeme komunitní směrnice a přidáváme do aplikace některé moderátorské nástroje, které budou vydány v březnu ve verzi v5.

    +
  6. +
+

Ještě jednou děkujeme, že nám pomáháte rozvíjet SimpleX Chat!

+

Evgeny, zakladatel SimpleX Chat.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/cs/webrtc.html b/docs/lang/cs/webrtc.html new file mode 100644 index 0000000000..4fb0fcff1a --- /dev/null +++ b/docs/lang/cs/webrtc.html @@ -0,0 +1,1162 @@ + + + + + + + + + Použití vlastních serverů WebRTC ICE v SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Aktualizováno 31.01.2023 | Jazyky: CZ, EN, FR, PL |

+

Použití vlastních serverů WebRTC ICE v SimpleX Chat

+

Nasazení serveru STUN/TURN

+

V tomto průvodci budeme používat nejvybavenější a nejosvědčenější implementaci serveru STUN/TURN - coturn a Ubuntu 20.04 LTS distribuci Linuxu.

+
    +
  1. +

    Získejte certifikáty stun.$Vaše_doména a turn.$Vaše_doména.

    +

    Používáme Let's Encrypt.

    +
  2. +
  3. +

    Nainstalujte balíček coturn z hlavního repozitáře.

    +
  4. +
+
apt update && apt install coturn`.
+
+
    +
  1. Odkomentujte TURNSERVER_ENABLED=1 z /etc/default/coturn:
  2. +
+
sed -i '/TURN/s/^#//g' /etc/default/coturn
+
+
    +
  1. +

    Konfigurace coturn v souboru /etc/turnserver.conf:

    +

    Viz také komentáře k jednotlivým volbám.

    +
  2. +
+
# Naslouchejte také na portu 443 pro tls.
+alt-tls-listening-port=443
+# Použijte otisky prstů ve zprávách TURN
+fingerprint
+# Použijte mechanismus dlouhodobých pověření
+lt-cred-mech
+# Vaše pověření
+user=$YOUR_LOGIN:$YOUR_PASSWORD
+# Vaše doména serveru
+server-name=$YOUR_DOMAIN
+# Výchozí sféra, která bude použita pro uživatele, pokud nebyl nalezen explicitní vztah origin/realm
+realm=$YOUR_DOMAIN
+# Cesta k vašim certifikátům. Ujistěte se, že jsou čitelné pro proces cotun user/group
+cert=/var/lib/turn/cert.pem
+pkey=/var/lib/turn/key.pem
+# Použijte 2066 bitů předdefinovaného DH klíče TLS
+dh2066
+# Přihlaste se do journalctl
+syslog
+# Uživatel/skupina, která bude provozovat službu coturn
+proc-user=turnserver
+proc-group=turnserver
+# Zakázat slabé šifrování
+no-tlsv1
+no-tlsv1_1
+no-tlsv1_2
+
+
    +
  1. Spusťte a povolte službu coturn:
  2. +
+
systemctl enable coturn && systemctl start coturn
+
+
    +
  1. Pokud používáte firewall ufw, otevřete případně příslušné porty:
  2. +
+
    +
  • 3478 - "obyčejný" TURN/STUN;
  • +
  • 5349 - TURN/STUN přes TLS;
  • +
  • 443 - TURN/STUN přes TLS, který může obejít brány firewall;
  • +
  • 49152:65535 - rozsah portů, který bude společnost Coturn ve výchozím nastavení používat pro přenos TURN.
  • +
+
# Pro Ubuntu
+sudo ufw allow 3478 && \
+sudo ufw allow 443 && \
+sudo ufw allow 5349 && \
+sudo ufw allow 49152:65535/tcp && \
+sudo ufw allow 49152:65535/udp
+
+# Pro Fedora
+sudo firewall-cmd --permanent --add-port=443/tcp && \
+sudo firewall-cmd --permanent --add-port=443/udp && \
+sudo firewall-cmd --permanent --add-port=5349/tcp && \
+sudo firewall-cmd --permanent --add-port=5349/udp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/tcp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/udp && \
+sudo firewall-cmd --reload
+
+

Konfigurace mobilních aplikací

+

Konfigurace mobilní aplikace pro použití vašeho serveru:

+
    +
  1. +

    Otevřete Nastavení / Síť a servery / WebRTC ICE servery a přepněte přepínač Konfigurovat ICE servery.

    +
  2. +
  3. +

    Do pole zadejte všechny adresy serverů, jednu na řádek, například pokud máte servery na portu 5349:

    +
  4. +
+
stun:stun.example.com:5349
+turn:username:password@turn.example.com:5349
+
+

To je vše - nyní můžete uskutečňovat audio a video hovory prostřednictvím vlastního serveru, aniž byste s našimi servery sdíleli jakákoli data (kromě výměny klíčů s kontaktem v šifrovaných zprávách E2E).

+

Řešení problémů

+
    +
  • +

    Zjistěte, zda je server dostupný:

    +

    Spusťte tento příkaz v terminálu:

    +
    ping <vaše_ip_nebo_doména>
    +
    +

    Pokud jsou pakety přenášeny, server je v provozu!

    +
  • +
  • +

    Zjistěte, zda jsou otevřené porty:

    +

    Spusťte tento příkaz v terminálu:

    +
    nc -zvw10 <vaše_ip_nebo_doména> 443 5349
    +
    +

    Měli byste vidět:

    +
    Připojení k portu <vaše_ip_nebo_doména> 443 [tcp/https] se podařilo!
    +Připojení k <vaše_ip_nebo_doména> 5349 port [tcp/*] uspělo!
    +
    +
  • +
  • +

    Test připojení STUN/TURN:

    +
      +
    1. +

      Přejděte na IceTest.

      +
    2. +
    3. +

      Do části Sestavit seznam serverů ICE přidejte:

      +

      .

      +
        +
      • STUN: stun:<vaše_ip_nebo_doména>:<port> a stiskněte Add STUN.
      • +
      • TURN: turn:<vaše_ip_nebo_doména>:<port>, Username: <vaše_přihlašovací jméno>, Credential: <vaš_pas> a stiskněte Add TURN
      • +
      +

      Kde <port> je 443 nebo 5349.

      +
    4. +
    5. +

      Měli byste vidět své servery v sekci ICE server list. Pokud je vše správně nastaveno, stiskněte Start test:

      + +
    6. +
    7. +

      V části Výsledky byste měli vidět něco takového:

      + +

      Pokud výsledky zobrazují kandidáty srflx a relay, je vše nastaveno správně!

      +
    8. +
    +
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/android.html b/docs/lang/fr/android.html new file mode 100644 index 0000000000..05b55eaa84 --- /dev/null +++ b/docs/lang/fr/android.html @@ -0,0 +1,1060 @@ + + + + + + + + + Accès aux fichiers dans l'application Android + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 07.02.2023 | FR, EN, CZ, PL |

+

Accès aux fichiers dans l'application Android

+

SimpleX utilise des bases de données et stocke ses préférences dans le répertoire de données privées d'Android. Ce répertoire contient

+
    +
  • des bases de données
  • +
  • les fichiers envoyés et reçus
  • +
  • les fichiers temporaires qui seront supprimés lorsqu'ils ne sont pas nécessaires
  • +
  • les préférences de l'utilisateur.
  • +
+

Si vous voulez voir ce qui est stocké dans le répertoire de données de SimpleX, vous devez avoir :

+
    +
  • Un système d'exploitation Unix (ou MinGW sous Windows)
  • +
  • l'outil ADB (Android Debug Bridge) installé sur un ordinateur (téléchargez-le ici et installez-le)
  • +
  • votre appareil connecté via USB ou Wi-Fi à l'ordinateur.
  • +
+

La procédure :

+
    +
  • Ouvrez SimpleX, allez dans Phrase secrète et exportation de la base de données, activez Sauvegarde des données de l'app. Cela permettra aux autres étapes de fonctionner
  • +
  • optionnel_ : si vous voulez voir le contenu de la base de données, changez la phrase secrète de la base de données aléatoire pour la vôtre. Pour ce faire, arrêtez le chat dans le menu "Phrase secrète et exportation de la base de données", ouvrez "Phrase secrète de la base de données", entrez la nouvelle phrase secrète et confirmez-la, puis mettez-la à jour. Ne l'oubliez pas, sinon vous perdrez toutes vos données au cas où la phrase d'authentification vous serait redemandée plus tard.
  • +
  • ouvrez un émulateur de terminal (Windows CMD/Powershell ne fonctionnera pas) et changez de répertoire pour celui que vous voulez utiliser pour stocker la sauvegarde :
  • +
+
cd /tmp  # juste un exemple
+
+

Exécutez ensuite la méthode suivante :

+
adb -d backup -f chat.ab -noapk chat.simplex.app && 
+tail -n +5 chat.ab > chat.dat && 
+printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - chat.dat > chat.gz && 
+tar -xvzf chat.gz
+
+

Déverrouillez maintenant l'appareil et confirmez une opération de sauvegarde sans utiliser de mot de passe pour le chiffrement, sinon les commandes ne fonctionneront pas.

+

Ensuite, la sauvegarde doit être terminée. Si vous voyez une erreur disant tar : Error is not recoverable : exiting now mais qu'avant cela vous avez enregistré quelques noms de fichiers, ne vous inquiétez pas, tout va bien.

+

Maintenant les fichiers sauvegardés seront dans ./apps/chat.simplex.app/.

+

Veuillez noter que si vous utilisez une version récente de SimpleX, les bases de données seront chiffrées, et vous ne pourrez pas en voir le contenu sans utiliser l'application sqlcipher et sans connaître la phrase secrète de déchiffrement (vous devez d'abord la changer pour la vôtre à partir de celle qui est générée aléatoirement dans l'application).

+

Déchiffrer les bases de données

+

Afin de visualiser les données de la base de données, vous devez d'abord les déchiffrer. Installez sqlcipher en utilisant votre gestionnaire de paquets préféré et exécutez les commandes suivantes dans le répertoire contenant les bases de données :

+
sqlcipher files_chat.db
+pragma key="youDecryptionPassphrase";
+# S'assurer qu'il fonctionne bien
+select * from users;
+
+

Si vous voyez Parse error : no such table : users, assurez-vous que vous avez entré la bonne phrase secrète, et que vous avez changé la phrase secrète au hasard dans l'application Android (si vous avez obtenu cette base de données à partir d'un appareil Android, bien sûr).

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/cli.html b/docs/lang/fr/cli.html new file mode 100644 index 0000000000..316a4347a0 --- /dev/null +++ b/docs/lang/fr/cli.html @@ -0,0 +1,1178 @@ + + + + + + + + + Application de terminal + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 31.01.2023 | FR, EN, CZ, PL |

+

Application de terminal (console) SimpleX Chat pour Linux/MacOS/Windows

+

Table des matières

+ +

Fonctionnalités du terminal de chat

+
    +
  • Chat individuel avec plusieurs personnes dans la même fenêtre de terminal.
  • +
  • Messagerie de groupe.
  • +
  • Envoi de fichiers aux contacts et aux groupes.
  • +
  • Adresses de contact des utilisateurs - établissez des connexions via des liens de contact à usage multiple.
  • +
  • Les messages sont conservés dans une base de données SQLite locale.
  • +
  • Nom du destinataire auto-rempli - il suffit de taper vos messages pour répondre à l'expéditeur une fois la connexion établie.
  • +
  • Des serveurs SMP de démonstration sont disponibles et préconfigurés dans l'application - ou vous pouvez déployer votre propre serveur.
  • +
  • Pas d'identité globale ni de noms visibles par le.s serveur.s, ce qui garantit la confidentialité totale de vos contacts et de vos conversations.
  • +
  • Deux couches de chiffrement E2E (double ratchet pour les connexions duplex, utilisant un accord de clé X3DH avec des clés Curve448 éphémères, et NaCl crypto_box pour les files d'attente SMP, utilisant des clés Curve25519) et transmission hors bande des clés des destinataires (voir Comment utiliser SimpleX chat).
  • +
  • Validation de l'intégrité du message (en incluant les résumés des messages précédents).
  • +
  • Authentification de chaque commande/message par les serveurs SMP avec des clés Ed448 générées automatiquement.
  • +
  • Chiffrement de transport TLS 1.3.
  • +
  • Chiffrement supplémentaire des messages du serveur SMP au destinataire pour réduire la corrélation du trafic.
  • +
+

Les clés publiques impliquées dans l'échange de clés ne sont pas utilisées comme identité, elles sont générées aléatoirement pour chaque contact.

+

Voir les primitives de chiffrement utilisées pour les détails techniques.

+

+

🚀 Installation

+

Télécharger le client de chat

+

Linux et MacOS

+

Pour installer ou mettre à jour simplex-chat, vous devez exécuter le script d'installation. Pour ce faire, utilisez la commande cURL ou Wget suivante :

+
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+
wget -qO- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+

Une fois le client de chat téléchargé, vous pouvez le lancer avec la commande simplex-chat dans votre terminal.

+

Vous pouvez également télécharger manuellement une version binary de chat pour votre système à partir de la [dernière version stable] (https://github.com/simplex-chat/simplex-chat/releases) et le rendre exécutable comme indiqué ci-dessous.

+
chmod +x <binary>
+mv <binary> ~/.local/bin/simplex-chat
+
+

(ou tout autre emplacement préféré sur PATH).

+

Sous MacOS, vous devez également autoriser Gatekeeper à l'exécuter.

+

Windows

+
move <binary> %APPDATA%/local/bin/simplex-chat.exe
+
+

Compiler depuis la source

+
+

Veuillez noter : pour compiler l'application, utilisez le code source de la branche stable.

+
+

Utiliser Docker

+

Sous Linux, vous pouvez compiler l'exécutable du chat en utilisant docker build with custom output :

+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+DOCKER_BUILDKIT=1 docker build --output ~/.local/bin .
+
+
+

Veuillez noter : Si vous rencontrez l'erreur version `GLIBC_2.28' non trouvée, reconstruisez-le avec l'image de base haskell:8.10.7-stretch(changez-la dans votre Dockerfile local).

+
+

Utiliser Haskell stack

+

(sur n'importe quel OS)

+
    +
  1. Installer Haskell GHCup, GHC 8.10.7 et cabal :
  2. +
+
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
+
+
    +
  1. Compiler le projet :
  2. +
+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+# sur Linux
+apt-get update && apt-get install -y build-essential libgmp3-dev zlib1g-dev
+cp scripts/cabal.project.local.linux cabal.project.local
+# ou sur MacOS:
+# brew install openssl@3.0
+# cp scripts/cabal.project.local.mac cabal.project.local
+# vous devrez peut-être modifier cabal.project.local pour indiquer l'emplacement réel d'openssl
+cabal update
+cabal install
+
+

Utilisation

+

Lancement du client de chat

+

Pour démarrer le client de chat, exécutez simplex-chat depuis le terminal.

+

Par défaut, le répertoire de données de l'application est créé dans le répertoire personnel (~/.simplex, ou %APPDATA%/simplex sous Windows), et deux fichiers de base de données SQLite simplex_v1_chat.db et simplex_v1_agent.db y sont initialisés.

+

Pour spécifier un préfixe de chemin de fichier différent pour les fichiers de la base de données, utilisez l'option de ligne de commande -d :

+
$ simplex-chat -d alice
+
+

L'exécution ci-dessus, par exemple, créera les fichiers de base de données alice_v1_chat.db et alice_v1_agent.db dans le répertoire actuel.

+

Trois serveurs SMP par défaut sont hébergés sur Linode - ils sont pré-configurés dans l'application.

+

Si vous avez déployé votre propre serveur SMP, vous pouvez configurer le client via l'option -s :

+
$ simplex-chat -s smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@smp.example.com
+
+

La chaîne encodée en Base64url qui précède l'adresse du serveur est l'empreinte du certificat hors ligne du serveur qui est validée par le client lors du handshake TLS.

+

Vous pouvez toujours parler aux gens en utilisant le serveur par défaut ou tout autre serveur - cela n'affecte que l'emplacement de la file d'attente des messages lorsque vous initiez la connexion (et la file d'attente des réponses peut se trouver sur un autre serveur, comme défini par le client de l'autre coté).

+

Exécutez simplex-chat -h pour voir toutes les options disponibles.

+

Accéder aux serveurs de messagerie via Tor

+

Installez Tor et exécutez-le en tant que proxy SOCKS5 sur le port 9050, par exemple sur Mac vous pouvez :

+
brew install tor
+brew services start tor
+
+

Utilisez l'option -x pour accéder aux serveurs via Tor :

+
simplex-chat -x
+
+

Vous pouvez également utiliser l'option --socks-proxy=ipv4:port ou --socks-proxy=:port pour configurer l'hôte et le port de votre proxy SOCKS5, par exemple si vous l'exécutez sur un autre hôte ou port.

+

Comment utiliser SimpleX chat

+

Une fois que vous aurez lancé le chat, vous serez invité à indiquer un "nom d'affichage" et un "nom complet" facultatif pour créer un profil de chat local. Votre nom d'affichage est un alias par lequel vos contacts peuvent se référer à vous. Il n'est pas unique et ne sert pas d'identité globale. Si certains de vos contacts ont choisi le même nom d'affichage, le client de chat ajoute un suffixe numérique à leur nom d'affichage local.

+

Le schéma ci-dessous montre comment connecter et envoyer un message à un contact :

+
+ +
+

Une fois que vous avez configuré votre profil local, entrez /c (pour /connect) pour créer une nouvelle connexion et générer une invitation. Envoyez cette invitation à votre contact via n'importe quel autre canal.

+

Vous pouvez créer plusieurs invitations en saisissant plusieurs fois la commande /connect et en envoyant ces invitations aux contacts correspondants avec lesquels vous souhaitez vous connecter.

+

L'invitation ne peut être utilisée qu'une seule fois et même si elle est interceptée, l'attaquant ne pourra pas l'utiliser pour vous envoyer les messages via cette file d'attente une fois que votre contact aura confirmé que la connexion est établie. Voir le protocole de l'agent pour une explication du format d'invitation.

+

Le contact qui a reçu l'invitation doit saisir /c <invitation> pour accepter la connexion. La connexion est alors établie, et les deux parties sont notifiées.

+

Ils utiliseraient alors les commandes @<name> <message> pour envoyer des messages. Vous pouvez aussi simplement commencer à taper un message pour l'envoyer au contact qui était le dernier.

+

Utilisez /help dans le chat pour voir la liste des commandes disponibles.

+

Groupes

+

Pour créer un groupe, utilisez /g <groupe>, puis ajoutez-y des contacts avec /a <groupe> <nom>. Vous pouvez ensuite envoyer des messages au groupe en entrant #<groupe> <message>. Utilisez /help groups pour d'autres commandes.

+

simplex-chat

+
+

Veuillez noter : les groupes ne sont pas stockés sur un serveur, ils sont conservés comme une liste de membres dans la base de données de l'application à qui les messages seront envoyés.

+
+

Envoi de fichiers

+

Vous pouvez envoyer un fichier à votre contact avec /f @<contact> <chemin_du_fichier> - le destinataire devra l'accepter avant qu'il ne soit envoyé. Utilisez /help files pour les autres commandes.

+

simplex-chat

+

Vous pouvez envoyer des fichiers à un groupe avec /f #<group> <chemin_du_fichier>.

+

Adresses de contact d'utilisateur

+

Comme alternative aux liens d'invitation unique, vous pouvez créer une adresse à long terme avec /ad (pour /address). L'adresse créée peut ensuite être partagée via n'importe quel canal, et utilisée par d'autres utilisateurs comme lien pour faire une demande de contact avec /c <adresse_de_contact_de_l'utilisateur>.

+

Vous pouvez accepter ou rejeter les demandes entrantes avec les commandes /ac <nom> et /rc <nom>.

+

L'adresse de l'utilisateur est "à long terme" dans le sens où il s'agit d'un lien de connexion à usage multiple - elle peut être utilisée jusqu'à ce qu'elle soit supprimée par l'utilisateur, auquel cas toutes les connexions établies resteront actives (contrairement à ce qui se passe avec le courrier électronique, où le changement d'adresse empêche les gens de vous envoyer des messages).

+

Utilisez /help address pour les autres commandes.

+

simplex-chat

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/contributing.html b/docs/lang/fr/contributing.html new file mode 100644 index 0000000000..5117a77b7f --- /dev/null +++ b/docs/lang/fr/contributing.html @@ -0,0 +1,1031 @@ + + + + + + + + + Guide pour contribuer + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 31.01.2023 | FR, EN, CZ, PL |

+

Guide pour contribuer

+

Compiler avec le chiffrement SQLCipher activé

+

Ajoutez cabal.project.local à la racine du projet avec les emplacements des en-têtes et des bibliothèques OpenSSL ainsi que le paramètre définissant le mode de chiffrement :

+
cp scripts/cabal.project.local.mac cabal.project.local
+# or
+# cp scripts/cabal.project.local.linux cabal.project.local
+
+

OpenSSL sur MacOS

+

LibreSSL est fourni par défaut sur MacOS, OpenSSL doit être installé pour compiler SimpleX à partir de la source.

+

OpenSSL peut être installé avec brew install openssl@3.0

+

Vous devez ajouter /opt/homebrew/opt/openssl@3.0/bin à votre PATH pour que tout fonctionne correctement.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/server.html b/docs/lang/fr/server.html new file mode 100644 index 0000000000..bf82a33372 --- /dev/null +++ b/docs/lang/fr/server.html @@ -0,0 +1,1316 @@ + + + + + + + + + Héberger votre propre serveur SMP + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + +
+
+ Il existe une version plus récente de cette page en anglais. Cliquez pour voir +
+
+ + +
+
+ + + +
+
+

| 05.06.2023 | FR, EN, CZ, PL |

+

Héberger votre propre serveur SMP

+

Présentation générale

+

Un serveur SMP est un serveur relais utilisé pour transmettre les messages sur le réseau SimpleX. Les apps SimpleX Chat ont des serveurs prédéfinis (pour les apps mobiles, smp11, smp12 et smp14.simplex.im), mais vous pouvez facilement modifier la configuration de l'app pour utiliser d'autres serveurs.

+

Seuls les utilisateurs de SimpleX déterminent quel serveur est utilisé pour recevoir les messages, séparément pour chaque contact (ou pour chaque connexion à un membre d'un groupe), et ces serveurs ne sont que temporaires, car l'adresse de réception peut changer.

+

Veuillez noter : lorsque vous modifiez les serveurs dans la configuration de l'app, cela n'affecte que les serveurs qui seront utilisés pour les nouveaux contacts. Les contacts existants ne seront pas automatiquement déplacés vers les nouveaux serveurs, mais vous pouvez les déplacer manuellement à l'aide du bouton "Changer d'adresse de réception" sur les fiches d'information de contact/membre – ce sera bientôt automatisé.

+

Installation

+
    +
  1. +

    Tout d'abord, installez smp-server:

    + +
  2. +
+

L'installation manuelle nécessite quelques actions préalables :

+
    +
  1. +

    Créer un utilisateur et un groupe pour votre smp-server:

    +
    sudo useradd -m smp
    +
    +
  2. +
  3. +

    Créer les répertoires nécessaires et y attribuer les permissions :

    +
    sudo mkdir -p /var/opt/simplex /etc/opt/simplex
    +sudo chown smp:smp /var/opt/simplex /etc/opt/simplex
    +
    +
  4. +
  5. +

    Autoriser le port du smp-server dans le pare-feu:

    +
    # Pour Ubuntu
    +sudo ufw allow 5223/tcp
    +# Pour Fedora
    +sudo firewall-cmd --permanent --add-port=5223/tcp && \
    +sudo firewall-cmd --reload
    +
    +
  6. +
  7. +

    Optionnel - Si vous utilisez une distribution avec systemd, créez le fichier /etc/systemd/system/smp-server.service avec le contenu suivant :

    +
    [Unit]
    +Description=Serveur SMP
    +[Service]
    +User=smp
    +Group=smp
    +Type=simple
    +ExecStart=smp-server start
    +ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
    +KillSignal=SIGINT
    +TimeoutStopSec=infinity
    +Restart=always
    +RestartSec=10
    +LimitNOFILE=65535
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    Et exécutez sudo systemctl daemon-reload.

    +
  8. +
+

Configuration

+

Pour voir les options disponibles, exécutez smp-server sans paramètres :

+
sudo su smp -c smp-server
+
+...
+Available commands:
+  init                     Initialize server - creates /etc/opt/simplex and
+                           /var/opt/simplex directories and configuration files
+  start                    Start server (configuration:
+                           /etc/opt/simplex/smp-server.ini)
+  delete                   Delete configuration and log files
+
+

Vous pouvez obtenir de l'aide supplémentaire en exécutant sudo su smp -c "smp-server <command> -h"

+

Ensuite, nous devons configurer smp-server:

+

Interactif

+

Exécutez la commande suivante :

+
sudo su smp -c "smp-server init"
+
+

Il y a plusieurs options disponibles :

+
    +
  • +

    Enable store log to restore queues and messages on server restart (Yn):

    +

    Entrez y pour permettre la sauvegarde et la restauration des connexions et des messages lorsque le serveur est redémarré.

    +

    Veuillez noter : il est important d'utiliser SIGINT pour redémarrer le serveur, sinon les messages non distribués ne seront pas restaurés. Les connexions seront restaurées indépendamment de la façon dont le serveur est redémarré, car contrairement aux messages, elles sont ajoutées aux logs (append-only) seulement à chaque changement.

    +
  • +
  • +

    Enable logging daily statistics (yN):

    +

    Entrez y pour activer l'enregistrement des statistiques au format CSV, par exemple, elles peuvent être utilisées pour afficher des graphiques d'utilisation globale dans Grafana.

    +
  • +
+

Ces statistiques incluent le nombre quotidien de files d'attente créées, sécurisées et supprimées, de messages envoyés et reçus, ainsi que le nombre quotidien, hebdomadaire et mensuel de files d'attente actives (c'est-à-dire les files d'attente qui ont été utilisées pour des messages). Nous estimons que ces informations ne comportent aucun élément permettant de corréler différentes files d'attente comme appartenant aux mêmes utilisateurs, mais si vous pensez que cela peut être exploité de quelque manière que ce soit, veuillez nous le faire savoir, de manière confidentielle.

+
    +
  • +

    Require a password to create new messaging queues?

    +

    Entrez r ou votre mot de passe pour protéger votre smp-server, ou n pour désactiver la protection par mot de passe.

    +
  • +
  • +

    Enter server FQDN or IP address for certificate (127.0.0.1):

    +

    Entrez votre domaine ou l'adresse IP sur laquelle votre serveur smp fonctionne - elle sera incluse dans les certificats du serveur et également indiquée dans l'adresse du serveur.

    +
  • +
+

Option via ligne de commande

+

Exécutez la commande suivante :

+
sudo su smp -c "smp-server init -h"
+
+...
+Available options:
+  -l,--store-log           Enable store log for persistence
+  -s,--daily-stats         Enable logging daily server statistics
+  -a,--sign-algorithm ALG  Signature algorithm used for TLS certificates:
+                           ED25519, ED448 (default: ED448)
+  --ip IP                  Server IP address, used as Common Name for TLS online
+                           certificate if FQDN is not supplied
+                           (default: "127.0.0.1")
+  -n,--fqdn FQDN           Server FQDN used as Common Name for TLS online
+                           certificate
+  --no-password            Allow creating new queues without password
+  --password PASSWORD      Set password to create new messaging queues
+  -y,--yes                 Non-interactive initialization using command-line
+                           options
+  -h,--help                Show this help text
+
+

Vous devriez déterminer quels paramètres sont nécessaires pour votre cas d'utilisation et ensuite exécuter smp-server init avec le paramètre -y pour une initialisation non-interactive :

+
sudo su smp -c "smp-server init -y -<your flag> <your option>"
+
+

Par exemple, exécutez :

+
sudo su smp -c "smp-server init -y -l --ip 192.168.1.5 --password test"
+
+

pour initialiser votre smp-server avec comme configuration :

+
    +
  • restauration des connexions et des messages lors du redémarrage du serveur (paramètre -l),
  • +
  • adresse IP 192.168.1.5,
  • +
  • protection du smp-server avec comme mot de passe test.
  • +
+
+

Après cela, votre installation est terminée et vous devriez voir dans votre teminal quelque chose comme ceci :

+
Certificate request self-signature ok
+subject=CN = 127.0.0.1
+Server initialized, you can modify configuration in /etc/opt/simplex/smp-server.ini.
+Run `smp-server start` to start server.
+----------
+You should store CA private key securely and delete it from the server.
+If server TLS credential is compromised this key can be used to sign a new one, keeping the same server identity and established connections.
+CA private key location: /etc/opt/simplex/ca.key
+----------
+SMP server v3.4.0
+Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+
+

L'adresse du serveur ci-dessus doit être utilisée dans la configuration de votre client et si vous avez ajouté le mot de passe du serveur, il ne doit être partagé qu'avec les personnes que vous souhaitez autoriser à utiliser votre serveur pour recevoir les messages (tous vos contacts pourront envoyer des messages, car cela ne nécessite pas de mot de passe). Si vous avez fourni une adresse IP ou un nom d'hôte lors de l'initialisation, ils seront indiqués dans l'adresse du serveur, sinon remplacez <hostnames> par les adresses réelles du serveur.

+

Documentation

+

Tous les fichiers requis pour smp-server sont situés dans le dossier /etc/opt/simplex/.

+

Les messages stockés, les connexions, les statistiques et les logs du serveur sont situés dans le dossier /var/opt/simplex/.

+

Adresse de serveur SMP

+

Une adresse de serveur SMP a le format suivant :

+
smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]
+
+
    +
  • +

    <fingerprint>

    +

    Empreinte du certificat de votre smp-server. Vous pouvez vérifier l'empreinte de votre certificat dans /etc/opt/simplex/fingerprint.

    +
  • +
  • +

    optionnel <password>

    +

    Votre mot de passe configuré pour smp-server. Vous pouvez vérifier votre mot de passe configuré dans /etc/opt/simplex/smp-server.ini, sous la section [AUTH] dans le champ create_password:.

    +
  • +
  • +

    <public_hostname>, optionnel <onion_hostname>

    +

    Votre(vos) nom(s) d'hôte configuré(s) de smp-server. Vous pouvez vérifier vos hôtes configurés dans /etc/opt/simplex/smp-server.ini, dans la section [AUTH] dans le champ host:.

    +
  • +
+

Systemd commandes

+

Pour démarrer smp-server au démarrage de l'hôte, exécutez :

+
sudo systemctl enable smp-server.service
+
+Created symlink /etc/systemd/system/multi-user.target.wants/smp-server.service → /etc/systemd/system/smp-server.service.
+
+

Pour démarrer smp-server, exécutez :

+
sudo systemctl start smp-server.service
+
+

Pour vérifier l'état du smp-server, exécutez :

+
sudo systemctl status smp-server.service
+
+● smp-server.service - SMP server
+     Loaded: loaded (/etc/systemd/system/smp-server.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sat 2022-11-23 19:23:21 UTC; 1min 48s ago
+   Main PID: 30878 (smp-server)
+     CGroup: /docker/5588ab759e80546b4296a7c50ffebbb1fb7b55b8401300e9201313b720989aa8/system.slice/smp-server.service
+             └─30878 smp-server start
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

Pour arrêter smp-server, exécutez :

+
sudo systemctl stop smp-server.service
+
+

Pour vérifier la "tail" de smp-server des logs, exécutez :

+
sudo journalctl -fu smp-server.service
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

Suivi de l'activité

+

Vous pouvez activer les statistiques de smp-server sur le tableau de bord Grafana en mettant la valeur on dans /etc/opt/simplex/smp-server.ini, sous la section [STORE_LOG] dans le champ log_stats:.

+

Les journaux seront stockés dans un fichier csv dans /var/opt/simplex/smp-server-stats.daily.log. Les champs pour le fichier csv sont :

+
fromTime,qCreated,qSecured,qDeleted,msgSent,msgRecv,dayMsgQueues,weekMsgQueues,monthMsgQueues
+
+
    +
  • +

    fromTime - horodatage; date et heure de l'événement

    +
  • +
  • +

    qCreated - int; files d'attente créées

    +
  • +
  • +

    qSecured - int; files d'attente établies

    +
  • +
  • +

    qDeleted - int; files d'attente supprimées

    +
  • +
  • +

    msgSent - int; messages envoyés

    +
  • +
  • +

    msgRecv - int; messages reçus

    +
  • +
  • +

    dayMsgQueues - int; files d'attente actives en un jour

    +
  • +
  • +

    weekMsgQueues - int; files d'attente actives en une semaine

    +
  • +
  • +

    monthMsgQueues - int; files d'attente actives en un mois

    +
  • +
+

Pour importer du csv dans Grafana il faut :

+
    +
  1. +

    Installer le plugin Grafana : Grafana - CSV datasource

    +
  2. +
  3. +

    Autoriser le mode local en ajoutant ce qui suit :

    +
    [plugin.marcusolsson-csv-datasource]
    +allow_local_mode = true
    +
    +

    ... to /etc/grafana/grafana.ini

    +
  4. +
  5. +

    Ajouter une source de données CSV :

    +
      +
    • Dans le menu latéral, cliquez sur l'onglet Configuration (icône en forme de rouage).
    • +
    • Cliquez sur Ajouter une source de données dans le coin supérieur droit de l'onglet Sources de données.
    • +
    • Entrez "CSV" dans le champ de recherche pour trouver la source de données CSV.
    • +
    • Cliquez sur le résultat de la recherche qui indique "CSV".
    • +
    • Dans URL, entrez un fichier qui pointe vers le contenu CSV.
    • +
    +
  6. +
  7. +

    C'est fait ! Vous devriez être en mesure de créer votre propre tableau de bord avec des statistiques.

    +
  8. +
+

Pour plus de documentation, voir : CSV Data Source pour Grafana - Documentation

+

Configurer l'app pour utiliser le serveur

+

Pour configurer l'app afin d'utiliser votre serveur de messagerie, copiez son adresse complète, y compris le mot de passe, et ajoutez-la à l'application. Vous avez la possibilité d'utiliser votre serveur avec les serveurs prédéfinis ou sans eux - vous pouvez les supprimer ou les désactiver.

+

Il est également possible de partager l'adresse de votre serveur avec vos amis en leur permettant de scanner le code QR dans les paramètres du serveur. Ce code inclura le mot de passe du serveur, ce qui leur permettra aussi de recevoir des messages via votre serveur.

+

Veuillez noter : vous avez besoin de la version 4.0 du serveur SMP pour avoir le support du mot de passe. Si vous avez déjà déployé un serveur, vous pouvez ajouter le mot de passe en l'ajoutant au fichier INI du serveur.

+

     

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/simplex.html b/docs/lang/fr/simplex.html new file mode 100644 index 0000000000..e8c56f52bd --- /dev/null +++ b/docs/lang/fr/simplex.html @@ -0,0 +1,1130 @@ + + + + + + + + + Plateforme SimpleX + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 07.02.2023 | FR, EN, CZ, PL |

+

Plateforme SimpleX - motivation et comparaison

+

Problèmes

+

Les plateformes et protocoles de chat existants présentent une partie ou la totalité des problèmes suivants :

+
    +
  • Absence de confidentialité du profil et des contacts de l'utilisateur (confidentialité des métadonnées).
  • +
  • Aucune protection (ou seulement une protection optionnelle) des implémentations E2EE contre les attaques MITM via le fournisseur.
  • +
  • Messages non sollicités (spam et abus).
  • +
  • Absence de propriété et de protection des données.
  • +
  • Complexité d'utilisation de tous les protocoles non centralisés pour les utilisateurs non techniques.
  • +
+

La concentration de la communication dans un petit nombre de plateformes centralisées rend la résolution de ces problèmes assez difficile.

+

Solutions

+

Les différents protocoles proposés résolvent ces problèmes en faisant en sorte que les messages comme les contacts soit stockés exclusivement sur l'appareil client, tout en réduisant le rôle des serveurs à de simples relais de message qui ne nécessite que l'autorisation des messages envoyés dans les files d'attentes, mais qui NE nécessite PAS une authentification utilisateur - les message ne sont pas les seuls à être protégé, les métadonnées le sont aussi car l'utilisateur n'est pas lié à un identifiant - contrairement aux autres platformes.

+

Voir le livre blanc de SimpleX pour plus d'information sur les objectifs de la platforme et ses détails techniques.

+

Pourquoi utiliser SimpleX

+

SimpleX une approche unique en terme de confidentialité et de sécurité

+

Tout le monde devrait se soucier de la confidentialité et de la sécurité de ses communications - même une conversation lambda peut vous mettre en danger.

+

Protection complète de votre identité, profil, contacts et métadonnées

+

Contrairement aux autres platformes de messagerie, SimpleX ne lie pas d'identifiant à l'utilisateur - il n'y a pas besoin de numéro de télèphone (comme Signal ou WhatsApp), d'adresses basés sur des noms de domaines (comme les e-mails, XMPP ou Matrix), de noms d'utilisateurs (comme Telegram), ou de clés publiques ou même de nombres aléatoires pour identifié les utilisateurs - on ne sait même pas combiens de personnes utilise SimpleX.

+

Pour distribuer les messages au lieu d'utiliser des identifiants d'utilisateur que toute les autres platformes utilisent, SimpleX utilise des adresses unidirectionnelles (simplex) de files d'attentes de messages. Utiliser SimpleX c'est comme avoir une adresse e-mail différentes ou un numéro de télèphone différent par contact, sans les inconvenients qui viennent avec. Dans un futur proche les apps SimpleX changeront automatiquement les files d'attentes, déplacant les conversations d'un serveur à un autre, pour une meilleure confidentialité.

+

Cette approche protège la vie privé de la personne avec qui vous communiquez, elle est masquée des serveurs SimpleX et de n'importe quel autre observateur. Vous pouvez encore améliorer votre protection en configurant votre réseau pour qu'il passe via des réseaux superposé comme, par exemple Tor.

+

La meilleure protection contre le spam et les abus

+

Comme vous n'avez pas d'identifiant sur la plateforme SimpleX, vous ne pouvez pas être contacté, sauf si vous partagez un lien d'invitation unique ou une adresse d'utilisateur temporaire facultative. Même avec les adresses d'utilisateur facultatives, bien qu'elles puissent être utilisées pour envoyer des demandes de contact non sollicitées, vous pouvez les modifier ou les supprimer complètement sans perdre aucune de vos connexions.

+

Propriété, contrôle et sécurité totale de vos données

+

SimpleX stocke toutes les données de l'utilisateur sur les appareils clients, les messages ne sont conservés que temporairement sur les serveurs relais SimpleX jusqu'à leur réception.

+

Nous utilisons un format de base de données portable qui peut être utilisé sur tous les appareils pris en charge. Nous ajouterons bientôt la possibilité d'exporter la base de données de chat depuis l'application mobile afin qu'elle puisse être utilisée sur un autre appareil.

+

Contrairement aux serveurs des réseaux fédérés (e-mail, XMPP ou Matrix), les serveurs SimpleX ne stockent pas les comptes des utilisateurs, ils se contentent de relayer les messages aux destinataires, protégeant ainsi la vie privée des deux parties. Il n'y a aucun identifiant ou message chiffré en commun entre le trafic envoyé et reçu du serveur, grâce à la couche de chiffrement supplémentaire pour les messages délivrés. Par conséquent, si quelqu'un observe le trafic du serveur, il ne peut pas facilement déterminer qui communique avec qui (Voir le livre blanc de SimpleX pour les attaques connues de corrélation réseau).

+

Les utilisateurs sont maîtres du réseau SimpleX

+

Vous pouvez utiliser SimpleX avec vos propres serveurs et continuer à communiquer avec les personnes utilisant les serveurs préconfigurés dans les applications ou tout autre serveur SimpleX.

+

La plateforme SimpleX utilise un protocole ouvert et fournit un SDK pour créer des chatbot, permettant la mise en œuvre de services avec lesquels les utilisateurs peuvent interagir via les applications SimpleX Chat - nous sommes vraiment impatients de voir quels services SimpleX peuvent être créés.

+

Si vous envisagez de développer avec la plateforme SimpleX, que ce soit pour des services de chatbot pour les utilisateurs de l'application SimpleX ou pour intégrer la bibliothèque de chat SimpleX dans vos applications mobiles, n'hésitez pas à nous contacter pour tout conseil et assistance.

+

Comparaison avec d'autres protocoles

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SimpleX chatSignal et autres...XMPP, MatrixProtocoles P2P
Identifiants d'utilisateur nécessaireNon = privéOui1Oui2Oui3
Risque d'attaque MITMNon = securiséOui4OuiOui
Dépendance au DNSNon = résistantOuiOuiNon
Un opérateur ou un réseau uniqueNon = décentraliséOuiNonOui5
Attaque à l'échelle du réseauNon = résistantOuiOui2Oui6
+
    +
  1. Généralement basé sur un numéro de téléphone, dans certains cas sur des noms d'utilisateur.
  2. +
  3. Basé sur le DNS.
  4. +
  5. Clé publique ou tout autre identifiant global unique.
  6. +
  7. Si les serveurs de l'opérateur sont compromis.
  8. +
  9. Si les réseaux P2P et les réseaux basés sur les crypto-monnaies sont distribués, ils ne sont pas décentralisés : ils fonctionnent comme un seul réseau, avec un seul espace de noms des adresses des utilisateurs.
  10. +
  11. Les réseaux P2P ont soit une autorité centrale, soit l'ensemble du réseau peut être compromis - voir la section suivante.
  12. +
+

Comparaison avec les protocoles de messagerie P2P

+

Il existe plusieurs protocoles et implémentations de chat/messagerie P2P qui visent à résoudre le problème de la protection de la vie privée et de la centralisation, mais ils ont leur propre série de problèmes qui les rendent moins fiables que la forme proposée, plus complexes à mettre en œuvre et à analyser et plus vulnérables aux attaques.

+
    +
  1. +

    Les réseaux P2P utilisent une variante de DHT pour acheminer les messages/demandes à travers le réseau. Les implémentations du DHT ont des designs complexes qui doivent équilibrer la fiabilité, la garantie de livraison et la latence. La méthode proposée offre à la fois de meilleures garanties de livraison et une latence plus faible (le message est transmis plusieurs fois en parallèle, à travers un nœud à chaque fois, en utilisant des serveurs choisis par le destinataire, alors que dans les réseaux P2P, le message est transmis à travers O(log N) nœuds séquentiellement, en utilisant des nœuds choisis par un algorithme).

    +
  2. +
  3. +

    Le modèle proposé, contrairement à la plupart des réseaux P2P, ne comporte aucun identifiant global d'utilisateur, même temporaire.

    +
  4. +
  5. +

    Le P2P en lui-même ne résout pas le problème des attaques MITM, et la plupart des solutions existantes n'utilisent pas de messages hors bande pour l'échange initial de clés. La conception proposée utilise des messages hors bande ou, dans certains cas, des connexions sécurisées et fiables préexistantes pour l'échange initial de clés.

    +
  6. +
  7. +

    Les implémentations P2P peuvent être bloquées par certains fournisseurs d'accès à Internet (comme BitTorrent). Le modèle proposée est indépendant des moyens de transport : il peut fonctionner avec des protocoles web standard et les serveurs peuvent être déployés sur les mêmes domaines que les sites web.

    +
  8. +
  9. +

    Tous les réseaux P2P connus sont susceptibles d'être vulnérables à une attaque Sybil, car chaque nœud peut être découvert et le réseau fonctionne comme un tout. Les mesures connues pour réduire la probabilité de l'attaque Sybil nécessitent soit un composant centralisé, soit des preuves de travail coûteuses. Le modèle proposée, au contraire, ne permet pas de découvrir les serveurs - les serveurs ne sont pas connectés, ni connus les uns des autres, ni de tous les clients. Le réseau SimpleX est fragmenté et fonctionne comme de multiples connexions isolées. Cela rend impossible les attaques à l'échelle du réseau SimpleX - même si certains serveurs sont compromis, d'autres parties du réseau peuvent fonctionner normalement, et les clients affectés peuvent passer à l'utilisation d'autres serveurs sans perdre de contacts ou de messages.

    +
  10. +
  11. +

    Les réseaux P2P sont susceptibles d'être vulnérables aux attaques DRDoS. Dans la conception proposée, les clients ne relaient que le trafic provenant de connexions de confiance connues et ne peuvent pas être utilisés pour refléter et amplifier le trafic dans l'ensemble du réseau.

    +
  12. +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/translations.html b/docs/lang/fr/translations.html new file mode 100644 index 0000000000..9d103ae46a --- /dev/null +++ b/docs/lang/fr/translations.html @@ -0,0 +1,1083 @@ + + + + + + + + + Contribuer aux traductions de SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 19.03.2023 | FR, EN, CZ, PL |

+

Contribuer aux traductions de SimpleX Chat

+

Un grand merci pour votre intérêt pour la traduction de SimpleX Chat - cela nous aide beaucoup à rendre l'application accessible à un plus grand nombre d'utilisateurs, et nous vous remercions de votre aide.

+

Cela demande un investissement en temps considérable - la plupart des gens le sous-estiment au départ - et une maintenance continue au fur et à mesure que nous développons l'application.

+

Ce document est créé pour accélérer ce processus, et partager quelques astuces importantes que nous avons découverts en travaillant avec Weblate - la plateforme que nous utilisons pour les traductions d'interface.

+

Avant de commencer la traduction

+
    +
  1. +

    Créez un compte sur Weblate, en utilisant le même e-mail que celui que vous utilisez sur GitHub - cela permettra d'associer vos contributions à votre compte GitHub, et pourra vous aider dans certains cas. Une fois la traduction publiée pour les utilisateurs, nous ajouterons le nom de votre compte à la liste des traducteurs.

    +
  2. +
  3. +

    Avant de commencer la traduction, il y a un simple accord de licence pour les contributeurs à signer via Weblate - ceci afin d'éviter tout conflit autour des droits de propriété intellectuelle. La copie de cet accord est également disponible ici.

    +
  4. +
  5. +

    Nous pouvons également vous ajouter au groupe de traducteurs pour toute question et mise à jour - veuillez vous connecter à moi via le chat.

    +
  6. +
+

Avancement de la traduction

+
    +
  1. +

    Veuillez commencer par l'app Android, à la fois lorsque vous effectuez la traduction initiale la plus longue, et que vous ajoutez les chaînes de caractères plus tard. Premièrement, les chaînes iOS peuvent être un peu retardées dans leur apparition dans Weblate, car elles nécessitent une étape manuelle de notre part avant d'être visibles. Deuxièmement, l'application Android est configurée comme un glossaire pour l'application iOS, et 2/3 de toutes les chaînes ne nécessitent que quelques clics pour les transférer d'Android à iOS (cela prend toujours un certain temps, Weblate ne l'automatise pas, malheureusement).

    +
  2. +
  3. +

    Certaines des chaînes n'ont pas besoin d'être traduites, mais elles doivent quand même être copiées - il y a un bouton dans l'interface weblate pour cela :

    +
  4. +
+weblate: copy source to translation +
    +
  1. +

    Weblate propose également des suggestions automatiques qui peuvent accélérer le processus. Parfois, elles peuvent être utilisées telles quelles, parfois elles nécessitent quelques retouches - cliquez pour les utiliser dans les traductions.

    +
  2. +
  3. +

    Une fois que toutes les chaînes de caractères de l'application Android sont traduites, veuillez les réviser pour vous assurer de la cohérence du style et de la langue, afin que les mêmes mots soient systématiquement utilisés pour des actions similaires de l'utilisateur, comme en anglais. Parfois, vous devrez utiliser des mots différents dans des cas où l'anglais n'en a qu'un seul. Veuillez essayer d'utiliser ces choix de manière cohérente dans des contextes similaires, afin de faciliter la tâche des utilisateurs finaux.

    +
  4. +
  5. +

    Quand vous traduisez l'app iOS, la plupart des chaînes de caractères sont identiques, elles peuvent être copiées en un clic dans la section Glossaire. L'indice visuel que cela est possible est que la chaîne source entière est surlignée en jaune. De nombreuses autres chaînes sont très similaires, elles ne diffèrent que par la syntaxe d'interpolation ou la façon dont la police en gras est utilisée - elles ne nécessitent qu'une édition minimale. Certaines chaînes sont propres à la plate-forme iOS. Elles doivent être traduites séparément.

    +
  6. +
+weblate: automatic suggestions +

Une fois la traduction terminée

+

Une fois que les applications Android et iOS sont traduites, veuillez nous en informer.

+

Nous allons ensuite :

+
    +
  • revoir toutes les traductions et suggérer des corrections - cela prend aussi un peu de temps :)
  • +
  • les fusionner avec le code source - pendant que nous le ferons, weblate sera verrouillé pour les changements.
  • +
  • créer des versions bêta des applications iOS et Android - nous pouvons également vous ajouter aux groupes de testeurs internes, afin que vous puissiez installer les applications avant tout le monde.
  • +
  • diffuser l'application auprès de nos utilisateurs bêta - ce sont plus d'un millier de personnes qui utilisent nos versions bêta.
  • +
  • publier l'application et inclure la nouvelle langue dans l'annonce.
  • +
+

Remarque : nous souhaitons que les fonctions de l'application restent cohérentes entre les plateformes Android et iOS, dans la mesure du possible. Nous publierons et annoncerons donc une nouvelle langue une fois que les deux plateformes auront été traduites. Cela ne signifie pas que vous devez le faire, mais nous devrons attendre que quelqu'un d'autre traduise la deuxième plateforme. Mais si vous commencez par Android, l'ajout d'iOS prend généralement 3 à 4 fois moins de temps.

+

La suite

+
    +
  1. +

    Lorsque nous mettons l'application à jour, nous publions les mises à jour dans le groupe de traducteurs. Vous n'avez absolument aucune obligation de traduire ces chaînes supplémentaires. Nous apprécions énormément que vous le fassiez, car l'expérience des utilisateurs est bien meilleure, ils dépendent de vos traductions, si une nouvelle partie de l'application n'est pas traduite.

    +
  2. +
  3. +

    Vous pouvez également aider à promouvoir l'application dans votre pays / groupe linguistique en traduisant nos documents - nous venons de commencer - ainsi que le contenu de notre site web. Il y a eu beaucoup de demandes pour le faire et nous sommes en train d'ajouter le cadre de traduction pour le site web.

    +
  4. +
  5. +

    De plus, si vous souhaitez être modérateur/administrateur du groupe d'utilisateurs dans votre langue, une fois l'application traduite, nous pourrons héberger un tel groupe. Nous sommes en train de préparer des règles de conduite pour la communauté et d'ajouter des outils de modération à l'application qui sortira dans la v5 en mars.

    +
  6. +
+

Encore une fois un grand merci de nous aider à développer SimpleX Chat !

+

Evgeny, fondateur de SimpleX Chat.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/fr/webrtc.html b/docs/lang/fr/webrtc.html new file mode 100644 index 0000000000..75337f0883 --- /dev/null +++ b/docs/lang/fr/webrtc.html @@ -0,0 +1,1162 @@ + + + + + + + + + Utilisation de serveurs WebRTC ICE personnalisés dans SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 31.01.2023 | FR, EN, CZ, PL |

+

Utilisation de serveurs WebRTC ICE personnalisés dans SimpleX Chat

+

Déployer un serveur STUN/TURN

+

Pour ce guide, nous utiliserons l'implémentation de serveur STUN/TURN la plus complète et la plus testée - coturn et la distribution Linux Ubuntu 20.04 LTS.

+
    +
  1. +

    Obtenez les certificats stun.$VOTRE_DOMAINE et turn.$VOTRE_DOMAINE.

    +

    Nous utilisons Let's Encrypt.

    +
  2. +
  3. +

    Installez le package coturn depuis le dépôt principal.

    +
  4. +
+
apt update && apt install coturn`
+
+
    +
  1. Décommentez TURNSERVER_ENABLED=1 de /etc/default/coturn :
  2. +
+
sed -i '/TURN/s/^#//g' /etc/default/coturn
+
+
    +
  1. +

    Configurez coturn dans /etc/turnserver.conf :

    +

    Veuillez également consulter les commentaires relatifs pour chacune des options.

    +
  2. +
+
# tls sur le port 443
+alt-tls-listening-port=443
+# Utiliser les empreintes dans les messages TURN
+fingerprint
+# Utiliser le mécanisme d'identification à long terme
+lt-cred-mech
+# Vos informations d'identification
+user=$VOTRE_LOGIN:$VOTRE_MOT_DE_PASSE
+# Le domaine de votre serveur
+server-name=$VOTRE_DOMAINE
+# Le domaine par défaut à utiliser pour les utilisateurs lorsqu'aucune relation explicite origine/domaine n'a été trouvée
+realm=$VOTRE_DOMAINE
+# Chemin vers vos certificats. Assurez-vous qu'ils sont lisibles par l'utilisateur/groupe du processus cotun
+cert=/var/lib/turn/cert.pem
+pkey=/var/lib/turn/key.pem
+# Utiliser la clé DH TLS prédéfinie de 2066 bits
+dh2066
+# Log sur journalctl
+syslog
+# Utilisateur/groupe qui exécutera le service coturn
+proc-user=turnserver
+proc-group=turnserver
+# Désactiver le chiffrement faible
+no-tlsv1
+no-tlsv1_1
+no-tlsv1_2
+
+
    +
  1. Démarrez et activez le service coturn :
  2. +
+
systemctl enable coturn && systemctl start coturn
+
+
    +
  1. Optionnellement, si vous utilisez le pare-feu ufw, ouvrez les ports appropriés :
  2. +
+
    +
  • 3478 – "simple" TURN/STUN;
  • +
  • 5349 – TURN/STUN over TLS;
  • +
  • 443 – TURN/STUN over TLS, qui peuvent contourner les pare-feu;
  • +
  • 49152:65535 – plage de ports que Coturn utilisera par défaut pour le relais TURN.
  • +
+
# Pour Ubuntu
+sudo ufw allow 3478 && \
+sudo ufw allow 443 && \
+sudo ufw allow 5349 && \
+sudo ufw allow 49152:65535/tcp && \
+sudo ufw allow 49152:65535/udp
+
+# Pour Fedora
+sudo firewall-cmd --permanent --add-port=443/tcp && \
+sudo firewall-cmd --permanent --add-port=443/udp && \
+sudo firewall-cmd --permanent --add-port=5349/tcp && \
+sudo firewall-cmd --permanent --add-port=5349/udp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/tcp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/udp && \
+sudo firewall-cmd --reload
+
+

Configurer l'app mobile

+

Pour configurer votre application mobile afin d'utiliser votre serveur :

+
    +
  1. +

    Ouvrez Paramètres / Réseau & Serveurs / Serveurs WebRTC ICE et activez la case Configurer les serveurs ICE.

    +
  2. +
  3. +

    Entrez toutes les adresses des serveurs dans le champ, une par ligne, par exemple si vos serveurs sont sur le port 5349 :

    +
  4. +
+
stun:stun.example.com:5349
+turn:username:password@turn.example.com:5349
+
+

Voilà, vous pouvez désormais passer des appels audio et vidéo via votre propre serveur, sans partager aucune donnée avec nos serveurs (autre que l'échange de clés avec votre contact dans les messages cryptés E2E).

+

Dépannage

+
    +
  • +

    Déterminer si un serveur est disponible :

    +

    Exécutez cette commande dans votre terminal :

    +
    ping <votre_ip_ou_domaine>
    +
    +

    Si des paquets sont transmis, le serveur est opérationnel !

    +
  • +
  • +

    Déterminez si les ports sont ouverts :

    +

    Exécutez cette commande dans votre terminal :

    +
    nc -zvw10 <votre_ip_ou_domaine> 443 5349
    +
    +

    Vous devriez voir :

    +
    Connection to <votre_ip_ou_domaine> 443 port [tcp/https] succeeded!
    +Connection to <votre_ip_ou_domaine> 5349 port [tcp/*] succeeded!
    +
    +
  • +
  • +

    Testez la connectivité STUN/TURN :

    +
      +
    1. +

      Allez sur IceTest.

      +
    2. +
    3. +

      Dans la section Build up ICE Server List, ajoutez :

      + +
        +
      • STUN: stun:<votre_ip_ou_domaine>:<port> et appuyez sur Add STUN
      • +
      • TURN: turn:<votre_ip_ou_domaine>:<port>, Username: <votre_login>, Credential: <votre_pass> et appuyez sur Add TURN
      • +
      +

      <port> est 443 ou 5349.

      +
    4. +
    5. +

      Vous devriez voir vos serveurs dans la section ICE server list. Si tout est correctement configuré, cliquez sur Start test :

      + +
    6. +
    7. +

      Dans la section Results, vous devriez obtenir quelque chose comme ceci :

      + +

      Si les résultats montrent des candidats srflx et relay, tout est correctement configuré !

      +
    8. +
    +
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/android.html b/docs/lang/pl/android.html new file mode 100644 index 0000000000..9f30ebb4e2 --- /dev/null +++ b/docs/lang/pl/android.html @@ -0,0 +1,1060 @@ + + + + + + + + + Dostęp do plików w aplikacji Androidowej + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 07.02.2023 | PL, EN, CZ, FR |

+

Dostęp do plików w aplikacji Androidowej

+

SimpleX wykorzystuje bazy danych i przechowuje ustawienia w prywatnym katalogu w systemie Android. Katalog ten zawiera:

+
    +
  • bazy danych
  • +
  • wysłane i odebrane pliki
  • +
  • pliki tymczasowe, które zostaną usunięte, gdy nie są już potrzebne
  • +
  • ustawienia użytkownika.
  • +
+

Jeśli chcesz zobaczyć, co jest przechowywane w katalogu SimpleX, musisz mieć:

+
    +
  • System operacyjny oparty na systemie Unix (lub MinGW na Windowsie)
  • +
  • narzędzie ADB (Android Debug Bridge) zainstalowane na komputerze (pobierz je tutaj i zainstaluj)
  • +
  • urządzenie podłączone przez USB lub Wi-Fi do komputera.
  • +
+

Proces:

+
    +
  • otwórz SimpleX, przejdź do Hasło do bazy danych i eksport, włącz Kopia zapasowa danych aplikacji. To sprawi, że następne kroki będą działać.
  • +
  • opcjonalnie: jeśli chcesz wyświetlić zawartość bazy danych, zmień hasło bazy danych z losowego na swoje. Aby to zrobić, zatrzymaj czat na ekranie Hasło do bazy danych i eksport, otwórz Hasło do bazy danych, wprowadź nowe hasło i potwierdź je, a następnie zatwierdź. Nie zapomnij go, w przeciwnym razie utracisz wszystkie dane w przypadku, gdy zostaniesz ponownie poproszony o hasło.
  • +
  • otwórz emulator terminala (Windows CMD/Powershell nie zadziała) i zmień katalog na ten, którego chcesz użyć do przechowywania kopii zapasowej:
  • +
+
cd /tmp  # to tylko przykład
+
+

Następne uruchom:

+
adb -d backup -f chat.ab -noapk chat.simplex.app && 
+tail -n +5 chat.ab > chat.dat && 
+printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - chat.dat > chat.gz && 
+tar -xvzf chat.gz
+
+

Teraz odblokuj urządzenie i potwierdź operację tworzenia kopii zapasowej bez użycia hasła do szyfrowania, w przeciwnym razie polecenia nie będą działać.

+

Po tym kopia zapasowa powinna zostać zrobiona. Jeśli pojawi się błąd tar: Error is not recoverable: exiting now, ale wcześniej pojawiło się kilka nazw plików, nie martw się, wszystko jest w porządku.

+

Teraz zapisane pliki będą w ./apps/chat.simplex.app/.

+

Pamiętaj, że jeśli korzystasz z nowej wersji SimpleX, bazy danych będą zaszyfrowane i nie będziesz w stanie przeglądać ich zawartości bez użycia aplikacji sqlcipher oraz gdy nie znasz hasła deszyfrującego (musisz najpierw zmienić je na swoje z losowo wygenerowanego w aplikacji).

+

Odszyfrowywanie baz danych

+

Aby wyświetlić dane bazy danych, należy je najpierw odszyfrować. Zainstaluj sqlcipher używając ulubionego menedżera pakietów i uruchom następujące polecenia w katalogu z bazami danych:

+
sqlcipher files_chat.db
+pragma key="youDecryptionPassphrase";
+# Upewnij się, że to działa
+select * from users;
+
+

Jeśli zobaczysz Parse error: no such table: users, upewnij się, że wprowadzono prawidłowe hasło i zostało ono zmienione z losowego w aplikacji na Androida (jeśli oczywiście pobrano tę bazę danych z urządzenia z Androidem).

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/cli.html b/docs/lang/pl/cli.html new file mode 100644 index 0000000000..2963dfa904 --- /dev/null +++ b/docs/lang/pl/cli.html @@ -0,0 +1,1189 @@ + + + + + + + + + Aplikacja konsolowa + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 31.01.2023 | Języki: PL, EN, FR, CZ |

+

Terminalowa (konsolowa) aplikacja SimpleX Chat dla systemów Linux/MacOS/Windows

+

Spis treści

+ +

Funkcje czatu w terminalu

+
    +
  • Konwersacje 1 na 1 z wieloma osobami w tym samym oknie terminala.
  • +
  • Wiadomości grupowe.
  • +
  • Wysyłanie plików do kontaktów i grup.
  • +
  • Adresy kontaktowe użytkowników - nawiązywanie połączeń za pomocą linków kontaktowych wielokrotnego użytku.
  • +
  • Wiadomości przechowywane w lokalnej bazie danych SQLite.
  • +
  • Automatycznie wypełniana nazwa odbiorcy - po nawiązaniu połączenia wystarczy po prostu napisać wiadomość, aby odpowiedzieć nadawcy.
  • +
  • Dostępne wstępnie skonfigurowane przykładowe serwery SMP - można też użyć własnego serwera.
  • +
  • Żadna globalna tożsamość ani nazwy użytkowników nie są widoczne dla serwera (serwerów), co zapewnia pełną prywatność kontaktów i rozmów.
  • +
  • Dwie warstwy szyfrowania E2E (double-ratchet dla połączeń dwukierunkowych, przy użyciu negocjacji klucza X3DH z efemerycznymi kluczami Curve448 i NaCl crypto_box dla kolejek SMP, przy użyciu kluczy Curve25519) oraz przekazywanie kluczy odbiorców za pomocą komunikacji out-of-band (zobacz Jak używać czatu SimpleX).
  • +
  • Weryfikacja integralności wiadomości (poprzez uwzględnienie hashu poprzedniej wiadomości).
  • +
  • Uwierzytelnianie każdego polecenia/wiadomości przez serwery SMP za pomocą automatycznie generowanych kluczy Ed448.
  • +
  • Szyfrowanie transmisji przy użyciu TLS 1.3.
  • +
  • Dodatkowe szyfrowanie wiadomości z serwera SMP do odbiorcy aby utrudnić możliwość korelacji ruchu.
  • +
+

Klucze publiczne biorące udział podczas wymiany kluczy nie są używane jako tożsamość, są one generowane losowo dla każdego kontaktu.

+

Aby uzyskać szczegółowe informacje techniczne zobacz używane metody szyfrowania.

+

+

🚀 Instalacja

+

Pobieranie klienta czatu

+

Linux i MacOS

+

By zainstalować lub zaktualizować simplex-chat, należy uruchomić skrypt instalacyjny. Aby to zrobić, użyj następującego polecenia cURL lub Wget:

+
curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+
wget -qO- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | bash
+
+

Po pobraniu klienta czatu można go uruchomić za pomocą polecenia simplex-chat.

+

Możesz również ręcznie pobrać plik binarny czatu dla swojego systemu z najnowszej stabilnej wersji i uczynić go uruchamialnym w sposób pokazany poniżej.

+
chmod +x <binary>
+mv <binary> ~/.local/bin/simplex-chat
+
+

(lub użyj innej preferowanej lokalizacji w PATH).

+

Na MacOS musisz również zezwolić Gatekeeperowi, by go uruchomić.

+

Windows

+
move <binary> %APPDATA%/local/bin/simplex-chat.exe
+
+

Budowanie z kodu źródłowego

+
+

Uwaga: aby zbudować aplikację użyj wersji stabilnej.

+
+

Używając Dockera

+

Na Linuxie, aby zbudować plik wykonywalny możesz użyć docker build z customowym outputem:

+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+DOCKER_BUILDKIT=1 docker build --output ~/.local/bin .
+
+
+

Uwaga: Jeśli napotkasz błąd version `GLIBC_2.28' not found, przebuduj go z obrazem bazowym haskell:8.10.7-stretch (zmień go w Twoim lokalnym pliku Dockerfile).

+
+

Używając Haskella na dowolnym systemie operacyjnym

+
    +
  1. Zainstaluj Haskell GHCup, GHC 9.6.3 i cabal 3.10.1.0:
  2. +
+
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
+
+

Możesz użyć polecenia ghcup tui, aby sprawdzić lub dodać wersje GHC i cabal.

+
    +
  1. Sklonuj kod źródłowy:
  2. +
+
git clone git@github.com:simplex-chat/simplex-chat.git
+cd simplex-chat
+git checkout stable
+# lub aby zbudować konkretną wersję:
+# git checkout v5.3.0-beta.8
+
+

master to branch deweloperski, może on zawierać niestabilny kod.

+
    +
  1. Przygotowywanie systemu:
  2. +
+

Na Linuxie:

+
apt-get update && apt-get install -y build-essential libgmp3-dev zlib1g-dev
+cp scripts/cabal.project.local.linux cabal.project.local
+
+

Na Macu:

+
brew install openssl@3.0
+cp scripts/cabal.project.local.mac cabal.project.local
+
+

Może być konieczna zmiana cabal.project.local, aby wskazać poprawną lokalizację openssl

+
    +
  1. Budowanie aplikacji:
  2. +
+
cabal update
+cabal install simplex-chat
+
+

Używanie

+

Używanie klienta czatu

+

Aby uruchomić klienta, uruchom w terminalu polecenie simplex-chat.

+

Domyślnie katalog z danymi aplikacji jest tworzony w katalogu domowym (~/.simplex, lub %APPDATA%/simplex na Windowsie), a dwa pliki danych SQLite simplex_v1_chat.db i simplex_v1_agent.db są w nim zainicjowane.

+

Aby wskazać inny prefiks ścieżki dla plików bazy danych, należy użyć polecenia -d:

+
$ simplex-chat -d alice
+
+

Uruchomienie powyższego przykładu spowoduje utworzenie plików baz danych alice_v1_chat.db i alice_v1_agent.db w bieżącym katalogu.

+

Trzy domyślne serwery SMP są hostowane na Linode - są one wstępnie skonfigurowane w aplikacji.

+

Jeśli posiadasz własny serwer(y) SMP, możesz skonfigurować klienta poprzez opcję -s:

+
$ simplex-chat -s smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@smp.example.com
+
+

Ciąg zakodowany w Base64url poprzedzający adres serwera to odcisk palca certyfikatu offline serwera, który jest weryfikowany przez klienta podczas handshake'a TLS.

+

Po konfiguracji innego serwera w swoim kliencie nadal możesz rozmawiać z ludźmi używającymi domyślnego lub dowolnego innego serwera - ustawienie to wpływa tylko na lokalizację kolejki wiadomości podczas nawiązywania połączenia (a kolejka odpowiedzi może znajdować się na zupełnie innym serwerze, zgodnie z ustawieniami klienta rozmówcy).

+

Polecenie simplex-chat -h pokazuje wszystkie dostępne opcje.

+

Dostęp do serwerów wiadomości przez Tor

+

Zainstaluj Tor i uruchom go jako proxy SOCKS5 na porcie 9050, przykład dla MacOS:

+
brew install tor
+brew services start tor
+
+

Użyj opcji -x, aby uzyskać dostęp do serwerów przez Tor:

+
simplex-chat -x
+
+

Możesz także użyć opcji --socks-proxy=ipv4:port lub --socks-proxy=:port, aby skonfigurować adres i port serwera proxy SOCKS5, przykładowo jeśli uruchamiasz go na innym hoście lub porcie.

+

Jak używać czatu SimpleX

+

Po uruchomieniu czatu zostaniesz poproszony o podanie swojej "nazwy wyświetlanej" oraz opcjonalnej "pełnej nazwy" w celu utworzenia lokalnego profilu czatu. Nazwa wyświetlana jest aliasem, za pomocą którego kontakty mogą się do ciebie odnosić - nie jest ona unikalna i nie służy jako globalna tożsamość. Jeśli kilka kontaktów wybrało tę samą nazwę wyświetlaną, klient czatu dodaje numeryczną końcówkę (sufiks) do ich lokalnej nazwy wyświetlanej.

+

Poniższy schemat przedstawia sposób łączenia się z kontaktem i wysyłania do niego wiadomości:

+
+ +
+

Gdy już skonfigurujesz swój profil lokalny, wpisz /c (oznaczające /connect), aby utworzyć nowe połączenie i wygenerować zaproszenie. Wyślij to zaproszenie do swojego kontaktu za pośrednictwem dowolnego innego kanału komunikacji.

+

Możesz utworzyć wiele zaproszeń, kilkukrotnie wpisując /connect i wysłać te zaproszenia do kontaktów, z którymi chcesz się połączyć.

+

Zaproszenie może być użyte tylko jeden raz i nawet jeśli zostanie ono przechwycone, atakujący nie będzie mógł go użyć do wysłania do Ciebie wiadomości za pośrednictwem tej kolejki, gdy Twój kontakt potwierdzi, że połączenie zostało nawiązane. Zobacz omówienie protokołu agenta dla formatu zaproszeń.

+

Kontakt, który otrzymał zaproszenie powinien wpisać /c <zaproszenie>, aby zaakceptować połączenie. Spowoduje to nawiązanie połączenia, a obie strony zostaną o tym powiadomione.

+

Następnie można użyć komendy @<nazwa_kontaktu> <wiadomość> do wysłania wiadomości. Możesz także po prostu zacząć pisać wiadomość, aby wysłać ją do kontaktu, który był ostatni.

+

Użyj /help na czacie, by uzyskać listę pozostałych dostępnych komend.

+

Grupy

+

Aby utworzyć grupę, użyj /g <nazwa_grupy>, a następnie dodaj do niej kontakty za pomocą /a <nazwa_grupy> <nazwa_kontaktu>. Możesz wysyłać wiadomości do grupy wpisując #<nazwa_grupy> <wiadomość>. Użyj /help groups, by uzyskać listę pozostałych dostępnych komend.

+

simplex-chat

+
+

Uwaga: informacje o grupach nie są przechowywane na żadnym serwerze, są one zapisywane jako lista członków w bazie danych aplikacji klientów, do których będą wysyłane wiadomości.

+
+

Wysyłanie plików

+

Możesz wysłać plik do kontaktu za pomocą /f @<nazwa_kontaktu> <ścieżka_do_pliku> - odbiorca będzie musiał go zaakceptować przed rozpoczęciem wysyłania. Użyj /help files, by uzyskać listę pozostałych dostępnych komend.

+

simplex-chat

+

Możesz wysyłać pliki do grupy za pomocą /f #<nazwa_grupy> <ścieżka_do_pliku>.

+

Adresy kontaktowe użytkowników

+

Alternatywą dla jednorazowych linków zapraszających są adresy długoterminowe. Możesz je utworzyć za pomocą /ad (oznaczające /address). Utworzony adres może być następnie udostępniony za pośrednictwem dowolnego innego kanału komunikacji i użyty przez innych użytkowników jako link do prośby o kontakt używając /c <adres_kontaktowy_użytkownika>.

+

Prośby o kontakt możesz przyjąć za pomocą komendy /ac <nazwa> oraz odrzucić za pomocą /rc <nazwa>.

+

"Długoterminowy" adres użytkownika jest długoterminowy w tym sensie, że jest to link wielokrotnego użytku - może być używany do momentu usunięcia go przez użytkownika. Po usunięciu wszystkie nawiązane połączenia pozostaną aktywne (w przeciwieństwie do tego, jak działa to w przypadku poczty e-mail, gdy zmiana adresu powoduje, że ludzie nie mogą już wysyłać do siebie wiadomości).

+

Użyj /help address, by uzyskać listę pozostałych dostępnych komend.

+

simplex-chat

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/contributing.html b/docs/lang/pl/contributing.html new file mode 100644 index 0000000000..257235661c --- /dev/null +++ b/docs/lang/pl/contributing.html @@ -0,0 +1,1145 @@ + + + + + + + + + Poradnik wspierania projektu + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 31.01.2023 | Języki: PL, EN FR, CZ |

+

Poradnik wspierania projektu

+

Kompilacja z włączonym szyfrowaniem SQLCipher

+

Dodaj cabal.project.local do katalogu głównego projektu z lokalizacją nagłówków i bibliotek OpenSSL oraz flagą ustawiającą tryb szyfrowania:

+
cp scripts/cabal.project.local.mac cabal.project.local
+# lub
+# cp scripts/cabal.project.local.linux cabal.project.local
+
+

OpenSSL na MacOS

+

MacOS ma domyślnie zainstalowany LibreSSL, OpenSSL musi być zainstalowany, aby skompilować SimpleX z kodu źródłowego.

+

OpenSSL można zainstalować za pomocą brew install openssl@3.0

+

Będziesz musiał dodać /opt/homebrew/opt/openssl@3.0/bin do swojego PATH, aby wszystko działało poprawnie

+

Branche projektu

+

W repo simplex-chat

+
    +
  • +

    stable - stabilne wydanie aplikacji, może być używane do aktualizacji poprzedniego stabilnego wydania (GHC 9.6.3).

    +
  • +
  • +

    stable-android - używane do budowania stabilnej biblioteki rdzenia Androida z Nix (GHC 8.10.7) - tylko dla Androida armv7a.

    +
  • +
  • +

    stable-ios - używane do budowania stabilnej biblioteki rdzenia iOS z Nix (GHC 8.10.7) - ten branch powinien być taki sam jak stable-android z wyjątkiem plików konfiguracyjnych Nix. Przestarzałe.

    +
  • +
  • +

    master - branch dla wydań wersji beta (GHC 9.6.3).

    +
  • +
  • +

    master-ghc8107 - branch dla wydań wersji beta (GHC 8.10.7). Przestarzałe.

    +
  • +
  • +

    master-android - używane do budowania biblioteki rdzenia Androida w wersji beta z Nix (GHC 8.10.7) - tylko dla Androida armv7a.

    +
  • +
  • +

    master-ios - służy do budowania biblioteki rdzenia beta iOS z Nix (GHC 8.10.7). Przestarzałe.

    +
  • +
  • +

    windows-ghc8107 - branch do kompilacji głównej biblioteki Windows (GHC 8.10.7). Przestarzałe?

    +
  • +
+

Branche master-ios i windows-ghc8107 powinny być takie same jak master-ghc8107 z wyjątkiem plików konfiguracyjnych Nix.

+

W repo simplexmq

+
    +
  • +

    master - używa GHC 9.6.3, jego commit powinien być użyty w branchu master repo simplex-chat.

    +
  • +
  • +

    master-ghc8107 - jego commit powinien być użyty w branchu master-android (i master-ios) repo simplex-chat. Przestarzałe.

    +
  • +
+

Development i proces wydawania

+
    +
  1. +

    Tworzenie PR-ów do brancha master tylko dla repozytoriów simplex-chat i simplexmq.

    +
  2. +
  3. +

    Jeśli repozytorium simplexmq zostało zmienione, aby skompilować mobilne biblioteki rdzenia należy połączyć jego branch master z branchem master-ghc8107.

    +
  4. +
  5. +

    Aby skompilować podstawowe biblioteki dla Androida, iOS i Windows:

    +
  6. +
+
    +
  • +

    scal branch master z branchem master-android.

    +
  • +
  • +

    Zaktualizuj kod, aby był kompatybilny z GHC 8.10.7 (patrz niżej).

    +
  • +
  • +

    push do GitHuba.

    +
  • +
+
    +
  1. +

    Wszystkie biblioteki powinny być budowane z brancha master, Android armv7a - z brancha master-android.

    +
  2. +
  3. +

    Aby zbudować aplikacje Desktop i CLI, należy utworzyć tag w branchu master, pliki APK powinny być dołączone do wydania.

    +
  4. +
  5. +

    Po publicznym wydaniu w App Store i Play Store, scal:

    +
  6. +
+
    +
  • +

    master do stable

    +
  • +
  • +

    master do master-android (i skompiluj/zaktualizuj kod)

    +
  • +
  • +

    master-android do stable-android.

    +
  • +
+
    +
  1. Branch master repo simplexmq powinien zostać niezależnie scalony z branchem stable w wydaniach stabilnych.
  2. +
+

Różnice pomiędzy GHC 8.10.7 i GHC 9.6.3

+
    +
  1. Główna różnica związana jest z rozszerzeniem DuplicateRecordFields.
  2. +
+

W GHC 9.6.3 nie jest już możliwe określenie typu podczas korzystania z selektorów, zamiast tego używane jest rozszerzenie OverloadedRecordDot i składnia, które muszą zostać usunięte w GHC 8.10.7:

+
{-# LANGUAGE DuplicateRecordFields #-}
+-- Użyj tego w GHC 9.6.3, gdy jest to potrzebne
+{-# LANGUAGE OverloadedRecordDot #-}
+
+-- syntax GHC 9.6.3
+let x = record.field
+
+-- syntax GHC 8.10.7 usunięty w GHC 9.6.3
+let x = field (record :: Record)
+
+

Nadal możliwe jest określenie typu podczas korzystania ze składni aktualizacji rekordu, użyj tej reguły, aby wyłączyć ostrzeżenie kompilatora:

+
-- Użyj tego w GHC 9.6.3, gdy jest to potrzebne
+{-# OPTIONS_GHC -fno-warn-ambiguous-fields #-}
+
+let r' = (record :: Record) {field = value}
+
+
    +
  1. Większość funkcji monad musi być teraz importowana z Control.Monad, a nie z konkretnych modułów monad (np. Control.Monad.Except).
  2. +
+
-- Użyj tego w GHC 9.6.3, gdy jest to potrzebne
+import Control.Monad
+
+

Ten PR opisuje wszystkie różnice.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/server.html b/docs/lang/pl/server.html new file mode 100644 index 0000000000..69151a38a3 --- /dev/null +++ b/docs/lang/pl/server.html @@ -0,0 +1,1451 @@ + + + + + + + + + Hostowanie własnego serwera SMP + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 05.06.2023 | Języki: PL, EN, FR, CZ |

+

Hostowanie własnego serwera SMP

+

Informacje ogólne

+

Serwer SMP to serwer przekaźnikowy używany do przekazywania wiadomości w sieci SimpleX. Aplikacje SimpleX Chat mają wstępnie ustawione serwery (dla aplikacji mobilnych są to smp11, smp12 i smp14.simplex.im), ale można łatwo zmienić konfigurację aplikacji, aby korzystać z innych serwerów.

+

Klienty SimpleX określają tylko, który serwer jest używany do odbierania wiadomości, oddzielnie dla każdego kontaktu (lub połączenia grupowego z członkiem grupy), a serwery te są tylko tymczasowe, ponieważ adres dostawy może ulec zmianie.

+

Uwaga: gdy zmienisz serwery w ustawieniach aplikacji, wpłynie to tylko na to, który serwer będzie używany dla nowych kontaktów, istniejące kontakty nie zostaną automatycznie przeniesione na nowe serwery, ale możesz przenieść je ręcznie za pomocą przycisku "Zmień adres odbiorczy" na stronie z informacjami kontaktu/członka - wkrótce zostanie to zautomatyzowane.

+

Instalacja

+
    +
  1. +

    Najpierw zainstaluj smp-server:

    + +
  2. +
+

Instalacja ręczna wymaga kilku kroków wstępnych:

+
    +
  1. +

    Zainstaluj binarkę:

    +
      +
    • +

      Używając oficjalnych binarek:

      +
      curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/smp-server && chmod +x /usr/local/bin/smp-server
      +
      +
    • +
    • +

      Budowanie z kodu źródłowego:

      +

      Zobacz Build from source: Using your distribution

      +
    • +
    +
  2. +
  3. +

    Utwórz użytkownika i grupę dla smp-server:

    +
    sudo useradd -m smp
    +
    +
  4. +
  5. +

    Utwórz niezbędne katalogi i przypisz uprawnienia:

    +
    sudo mkdir -p /var/opt/simplex /etc/opt/simplex
    +sudo chown smp:smp /var/opt/simplex /etc/opt/simplex
    +
    +
  6. +
  7. +

    Zezwól na port smp-server w firewallu:

    +
    # Dla Ubuntu
    +sudo ufw allow 5223/tcp
    +# Dla Fedory
    +sudo firewall-cmd --permanent --add-port=5223/tcp && \
    +sudo firewall-cmd --reload
    +
    +
  8. +
  9. +

    Opcjonalnie - Jeśli używasz dystrybucji z systemd, utwórz plik /etc/systemd/system/smp-server.service z następującą zawartością:

    +
    [Unit]
    +Description=SMP server systemd service
    +
    +[Service]
    +User=smp
    +Group=smp
    +Type=simple
    +ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
    +ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
    +LimitNOFILE=65535
    +KillSignal=SIGINT
    +TimeoutStopSec=infinity
    +
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    I uruchom sudo systemctl daemon-reload.

    +
  10. +
+

Instalacja Tora

+

smp-server można również zainstalować jako serwer działający w sieci tor. Uruchom następujące polecenia jako użytkownik root.

+
    +
  1. +

    Zainstaluj Tor:

    +

    Zakładamy, że używasz dystrybucji opartych na Ubuntu/Debian. Jeśli nie, zapoznaj się z oficjalną dokumentacją tor lub poradnikiem dla Twojej dystrybucji.

    +
      +
    • +

      Skonfiguruj oficjalne repozytorium Tor PPA:

      +
      CODENAME="$(lsb_release -c | awk '{print $2}')"
      +echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main
      +deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list
      +
      +
    • +
    • +

      Zimportuj klucz repozytorium:

      +
      curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
      +
      +
    • +
    • +

      Zaktualizuj indeks repozytorium:

      +
      apt update
      +
      +
    • +
    • +

      Zainstaluj paczkę tor:

      +
      apt install -y tor deb.torproject.org-keyring
      +
      +
    • +
    +
  2. +
  3. +

    Skonfiguruj tor:

    +
      +
    • +

      Konfiguracja pliku:

      +

      Otwórz konfigurację tora w wybranym edytorze (nano,vim,emacs, itp.):

      +
      vim /etc/tor/torrc
      +
      +

      I umieść następujące linie na dole konfiguracji. Zwróć uwagę na linie zaczynające się od #: są to komentarze dotyczące poszczególnych opcji.

      +
      # Włącz logowanie (w przeciwnym razie tor nie wyda adresu onion).
      +Log notice file /var/log/tor/notices.log
      +# Włącz routowanie single hop (2 opcje poniżej są zależne od trzeciej). Zmniejszy to opóźnienie w zamian za anonimowość (jako że tor działa równolegle z serwerem smp i adres onion będzie wyświetlany w klientach, jest to całkowicie w porządku).
      +SOCKSPort 0
      +HiddenServiceNonAnonymousMode 1
      +HiddenServiceSingleHopMode 1
      +# Katalog hostów i mapowanie portów usługi ukrytej smp-server
      +HiddenServiceDir /var/lib/tor/simplex-smp/
      +HiddenServicePort 5223 localhost:5223
      +
      +
    • +
    • +

      Utwórz katalogi:

      +
      mkdir /var/lib/tor/simplex-smp/ && chown debian-tor:debian-tor /var/lib/tor/simplex-smp/ && chmod 700 /var/lib/tor/simplex-smp/
      +
      +
    • +
    +
  4. +
  5. +

    Uruchom tor:

    +

    Włącz usługę systemd oraz uruchom tor. Oficjalny tor jest nieco kłopotliwy przy pierwszym uruchomieniu i może nie utworzyć adresu hosta cebuli, więc na wszelki wypadek uruchamiamy go ponownie.

    +
    systemctl enable tor && systemctl start tor && systemctl restart tor
    +
    +
  6. +
  7. +

    Wyświetla onionowego hosta:

    +

    Wykonaj następujące polecenie, aby wyświetlić adres onionowego hosta:

    +
    cat /var/lib/tor/simplex-smp/hostname
    +
    +
  8. +
+

Configuration

+

Aby zobaczyć, jakie opcje są dostępne, wykonaj smp-server bez flag:

+
sudo su smp -c smp-server
+
+...
+Available commands:
+  init                     Initialize server - creates /etc/opt/simplex and
+                           /var/opt/simplex directories and configuration files
+  start                    Start server (configuration:
+                           /etc/opt/simplex/smp-server.ini)
+  delete                   Delete configuration and log files
+
+

Możesz uzyskać dalszą pomoc, wykonując polecenie sudo su smp -c "smp-server <command> -h"

+

Następnie musimy skonfigurować smp-server:

+

Interaktywnie

+

Wykonaj poniższe polecenie:

+
sudo su smp -c "smp-server init"
+
+

Istnieje kilka opcji, które należy rozważyć:

+
    +
  • +

    Enable store log to restore queues and messages on server restart (Yn):

    +

    Wpisz y, aby włączyć zapisywanie i przywracanie połączeń i wiadomości po ponownym uruchomieniu serwera.

    +

    Uwaga: ważne jest, aby użyć SIGINT do ponownego uruchomienia serwera, ponieważ w przeciwnym razie niedostarczone wiadomości nie zostaną przywrócone. Połączenia zostaną przywrócone niezależnie od sposobu ponownego uruchomienia serwera, ponieważ w przeciwieństwie do wiadomości są one dodawane do dziennika append-only.

    +
  • +
  • +

    Enable logging daily statistics (yN):

    +

    Wpisz y, aby włączyć logowanie statystyk w formacie CSV, mogą one być przykładowo użyte do pokazania wykresów użycia w Grafana.

    +
  • +
+

Statystyki te obejmują dzienną liczbę utworzonych, zabezpieczonych i usuniętych kolejek, wysłanych i odebranych wiadomości, a także dzienną, tygodniową i miesięczną liczbę aktywnych kolejek (tj. kolejek, które były używane do wysyłania wiadomości). Uważamy, że informacje te nie zawierają niczego, co pozwoliłoby na skorelowanie różnych kolejek jako należących bezpośrednio do użytkowników, ale prosimy o poufne poinformowanie nas, jeśli uważasz, że można to w jakikolwiek sposób nadużyć.

+
    +
  • +

    Require a password to create new messaging queues?

    +

    Wpisz r lub dowolne hasło, aby zabezpieczyć hasłem smp-server, lub n, aby wyłączyć ochronę hasłem.

    +
  • +
  • +

    Enter server FQDN or IP address for certificate (127.0.0.1):

    +

    Wprowadź domenę lub adres IP, na którym działa Twój smp-server - zostanie on zamieszczony w certyfikatach serwera, a także wyświetlony jako część adresu serwera.

    +
  • +
+

Za pomocą opcji wiersza poleceń

+

Wykonaj poniższe polecenie:

+
sudo su smp -c "smp-server init -h"
+
+...
+Available options:
+  -l,--store-log           Enable store log for persistence
+  -s,--daily-stats         Enable logging daily server statistics
+  -a,--sign-algorithm ALG  Signature algorithm used for TLS certificates:
+                           ED25519, ED448 (default: ED448)
+  --ip IP                  Server IP address, used as Common Name for TLS online
+                           certificate if FQDN is not supplied
+                           (default: "127.0.0.1")
+  -n,--fqdn FQDN           Server FQDN used as Common Name for TLS online
+                           certificate
+  --no-password            Allow creating new queues without password
+  --password PASSWORD      Set password to create new messaging queues
+  -y,--yes                 Non-interactive initialization using command-line
+                           options
+  -h,--help                Show this help text
+
+

Powinieneś określić, które flagi są potrzebne dla Twojego zastosowania, a następnie wykonać smp-server init z flagą -y dla nieinteraktywnej inicjalizacji:

+
sudo su smp -c "smp-server init -y -<your flag> <your option>"
+
+

Przykładowo, uruchom:

+
sudo su smp -c "smp-server init -y -l --ip 192.168.1.5 --password test"
+
+

aby zainicjować konfigurację smp-server z:

+
    +
  • przywracaniem połączeń i wiadomości po ponownym uruchomieniu serwera (flaga -l),
  • +
  • adresem IP 192.168.1.5,
  • +
  • zabezpieczeniem smp-server hasłem test.
  • +
+
+

Po tym instalacja jest ukończona i powinieneś zobaczyć coś takiego:

+
Certificate request self-signature ok
+subject=CN = 127.0.0.1
+Server initialized, you can modify configuration in /etc/opt/simplex/smp-server.ini.
+Run `smp-server start` to start server.
+----------
+You should store CA private key securely and delete it from the server.
+If server TLS credential is compromised this key can be used to sign a new one, keeping the same server identity and established connections.
+CA private key location: /etc/opt/simplex/ca.key
+----------
+SMP server v3.4.0
+Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+
+

Powyższy adres serwera powinien być użyty w konfiguracji klienta, a jeśli dodałeś hasło serwera, powinno ono być udostępnione innym osobom tylko wtedy, gdy chcesz zezwolić im na korzystanie z Twojego serwera do odbierania wiadomości (wszystkie Twoje kontakty będą mogły wysyłać wiadomości, ponieważ nie wymaga to hasła). Jeśli podałeś adres IP lub nazwę hosta podczas instalacji, zostanie to wyświetlone jako część adresu serwera, w przeciwnym razie zastąp <hostnames> rzeczywistymi adresami serwerów.

+

Dokumentacja

+

Wszystkie niezbędne pliki dla smp-server znajdują się w folderze /etc/opt/simplex/.

+

Przechowywane wiadomości, połączenia, statystyki i dziennik serwera znajdują się w folderze /var/opt/simplex/.

+

Adres serwera SMP

+

Adres serwera SMP ma następujący format:

+
smp://<odcisk_palca>[:<hasło>]@<publiczna_nazwa_hosta>[,<onionowa_nazwa_hosta>]
+
+
    +
  • +

    <odcisk_palca>

    +

    To odcisk palca certyfikatu Twojego smp-server. Odcisk palca certyfikatu możesz sprawdzić w /etc/opt/simplex/fingerprint.

    +
  • +
  • +

    opcjonalnie <hasło>

    +

    To ustawione przez Ciebie hasło Twojego smp-server. Możesz sprawdzić to hasło w pliku /etc/opt/simplex/smp-server.ini, w sekcji [AUTH] w polu create_password:.

    +
  • +
  • +

    <publiczna_nazwa_hosta>, optional <onionowa_nazwa_hosta>

    +

    To skonfigurowane przez Ciebie nazwy hosta Twojego smp-server. Nazwy hostów możesz sprawdzić w pliku /etc/opt/simplex/smp-server.ini, w sekcji [TRANSPORT] w polu host:.

    +
  • +
+

Komendy systemd

+

Aby uruchomić smp-server przy starcie hosta, uruchom:

+
sudo systemctl enable smp-server.service
+
+Created symlink /etc/systemd/system/multi-user.target.wants/smp-server.service → /etc/systemd/system/smp-server.service.
+
+

Aby uruchomić smp-server, uruchom:

+
sudo systemctl start smp-server.service
+
+

Aby sprawdzić status smp-server, uruchom:

+
sudo systemctl status smp-server.service
+
+● smp-server.service - SMP server
+     Loaded: loaded (/etc/systemd/system/smp-server.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sat 2022-11-23 19:23:21 UTC; 1min 48s ago
+   Main PID: 30878 (smp-server)
+     CGroup: /docker/5588ab759e80546b4296a7c50ffebbb1fb7b55b8401300e9201313b720989aa8/system.slice/smp-server.service
+             └─30878 smp-server start
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

Aby zatrzymać smp-server, uruchom:

+
sudo systemctl stop smp-server.service
+
+

Aby sprawdzić zawartość dziennika smp-server, uruchom:

+
sudo journalctl -fu smp-server.service
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

Monitorowanie

+

Możesz włączyć statystyki smp-server dla dashboardu Grafana ustawiając wartość on w /etc/opt/simplex/smp-server.ini, w sekcji [STORE_LOG] w polu log_stats:.

+

Logi będą przechowywane jako plik csv w /var/opt/simplex/smp-server-stats.daily.log. Pola dla pliku csv to:

+
fromTime,qCreated,qSecured,qDeleted,msgSent,msgRecv,dayMsgQueues,weekMsgQueues,monthMsgQueues
+
+
    +
  • +

    fromTime - timestamp; data i godzina zdarzenia

    +
  • +
  • +

    qCreated - int; utworzone kolejki

    +
  • +
  • +

    qSecured - int; ustanowione kolejki

    +
  • +
  • +

    qDeleted - int; usunięte queues

    +
  • +
  • +

    msgSent - int; wysłane wiadomości

    +
  • +
  • +

    msgRecv - int; odebrane wiadomości

    +
  • +
  • +

    dayMsgQueues - int; aktywnych kolejek podczas dnia

    +
  • +
  • +

    weekMsgQueues - int; aktywnych kolejek w tygodniu

    +
  • +
  • +

    monthMsgQueues - int; aktywnych kolejek w miesiącu

    +
  • +
+

Aby zaimportować csv do Grafana należy:

+
    +
  1. +

    Zainstalować wtyczkę Grafana: Grafana - CSV datasource

    +
  2. +
  3. +

    Zezwolić na tryb lokalny, dołączając następujące elementy:

    +
  4. +
+
[plugin.marcusolsson-csv-datasource]
+allow_local_mode = true
+
+

... do /etc/grafana/grafana.ini

+
    +
  1. Dodaj źródło danych CSV:
  2. +
+
    +
  • W menu bocznym kliknij zakładkę Configuration (ikona koła zębatego)
  • +
  • Kliknij Add data source (Dodaj źródło danych) w prawym górnym rogu zakładki Data Sources (Źródła danych).
  • +
  • Wpisz "CSV" w polu wyszukiwania, aby znaleźć źródło danych CSV.
  • +
  • Kliknij wynik wyszukiwania z napisem "CSV".
  • +
  • W polu URL wprowadź plik wskazujący na zawartość CSV.
  • +
+
    +
  1. Gotowe! Teraz możesz utworzyć własny pulpit nawigacyjny ze statystykami.
  2. +
+

Dalsza dokumentacja znajduje się na stronie: CSV Data Source for Grafana - Documentation.

+

Aktualizowanie twojego serwera SMP

+

Aby zaktualizować smp-server do najnowszej wersji, wybierz metodę instalacji i postępuj zgodnie z instrukcjami:

+
    +
  • +

    Manualnie

    +
      +
    1. Zatrzymaj serwer:
      sudo systemctl stop smp-server
      +
      +
    2. +
    3. Zaktualizuj binarkę:
       curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/smp-server && chmod +x /usr/local/bin/smp-server
      +
      +
    4. +
    5. Uruchom serwer:
      sudo systemctl start smp-server
      +
      +
    6. +
    +
  • +
  • +

    Używając oficjalnego skryptu instalacyjnego

    +
      +
    1. Uruchom:
      sudo simplex-servers-update
      +
      +
    2. +
    3. Gotowe!
    4. +
    +
  • +
  • +

    Używając kontenera Dockera

    +
      +
    1. Zatrzymaj i usuń kontener:
      docker rm $(docker stop $(docker ps -a -q --filter ancestor=simplexchat/smp-server --format="\{\{.ID\}\}"))
      +
      +
    2. +
    3. Pobierz najnowszą wersję kontenera:
      docker pull simplexchat/smp-server:latest
      +
      +
    4. +
    5. Uruchom nowy kontener:
      docker run -d \
      +  -p 5223:5223 \
      +  -v $HOME/simplex/smp/config:/etc/opt/simplex:z \
      +  -v $HOME/simplex/smp/logs:/var/opt/simplex:z \
      +  simplexchat/smp-server:latest
      +
      +
    6. +
    +
  • +
  • +

    Linode Marketplace

    +
      +
    1. Pobierz najnowsze obrazy:
      docker-compose --project-directory /etc/docker/compose/simplex pull
      +
      +
    2. +
    3. Zrestartuj kontenery:
      docker-compose --project-directory /etc/docker/compose/simplex up -d --remove-orphans
      +
      +
    4. +
    5. Usuń niepotrzebne obrazy:
      docker image prune
      +
      +
    6. +
    +
  • +
+

Konfigurowanie aplikacji do korzystania z serwera

+

Aby skonfigurować aplikację do korzystania z serwera wiadomości, skopiuj jego pełny adres, w tym hasło, i dodaj go do aplikacji. Możesz używać swojego serwera razem z predefiniowanymi serwerami lub bez nich - możesz je usunąć lub wyłączyć.

+

Możliwe jest również udostępnienie adresu swojego serwera znajomym, pozwalając im zeskanować kod QR z ustawień serwera - będzie on zawierał hasło serwera, dzięki czemu będą mogli również otrzymywać wiadomości za pośrednictwem twojego serwera.

+

Uwaga: Do obsługi haseł wymagany jest serwer SMP w wersji 4.0. Jeśli już posiadasz serwer, możesz dodać hasło do niego poprzez wpisanie hasła do pliku INI serwera.

+

     

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/simplex.html b/docs/lang/pl/simplex.html new file mode 100644 index 0000000000..afcb6c91e5 --- /dev/null +++ b/docs/lang/pl/simplex.html @@ -0,0 +1,1130 @@ + + + + + + + + + Platfoma SimpleX + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 07.02.2023 | Języki: PL, EN, FR, CZ |

+

Platfoma SimpleX - motywacja i porównanie

+

Problemy

+

Istniejące komunikatory oraz protokoły borykają się ze wszystkimi lub kilkoma podanymi problemami:

+
    +
  • Brak zachowania prywatności profilu i kontaktów użytkownika (zachowanie poufności metadanych).
  • +
  • Brak ochrony (lub jedynie opcjonalna ochrona) przed atakami MITM przez dostawcę usług przy użyciu szyfrowania end to end
  • +
  • Niechciane wiadomości (spam i nadużycia).
  • +
  • Brak własności danych i ich ochrony.
  • +
  • Dla nietechnicznych użytkowników używanie niescentralizowanych protokołów jest skomplikowane.
  • +
+

Koncentracja komunikacji na niewielkiej liczbie scentralizowanych platform sprawia, że rozwiązanie tych problemów jest dość trudne.

+

Proponowane rozwiązanie

+

Proponowany zestaw protokołów pozwala rozwiązać te problemy poprzez przechowywanie zarówno wiadomości, jak i kontaktów wyłącznie na urządzeniach klienckich, redukując rolę serwerów do zwykłych przekaźników wiadomości. Wymagają one jedynie autoryzacji wiadomości wysyłanych do kolejek, ale NIE wymagają uwierzytelniania użytkowników - dzięki temu chronione są nie tylko wiadomości, ale także metadane, ponieważ użytkownicy nie mają przypisanych do siebie żadnych identyfikatorów - w przeciwieństwie do innych platform.

+

Zobacz whitepaper po więcej informacji o zadaniach platformy oraz by dowiedzieć się jak wygląda koncepcja techniczna modelu.

+

Dlaczego SimpleX

+

SimpleX podchodzi do problemu prywatności i bezpieczeństwa w unikalny sposób

+

Każdy powinien zwracać uwagę na prywatność i bezpieczeństwo swojej komunikacji - nawet zwykłe rozmowy mogą narazić Cię na niebezpieczeństwo.

+

Pełna prywatność Twojej tożsamości, profilu, kontaktu i metadanych

+

W przeciwieństwie do innych komunikatorów, SimpleX nie posiada żadnych identyfikatorów przypisanych do użytkowników - nie wymaga użycia numeru telefonu (jak Signal czy Whatsapp), adresu opartego o domenę (jak email, XMPP czy Matrix), nazw użytkownika (jak Telegram), kluczy publicznych czy nawet losowych numerów (jak pozostałe komunikatory) do identyfikowania użytkowników - nie wiemy nawet ile osób używa SimpleX.

+

Do dostarczania wiadomości zamiast identyfikatorów użytkowników, których używają wszystkie inne platformy, SimpleX wykorzystuje adresy jednokierunkowych (simpleksowych) kolejek wiadomości. Korzystanie z SimpleX jest jak posiadanie innego adresu e-mail lub numeru telefonu dla każdego kontaktu, ale bez kłopotów z zarządzaniem tymi wszystkimi adresami. W niedalekiej przyszłości aplikacje SimpleX będą również automatycznie zmieniać kolejki wiadomości, przenosząc konwersacje z jednego serwera na drugi, aby zapewnić użytkownikom jeszcze lepszą prywatność.

+

Takie podejście chroni prywatność tego, z kim się komunikujesz, ukrywając jego tożsamość oraz fakt komunikacji przed serwerami platformy SimpleX i wszelkimi obserwatorami. Prywatność komunikacji można dodatkowo zwiększyć, konfigurując dostęp do sieci w taki sposób, by łączyć się z serwerami SimpleX za pośrednictwem sieci transportowej typu overlay, np. sieci Tor.

+

Najlepsza ochrona przed spamem i nadużyciami

+

Ponieważ nie masz żadnego identyfikatora na platformie SimpleX, nie można się z Tobą skontaktować, chyba że udostępnisz jednorazowy link z zaproszeniem lub opcjonalny tymczasowy adres użytkownika. Nawet przy użyciu opcjonalnych adresów użytkownika, które mogą być wykorzystywane do wysyłania spamu z prośbami o kontakt, można je zmienić lub całkowicie usunąć bez utraty jakichkolwiek połączeń (kontaktów).

+

Pełna kontrola i bezpieczeństwo Twoich danych

+

SimpleX przechowuje wszystkie dane użytkownika na urządzeniach klienckich, wiadomości są przetrzymywane tylko tymczasowo na serwerach przekaźnikowych SimpleX do momentu ich odebrania, po czym są trwale usuwane.

+

Używamy przenośnego formatu bazy danych, który może być używany na wszystkich obsługiwanych urządzeniach - wkrótce dodamy możliwość eksportu bazy danych czatu z aplikacji mobilnej, aby można było jej używać na innym urządzeniu.

+

W przeciwieństwie do serwerów sieci federowanych (e-mail, XMPP lub Matrix), serwery SimpleX nie przechowują kont użytkowników, a jedynie przekazują wiadomości do odbiorców, chroniąc prywatność obu stron. Nie ma żadnych identyfikatorów ani zaszyfrowanych wiadomości występujących wspólnie z wysłanym i odbieranym ruchem serwera, dzięki dodatkowej warstwie szyfrowania dostarczanych wiadomości. Jeśli więc ktoś obserwuje ruch na serwerze, nie może łatwo określić, kto komunikuje się z kim (sprawdź SimpleX whitepaper by dowiedzieć się o znanych atakach korelacji ruchu).

+

Użytkownicy są właścicielami sieci SimpleX

+

Możesz używać SimpleX na własnych serwerach i nadal komunikować się z ludźmi za pomocą serwerów, które są wstępnie skonfigurowane w aplikacjach lub z dowolnymi innymi serwerami SimpleX.

+

Platforma SimpleX korzysta z otwartego protokołu i zapewnia zestaw SDK do tworzenia czatbotów, umożliwiając implementację usług, z którymi użytkownicy mogą wchodzić w interakcje za pośrednictwem aplikacji SimpleX Chat - naprawdę nie możemy się doczekać, aby zobaczyć, jakie usługi oparte o SimpleX można stworzyć.

+

Jeśli rozważasz stworzenie czegoś w oparciu o platformę SimpleX, niezależnie od tego, czy chodzi o usługi czatbotów dla użytkowników aplikacji SimpleX, czy też integrację biblioteki SimpleX Chat z aplikacjami mobilnymi, skontaktuj się z nami, aby uzyskać porady i wsparcie.

+

Porównanie z innymi protokołami

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SimpleX ChatSignal, duże platformyXMPP, MatrixProtokoły P2P
Wymaga identyfikatorów użytkownikaNie = prywatnyTak1Tak2Tak3
Możliwość ataku MITMNie = bezpiecznyTak4TakTak
Polega na DNSNie = odporny na cenzuręTakTakNie
Pojedynczy operator lub siećNie = zdecentralizowanyTakNieTak5
Scentralizowanie lub możliwość ataku obejmującego całą siećNie = odporny na cenzuręTakTak2Tak6
+
    +
  1. Zwykle opiera się na numerze telefonu, w niektórych przypadkach na nazwie użytkownika.
  2. +
  3. Bazuje na DNS.
  4. +
  5. Klucz publiczny lub inny globalnie unikalny identyfikator.
  6. +
  7. Jeśli serwery operatora zostaną przejęte.
  8. +
  9. Mimo że sieci P2P i sieci oparte na kryptowalutach są rozproszone, nie są w pełni zdecentralizowane - działają jako pojedyncza sieć, z pojedynczą przestrzenią nazw adresów użytkowników.
  10. +
  11. Sieci P2P albo mają jakiś centralny serwer, albo cała sieć może zostać przejęta - patrz następna sekcja.
  12. +
+

Porównanie z komunikatorami P2P

+

Istnieje kilka protokołów czatu/wiadomości P2P i implementacji, które mają na celu rozwiązanie problemu prywatności i centralizacji, ale mają one swój własny szereg problemów, które sprawiają, że są mniej niezawodne niż proponowany projekt, są bardziej skomplikowane w implementacji i analizie oraz są bardziej podatne na ataki.

+
    +
  1. +

    Sieci P2P korzystają z jakiegoś rodzaju DHT do routowania wiadomości/zapytań po sieci. Implementacje DHT mają złożone konstrukcje, muszą równoważyć niezawodność, gwarancję dostawy i czas oczekiwania. Proponowany model zapewnia zarówno większą gwarancję dostarczalności, jak i mniejsze opóźnienia (wiadomość jest przekazywana wiele razy równolegle, za każdym razem przez jeden węzeł, przy użyciu serwerów wybranych przez odbiorcę, podczas gdy w sieciach P2P wiadomość jest przekazywana przez O(log N) węzłów sekwencyjnie, przy użyciu węzłów wybranych przez algorytm).

    +
  2. +
  3. +

    Proponowany model, w przeciwieństwie do większości sieci P2P, nie posiada żadnych globalnych identyfikatorów użytkowników, nawet tymczasowych.

    +
  4. +
  5. +

    P2P samo w sobie nie rozwiązuje problemu ataku MITM, a większość istniejących rozwiązań nie wykorzystuje komunikacji out-of-band do początkowej wymiany kluczy. Proponowany projekt wykorzystuje wiadomości out-of-band lub (w niektórych przypadkach) istniejące wcześniej bezpieczne i zaufane połączenia do początkowej wymiany kluczy.

    +
  6. +
  7. +

    Implementacje P2P mogą być blokowane przez niektórych dostawców Internetu (tak jak BitTorrent). Proponowany model jest niezależny od rodzaju transmisji - może działać na standardowych protokołach sieciowych, a serwery mogą działać na tych samych domenach, co strony internetowe.

    +
  8. +
  9. +

    Wszystkie znane sieci P2P mogą być podatne na atak typu Sybil, ponieważ każdy węzeł jest wykrywalny, a sieć działa jako całość. Znane środki mające na celu zmniejszenie prawdopodobieństwa ataku typu Sybil wymagają zastosowania scentralizowanego komponentu lub kosztownego proof of work. Proponowany model, przeciwnie, nie ma możliwości wykrycia serwera - serwery nie są połączone, nie są znane sobie nawzajem i wszystkim klientom. Sieć SimpleX jest pofragmentowana i działa jako wiele odizolowanych połączeń. Uniemożliwia to ataki na całą sieć SimpleX - nawet jeśli niektóre serwery są zagrożone, inne części sieci mogą działać normalnie, a dotknięci atakiem użytkownicy mogą przełączyć się na inne serwery bez utraty kontaktów lub wiadomości.

    +
  10. +
  11. +

    Sieci P2P są prawdopodobnie podatne na atak DRDoS. W proponowanym modelu klienci przekazują tylko ruch ze znanych zaufanych połączeń i nie mogą być wykorzystywani do odbijania i wzmacniania ruchu w całej sieci.

    +
  12. +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/translations.html b/docs/lang/pl/translations.html new file mode 100644 index 0000000000..8ea5463506 --- /dev/null +++ b/docs/lang/pl/translations.html @@ -0,0 +1,1125 @@ + + + + + + + + + Współtworzenie tłumaczenia SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 19.03.2023 | PL, EN, CZ, FR|

+

Współtworzenie tłumaczenia SimpleX Chat

+

Dziękujemy za zainteresowanie się tłumaczeniem SimpleX Chat - to bardzo pomaga w uczynieniu go dostępnym dla szerszego grona użytkowników i naprawdę doceniamy Twoją pomoc.

+

Wymaga to znacznej inwestycji czasu - większość ludzi tego początkowo nie docenia - oraz stałej opieki w miarę rozwoju aplikacji.

+

Ten dokument został stworzony, po to by przyspieszyć ten proces i podzielić się kilkoma ważnymi "gafami", które odkryliśmy podczas pracy z Weblate - platformą, której używamy do tłumaczeń interfejsu.

+

Zanim rozpoczniesz tłumaczenie

+
    +
  1. +

    Utwórz konto w Weblate, używając tego samego adresu e-mail, którego używasz na platformie GitHub - dzięki temu Twój wkład będzie powiązany z kontem GitHub, co może okazać się dla Ciebie przydatne w niektórych przypadkach. Gdy tłumaczenie zostanie udostępnione użytkownikom, dodamy nazwę twojego konta do [listy tłumaczy] (https://github.com/simplex-chat/simplex-chat#translate-the-apps), chyba że poprosisz nas, abyśmy tego nie robili.

    +
  2. +
  3. +

    Przed rozpoczęciem tłumaczenia należy podpisać prostą umowę licencyjną za pośrednictwem Weblate - ma to na celu uniknięcie konfliktów związanych z prawami własności intelektualnej. Kopia tej umowy jest również dostępna tutaj.

    +
  4. +
  5. +

    Możemy również dodać Cię do grupy tłumaczy w przypadku jakichkolwiek pytań i aktualizacji - skontaktuj się z programistami za pośrednictwem czatu (po zainstalowaniu aplikacji lub później, poprzez "Wyślij pytania i pomysły" w ustawieniach aplikacji).

    +
  6. +
+

Proces tłumaczenia

+

Najłatwiej jest najpierw przetłumaczyć aplikację na Androida, a dopiero później aplikację na iOS, ponieważ przetłumaczone ciągi Androidowej aplikacji są skonfigurowane jako słownik dla iOS.

+

Kroki są następujące:

+
    +
  1. Tłumaczysz aplikację na Androida w Weblate.
  2. +
  3. Sprawdzamy i publikujemy tłumaczenia aplikacji na Androida.
  4. +
  5. Sprawdzasz tłumaczenia w aplikacji i poprawiasz ewentualne błędy.
  6. +
  7. Tłumaczysz aplikację iOS w Weblate.
  8. +
  9. Sprawdzamy i publikujemy tłumaczenia aplikacji iOS.
  10. +
+

Tłumaczenie aplikacji na Androida

+
    +
  1. +

    Zacznij od aplikacji na Androida, zarówno podczas wykonywania najbardziej czasochłonnego tłumaczenia wstępnego, jak i dodawania ciągów później. Ze względu na to, że po pierwsze, ciągi w systemie iOS mogą pojawiać się w Weblate z pewnym opóźnieniem, ponieważ wymagają ręcznego zatwierdzenia z naszej strony, zanim będą widoczne, a po drugie, aplikacja na Androida jest skonfigurowana jako słownik dla aplikacji na iOS. 2/3 wszystkich ciągów wymaga tylko kliknięcia, aby przenieść je z Androida na iOS (nadal zajmuje to trochę czasu, Weblate niestety tego nie automatyzuje).

    +
  2. +
  3. +

    Niektóre ciągi nie wymagają tłumaczenia, ale nadal trzeba je skopiować - w interfejsie użytkownika weblate znajduje się odpowiedni przycisk:

    +
  4. +
+weblate: copy source to translation +
    +
  1. +

    Weblate posiada również automatyczne sugestie, które mogą przyspieszyć ten proces. Czasami mogą być używane w niezmienionej formie, a czasami wymagają edycji - kliknij, aby użyć ich w tłumaczeniach.

    +
  2. +
  3. +

    Zwróć również uwagę na Klucz ciągu (znajduje się po prawej stronie ekranu) - może on dać ci podpowiedź, co ten ciąg oznacza, gdy jego znaczenie jest niejasne. Przykładowo, klucz dla " Dodatkowy akcent" ( nie wiadomo) to "color_primary_variant" (nieco bardziej jasne, że odnosi się do koloru używanego w aplikacji).

    +
  4. +
  5. +

    Gdy wszystkie ciągi w aplikacji na Androida zostaną przetłumaczone, przejrzyj je, aby zapewnić spójny styl i język, tak aby te same słowa były konsekwentnie używane do podobnych działań użytkownika, tak samo jak w języku angielskim. Czasami będziesz musiał użyć różnych słów w przypadkach, gdy angielski ma tylko jedno, spróbuj użyć tych wyborów spójnie w podobnych kontekstach, aby uprościć obsługę użytkownikom końcowym.

    +
  6. +
+

Prosimy również o sprawdzenie tłumaczeń przy użyciu przeglądarki Chrome i funkcji Tłumacz na angielski w trybie Przeglądaj w weblate - tak będziemy sprawdzać tłumaczenia przed ich opublikowaniem. Popraw wszelkie błędy i dodaj komentarze w przypadkach, gdy uzasadnione jest użycie różnych tłumaczeń - znacznie przyspieszy to weryfikację.

+

Udostępnianie tłumaczeń dla aplikacji na Androida

+

Gdy aplikacja na Androida zostanie przetłumaczona, poinformuj nas o tym.

+

My wtedy:

+
    +
  • przejrzymy wszystkie tłumaczenia i zasugerujemy ewentualne poprawki - to również zajmie trochę czasu :)
  • +
  • scalimy je z kodem źródłowym - w tym czasie weblate będzie ustawiony na blokadę zmian.
  • +
  • stworzymy wersje beta aplikacji na iOS i Androida - możemy również dodać Cię do wewnętrznych grup testerów, abyś mógł zainstalować aplikacje przed innymi.
  • +
  • udostępnimy ją naszym użytkownikom korzystającym z wersji beta - już ponad tysiąc osób korzysta z wersji beta.
  • +
  • wydamy aplikację i uwzględnimy nowy język w ogłoszeniu.
  • +
+

Tłumaczenie aplikacji iOS

+
    +
  1. +

    Podczas tłumaczenia aplikacji iOS duża część ciągów jest dokładnie taka sama - można je skopiować jednym kliknięciem w sekcji słowniczka. Wskazówką jest podświetlenie całego ciągu źródłowego na żółto. Wiele innych ciągów jest bardzo do siebie podobnych, różnią się jedynie składnią lub sposobem pogrubienia czcionki - wymagają one minimalnej edycji. Istnieją jednak pewne ciągi które są unikalne dla platformy iOS - należy je przetłumaczyć osobno

    +
  2. +
  3. +

    Przejrzyj tłumaczenia na iOS w taki sam sposób jak na Androida i daj nam znać, kiedy będą gotowe do sprawdzenia - powtórzymy ten sam proces dla aplikacji na iOS.

    +
  4. +
+

Serdecznie dziękujemy! To ogromny wysiłek i wielka pomoc dla rozwoju sieci SimpleX.

+weblate: automatic suggestions +

Częste błędy w tłumaczeniu

+
    +
  1. +

    Słowo "chat" jest używane w kilku znaczeniach, w zależności od kontekstu. Może ono oznaczać "aplikację SimpleX Chat" (np. w opcji Rozpocznij/zatrzymaj czat) lub "pojedynczą rozmowę". Jeśli nie jest to jasne, zapytaj się nas, a my dodamy więcej uwag dotyczących tłumaczenia.

    +
  2. +
  3. +

    Prosimy o używanie liczby mnogiej i pojedynczej tak jak w oryginalnych ciągach, w przeciwnym razie może to zmienić ich znaczenie. Przykładowo, niektóre ustawienia mają zastosowanie do wszystkich kontaktów, a niektóre tylko do jednego kontaktu, będzie to mylące dla użytkownika, jeśli użyjesz liczby mnogiej w obu przypadkach.

    +
  4. +
  5. +

    Aplikacja używa "Passcode" do zapewnienia dostępu, a nie "hasła" ("password") - w wielu językach jest to tłumaczone jako "kod dostępu". Baza danych używa "Passphrase" - w wielu językach jest to tłumaczone jako "hasło". Prosimy o spójne używanie tych słów.

    +
  6. +
  7. +

    "Rola" użytkownika. To słowo odnosi się do zestawu uprawnień posiadanych przez użytkownika, może to być "właściciel", "administrator", "członek" lub "obserwator" (najniższe uprawnienie, które pozwala tylko na czytanie wiadomości i dodawanie reakcji na wiadomości). Tłumaczenie tego jako "tożsamość" lub "funkcja" może być nieprawidłowe.

    +
  8. +
  9. +

    "Moderate" / "moderated" ("moderować" / "zmoderowany"). Te słowa oznaczają odpowiednio "usunięcie wiadomości innego użytkownika" i "usunięcie przez administratora". Ta funkcja jest używana, gdy członek wysyła wiadomość, która nie jest odpowiednia dla grupy. Wiele języków ma podobne słowa.

    +
  10. +
+

Jak sprawdzamy tłumaczenia

+

Aby zweryfikować poprawność tłumaczeń, sprawdzamy tłumaczenia poprzez przeglądanie stron Weblate w przeglądarce Google Chrome w trybie "Tłumacz na angielski". Na przykład, aby sprawdzić niemieckie tłumaczenia interfejsu Androida, ktoś z naszego zespołu przewinął [te 68 stron] (https://hosted.weblate.org/browse/simplex-chat/android/de/).

+

Nie oczekujemy, że odwrócone tłumaczenie będzie dokładnie takie samo jak oryginał, rzadko się to zdarza, ale że będzie ogólnie poprawne.

+

Znacznie ułatwiłoby to recenzję, gdybyś mógł wcześniej sprawdzić to w ten sam sposób i skomentować wszystkie przypadki, w których odwrócone tłumaczenia są zupełnie inne (mogą istnieć uzasadnione przypadki).

+

Co dalej

+
    +
  1. +

    W miarę aktualizowania aplikacji będziemy publikować aktualizacje w grupie tłumaczy. Nie masz absolutnie żadnego obowiązku tłumaczenia tych dodatkowych ciągów. Niemniej jednak bardzo docenimy, jeśli to zrobisz, ponieważ sprawia to, że użytkownicy mają o wiele lepsze wrażenia, gdy polegają na Twoich tłumaczeniach, niż gdyby jakaś nowa część aplikacji nie została przetłumaczona.

    +
  2. +
  3. +

    Możesz jeszcze bardziej pomóc w popularyzacji SimpleX w swoim kraju / grupie językowej, tłumacząc naszą stronę internetową (również przez weblate) i/lub dokumenty GitHub (jest to możliwe tylko przez git)!

    +
  4. +
  5. +

    Ponadto, jeśli chcesz być moderatorem / administratorem grupy użytkowników w swoim języku, po przetłumaczeniu aplikacji możemy hostować taką grupę - przygotowujemy wytyczne dla społeczności i dodajemy kilka narzędzi moderacyjnych do aplikacji, która zostanie wydana w wersji 4.6 w marcu.

    +
  6. +
+

Jeszcze raz bardzo dziękujemy za pomoc w rozwoju SimpleX Chat!

+

Evgeny, założyciel SimpleX Chat.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/lang/pl/webrtc.html b/docs/lang/pl/webrtc.html new file mode 100644 index 0000000000..0aafc85821 --- /dev/null +++ b/docs/lang/pl/webrtc.html @@ -0,0 +1,1162 @@ + + + + + + + + + Korzystanie z niestandardowych serwerów WebRTC ICE w SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 31.01.2023 | Języki: PL, EN, FR, CZ |

+

Korzystanie z niestandardowych serwerów WebRTC ICE w SimpleX Chat

+

Instalacja serwera STUN/TURN

+

W tym poradniku będziemy używać najbardziej funkcjonalnej i przetestowanej w boju implementacji serwera STUN/TURN - coturn i Ubuntu 20.04 LTS` dystrybucji Linuksa.

+
    +
  1. +

    Uzyskaj certyfikaty stun.$TWOJA_DOMENA i turn.$TWOJA_DOMENA.

    +

    Używamy Let's Encrypt.

    +
  2. +
  3. +

    Zainstaluj pakiet coturn z głównego repozytorium.

    +
  4. +
+
apt update && apt install coturn`
+
+
    +
  1. Odkomentuj TURNSERVER_ENABLED=1 z /etc/default/coturn:
  2. +
+
sed -i '/TURN/s/^#//g' /etc/default/coturn
+
+
    +
  1. +

    Skonfiguruj coturn w /etc/turnserver.conf:

    +

    Zobacz również komentarze dotyczące poszczególnych opcji.

    +
  2. +
+
# Nasłuchuj również na porcie 443 dla tls
+alt-tls-listening-port=443
+# Używaj odcisków palców w komunikatach TURN
+fingerprint
+# Użyj mechanizmu poświadczeń długoterminowych
+lt-cred-mech
+# Twoje poświadczenia
+user=$YOUR_LOGIN:$YOUR_PASSWORD
+# Domena Twojego serwera
+server-name=$YOUR_DOMAIN
+# Domyślny obszar, który ma być używany dla użytkowników, gdy nie znaleziono wyraźnej relacji pochodzenie/obszar
+realm=$YOUR_DOMAIN
+# Ścieżka do Twoich certyfikatów. Upewnij się, że są one czytelne dla użytkownika/grupy procesu cotun.
+cert=/var/lib/turn/cert.pem
+pkey=/var/lib/turn/key.pem
+# Użyj predefiniowanego klucza DH TLS o długości 2066 bitów
+dh2066
+# Logowanie do journalctl
+syslog
+# Użytkownik/grupa, która będzie uruchamiać usługę coturn
+proc-user=turnserver
+proc-group=turnserver
+# Wyłącz słabe szyfrowanie
+no-tlsv1
+no-tlsv1_1
+no-tlsv1_2
+
+
    +
  1. Uruchom i włącz serwis coturn:
  2. +
+
systemctl enable coturn && systemctl start coturn
+
+
    +
  1. Opcjonalnie, jeśli używasz firewalla ufw, otwórz odpowiednie porty:
  2. +
+
    +
  • 3478 – "czysty" TURN/STUN;
  • +
  • 5349 – TURN/STUN over TLS;
  • +
  • 443 – TURN/STUN over TLS, który może omijać firewalle;
  • +
  • 49152:65535 – zakres portów, który Coturn będzie domyślnie wykorzystywał dla przekaźnika TURN.
  • +
+
# Dla Ubuntu
+sudo ufw allow 3478 && \
+sudo ufw allow 443 && \
+sudo ufw allow 5349 && \
+sudo ufw allow 49152:65535/tcp && \
+sudo ufw allow 49152:65535/udp
+
+# Dla Fedory
+sudo firewall-cmd --permanent --add-port=443/tcp && \
+sudo firewall-cmd --permanent --add-port=443/udp && \
+sudo firewall-cmd --permanent --add-port=5349/tcp && \
+sudo firewall-cmd --permanent --add-port=5349/udp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/tcp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/udp && \
+sudo firewall-cmd --reload
+
+

Konfiguracja aplikacji mobilnych

+

Aby skonfigurować aplikację mobilną do korzystania z serwera:

+
    +
  1. +

    Otwórz Ustawienia / Sieć i serwery / Serwery WebRTC ICE i przełącz przełącznik Konfiguruj serwery ICE.

    +
  2. +
  3. +

    Wprowadź wszystkie adresy serwerów w polu, po jednym na linię, na przykład jeśli serwery znajdują się na porcie 5349:

    +
  4. +
+
stun:stun.example.com:5349
+turn:username:password@turn.example.com:5349
+
+

To tyle - teraz możesz wykonywać połączenia audio i wideo za pośrednictwem własnego serwera, bez udostępniania jakichkolwiek danych naszym serwerom (poza wymianą kluczy z kontaktem w szyfrowanych wiadomościach E2E).

+

Rozwiązywanie problemów

+
    +
  • +

    Określ czy Twój serwer jest dostępny:

    +

    Uruchom to polecenie w terminalu:

    +
    ping <twoje_ip_lub_domena>
    +
    +

    Jeśli pakiety są transmitowane, serwer działa!

    +
  • +
  • +

    Określ czy porty są otwarte:

    +

    Uruchom to polecenie w terminalu:

    +
    nc -zvw10 <twoje_ip_lub_domena> 443 5349
    +
    +

    Powinno się pojawić:

    +
    Connection to <twoje_ip_lub_domena> 443 port [tcp/https] succeeded!
    +Connection to <twoje_ip_lub_domena> 5349 port [tcp/*] succeeded!
    +
    +
  • +
  • +

    Test połączenia STUN/TURN:

    +
      +
    1. +

      Wejdź na IceTest.

      +
    2. +
    3. +

      W sekcji Build up ICE Server List dodaj:

      + +
        +
      • STUN: stun:<twoje_ip_lub_domena>:<port> kliknij Add STUN
      • +
      • TURN: turn:<twoje_ip_lub_domena>:<port>, Username: <twój_login>, Credential: <twoje_hasło> kliknij Add TURN
      • +
      +

      Gdzie <port> to 443 lub 5349.

      +
    4. +
    5. +

      Powinieneś zobaczyć swoje serwery w sekcji ICE server list. Jeśli wszystko jest skonfigurowane poprawnie, naciśnij Start test:

      + +
    6. +
    7. +

      W sekcji Results powinieneś zobaczyć coś takiego:

      + +

      Jeśli wyniki pokazują srflx i relay, wszystko jest skonfigurowane poprawnie!

      +
    8. +
    +
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/protocol/diagrams/group.mmd b/docs/protocol/diagrams/group.mmd new file mode 100644 index 0000000000..6a9bd0c786 --- /dev/null +++ b/docs/protocol/diagrams/group.mmd @@ -0,0 +1,51 @@ +sequenceDiagram + participant M as N existing
members + participant A as Alice + participant B as Bob + participant C as Existing
contact + + alt invite contact + note over A, B: 1a. send and accept group invitation + A ->> B: x.grp.inv
invite Bob to group
(via contact connection) + B ->> A: x.grp.acpt
accept invitation
(via member connection)
establish group member connection + else join via group link + note over A, B: 1b. join via group link and accept request + B ->> A: join via group link
SimpleX contact address + A ->> B: x.grp.link.inv in SMP confirmation
accept joining member request,
sending group profile, etc.
establish group member connection + A ->> B: x.grp.link.mem
send inviting member profile + end + + note over M, B: 2. introduce new member Bob to all existing members + A ->> M: x.grp.mem.new
"announce" Bob
to existing members
(via member connections) + loop batched + A ->> B: x.grp.mem.intro * N
"introduce" members and
their chat protocol versions
(via member connection) + note over B: prepare group member connections + opt chat protocol compatible version < 2 + note over B: prepare direct connections + end + B ->> A: x.grp.mem.inv * N
"invitations" to connect
for all members
(via member connection) + end + A ->> M: x.grp.mem.fwd
forward "invitations" and
Bob's chat protocol version
to all members
(via member connections) + + note over M, B: group message forwarding
(while connections between members are being established) + M -->> B: messages between members and Bob are forwarded by Alice + B -->> M: + + note over M, B: 3. establish direct and group member connections + M ->> B: establish group member connection + + opt chat protocol compatible version < 2 + M ->> B: establish direct connection + note over M, C: 3*. deduplicate new contact + B ->> M: x.info.probe
"probe" is sent to all new members + B ->> C: x.info.probe.check
"probe" hash,
in case contact and
member profiles match + C ->> B: x.info.probe.ok
original "probe",
in case contact and member
are the same user + note over B: merge existing and new contacts if received and sent probe hashes match + end + + note over M, B: 4. notify inviting member that connection is established + M ->> A: x.grp.mem.con + B ->> A: x.grp.mem.con + note over A: stops forwarding messages + M -->> B: messages are sent via group connection without forwarding + B -->> M: diff --git a/docs/protocol/diagrams/group.svg b/docs/protocol/diagrams/group.svg new file mode 100644 index 0000000000..f3c9aa8a26 --- /dev/null +++ b/docs/protocol/diagrams/group.svg @@ -0,0 +1,3 @@ + + +ExistingcontactBobAliceN existingmembersExistingcontactBobAliceN existingmembers1a. send and accept group invitation1b. join via group link and accept requestalt[invite contact][join via group link]2. introduce new member Bob to all existing membersprepare group member connectionsprepare direct connectionsopt[chat protocolcompatible version< 2]loop[batched]group message forwarding(while connections between members are being established)3. establish direct and group member connections3*. deduplicate new contactmerge existing and new contacts if received and sent probe hashes matchopt[chat protocol compatible version < 2]4. notify inviting member that connection is establishedstops forwarding messagesx.grp.invinvite Bob to group(via contact connection)x.grp.acptaccept invitation(via member connection)establish group member connectionjoin via group linkSimpleX contact addressx.grp.link.inv in SMP confirmationaccept joining member request,sending group profile, etc.establish group member connectionx.grp.link.memsend inviting member profilex.grp.mem.new"announce" Bobto existing members(via member connections)x.grp.mem.intro * N"introduce" members andtheir chat protocol versions(via member connection)x.grp.mem.inv * N"invitations" to connectfor all members(via member connection)x.grp.mem.fwdforward "invitations" andBob's chat protocol versionto all members(via member connections)messages between members and Bob are forwarded by Aliceestablish group member connectionestablish direct connectionx.info.probe"probe" is sent to all new membersx.info.probe.check"probe" hash,in case contact andmember profiles matchx.info.probe.ok original "probe", in case contact and memberare the same userx.grp.mem.conx.grp.mem.conmessages are sent via group connection without forwarding \ No newline at end of file diff --git a/docs/protocol/diagrams/xftp.mmd b/docs/protocol/diagrams/xftp.mmd new file mode 100644 index 0000000000..af45952075 --- /dev/null +++ b/docs/protocol/diagrams/xftp.mmd @@ -0,0 +1,42 @@ +sequenceDiagram + participant A as Alice + participant AC as Alice Chat + participant AA as Alice Agent + participant XFTP as Alice's XFTP relay(s) + participant SMP as Bob's SMP relay + participant BA as Bob Agent + participant BC as Bob Chat + participant B as Bob + + A ->> AC: APISendMessage + AC ->> AA: sendMessage(x.msg.new) /
CIFSSndStored + AA ->> SMP: SEND + SMP ->> BA: MSG + BA ->> BC: MSG + BC ->> B: CRNewChatItem
(file not ready) + B ->> BC: ReceiveFile + BC ->> B: error: no file description + AC ->> AA: sendFile + AC ->> A: CRSndFileStart + AA ->> XFTP: chunk (FNEW, FPUT) + AA ->> AC: SFPROG /
CIFSSndTransfer + AC ->> A: CRSndFileProgress (new) + AA ->> XFTP: chunks + AA ->> AC: SFDONE sd rds + AC ->> AA: sendMessage(x.msg.file.descr) /
FSComplete / CIFSSndComplete + AC ->> A: CRSndFileComplete (?) + AA ->> SMP: SEND + SMP ->> BA: MSG + BA ->> BC: MSG + BC ->> B: CRChatItemUpdated
(file is ready) + BC ->> B: CRFileReady (TBC) + B ->> BC: ReceiveFile + BC ->> BA: getFile + BC ->> B: CRRcvFileStart + XFTP ->> BA: chunk (FGET / FRFile) + BA ->> BC: RFPROG + BC ->> B: CRRcvFileProgress (new) + XFTP ->> BA: chunks + BA ->> BC: RFDONE + BC ->> B: CRNewChatItem
(file received) + BC ->> B: CRRcvFileComplete diff --git a/docs/protocol/simplex-chat.html b/docs/protocol/simplex-chat.html new file mode 100644 index 0000000000..62b083709c --- /dev/null +++ b/docs/protocol/simplex-chat.html @@ -0,0 +1,1179 @@ + + + + + + + + + SimpleX Chat Protocol + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Revision 2, 2024-06-24

+

Evgeny Poberezkin

+

SimpleX Chat Protocol

+

Abstract

+

SimpleX Chat Protocol is a protocol used by SimpleX Chat clients to exchange messages. This protocol relies on lower level SimpleX protocols - SimpleX Messaging Protocol (SMP) and SimpleX Messaging Agent protocol. SimpleX Chat Protocol describes the format of messages and the client operations that should be performed when receiving such messages.

+

Scope

+

The scope of SimpleX Chat Protocol is application level messages, both for chat functionality, related to the conversations between the clients, and extensible for any other application functions. Currently supported chat functions:

+
    +
  • direct and group messages,
  • +
  • message replies (quoting), message editing, forwarded messages and message deletions,
  • +
  • message attachments: images, videos, voice messages and files,
  • +
  • creating and managing chat groups,
  • +
  • invitation and signalling for audio/video WebRTC calls.
  • +
+

General message format

+

SimpleX Chat protocol supports these message formats:

+
    +
  • JSON-based format for chat and application messages.
  • +
  • compressed format for adapting larger messages to reduced size of message envelope, caused by addition of PQ encryption keys to SMP agent message envelope.
  • +
  • binary format for sending files or any other binary data.
  • +
+

JSON-based message format supports batching inside a single container message, by encoding list of messages as JSON array.

+

Current implementation of chat protocol in SimpleX Chat uses SimpleX File Transfer Protocol (XFTP) for file transfer, with passing file description as chat protocol messages, instead passing files in binary format via SMP connections.

+

JSON format for chat and application messages

+

This document uses JTD schemas RFC 8927 to define the properties of chat messages, with some additional restrictions on message properties included in metadata member of JTD schemas. In case of any contradiction between JSON examples and JTD schema the latter MUST be considered correct.

+

Whitespace is used in JSON examples for readability, SimpleX Chat Protocol clients MUST avoid using whitespace when encoding JSON messages.

+

General message format is defined by this JTD schema:

+
{
+  "properties": {
+    "event": {
+      "type": "string"
+    },
+    "msgId": {
+      "type": "string",
+      "metadata": {
+        "format": "base64url-encoded 12 bytes random message ID"
+      }
+    },
+    "params": {
+      "optionalProperties": {}
+    }
+  }
+}
+
+

For example, this message defines a simple text message "hello!":

+
{
+  "event": "x.msg.new",
+  "msgId": "abcd",
+  "params": {
+    "content": {
+      "type": "text",
+      "text": "hello!"
+    }
+  }
+}
+
+

msgId property is a 12 bytes base64url-encoded random message ID that the clients can use to reference the message in the future, e.g. when editing, quoting or deleting it.

+

event property is the type of the message that defines the semantics of the message and the allowed format of params property.

+

params property includes message data, depending on event, as defined below and in JTD schema.

+

Compressed format

+

The syntax of compressed message is defined by the following ABNF notation:

+
compressedMessage = %s"X" 1*15780 OCTET; compressed message data
+
+

Compressed message is required to fit into 13388 bytes, accounting for agent overhead (see Protocol's maxCompressedMsgLength).

+

The actual JSON message is required to fit into 15610 bytes, accounting for group message forwarding (x.grp.msg.forward) overhead (see Protocol's maxEncodedMsgLength).

+

Binary format for sending files

+
+

Note: Planned to be deprecated. No longer used for file transfer in SimpleX Chat implementation of chat protocol.

+
+

SimpleX Chat clients use separate connections to send files using a binary format. File chunk size send in each message MUST NOT be bigger than 15,780 bytes to fit into 16kb (16384 bytes) transport block.

+

The syntax of each message used to send files is defined by the following ABNF notation:

+
fileMessage = fileChunk / cancelFile
+fileChunk = %s"F" chunkNo chunk
+cancelFile = %s"C"
+chunkNo = 4*4 OCTET ; 32bit word sequential chunk number, starting from 1, in network byte order
+chunk = 1*15780 OCTET ; file data, up to 15,780 bytes
+
+

The first chunk number MUST be 1.

+

Messages and chat items

+

While users usually use the term "message" to refer to the objects presented in the conversation, the expected functionality of these objects makes it a wrong term. "Messages" are supposed to be immutable; they cannot be modified or deleted once sent. The objects in the conversation are expected to be mutable. This document and implementation use the term "chat item" to refer to these objects to differentiate them from the messages sent between the clients.

+

Supported JSON message types and SimpleX Chat sub-protocols

+

Message types are sent as a string in event property of JSON messages. General syntax of event string is defined by this ABNF:

+
event = namespace "." subprotocol *("." eventWord)
+namespace = eventWord ; 1-letter recommended
+subprotocol = eventWord
+eventWord = 1* ALPHA
+
+

All SimpleX Chat Protocol messages related to chat functions are defined in x namespace.

+

Sub-protocol is a group of messages for related message functions - e.g. sending files, managing groups or negotiating WebRTC calls.

+

SimpleX Chat Protocol supports the following message types passed in event property:

+
    +
  • x.contact - contact profile and additional data sent as part of contact request to a long-term contact address.
  • +
  • x.info* - messages to send, update and de-duplicate contact profiles.
  • +
  • x.msg.* - messages to create, update and delete content chat items.
  • +
  • x.msg.file.descr - message to transfer XFTP file description.
  • +
  • x.file.* - messages to accept and cancel sending files (see files sub-protocol).
  • +
  • x.direct.del - message to notify about contact deletion.
  • +
  • x.grp.* - messages used to manage groups and group members (see group sub-protocol).
  • +
  • x.call.* - messages to invite to WebRTC calls and send signalling messages.
  • +
  • x.ok - message sent during connection handshake.
  • +
+

JTD schema defining messages for all chat functions is available in this file – please refer to this document for all properties of the message params.

+

x.contact - sending connection request

+

The message is sent as part of the connection request to the long-term user address. contactReqId property is used to identify a duplicate contact request - the receiving client MAY put repeated request on top of the list in the UI.

+

Sub-protocol for contact profile

+

x.info - contact profile

+

This message is sent by both sides of the connection during the connection handshake, and can be sent later as well when contact profile is updated.

+

Probing for duplicate contacts

+

As there are no globally unique user identifiers, when the contact a user is already connected to is added to the group by some other group member, this contact will be added to user's list of contacts as a new contact. To allow merging such contacts, "a probe" (random base64url-encoded 32 bytes) SHOULD be sent to all new members as part of x.info.probe message and, in case there is a contact with the same profile, the hash of the probe MAY be sent to it as part of x.info.probe.check message. In case both the new member and the existing contact are the same user (they would receive both the probe and its hash), the contact would send back the original probe as part of x.info.probe.ok message via the previously existing contact connection – proving to the sender that this new member and the existing contact are the same user, in which case the sender SHOULD merge these two contacts.

+

Sending clients MAY disable this functionality, and receiving clients MAY ignore probe messages.

+

If the sending client uses x.info.probe messages, it MUST send them to all new members, rather than only when there is a matching contact profile. This is to avoid leaking information that the matching contact profile exists.

+

Sub-protocol for content messages

+

x.msg.new - a new content message

+

When chat clients receive or send this message, they MUST create a new chat item in the conversation. Top level msgId property is defined to allow referencing this chat item or message in the future, e.g. to delete, update or quote chat item, or to accept file.

+

This message uses params property of the message as content message container, without any top level properties for the container. Message container (params) includes message content property, an optional "invitation" to receive file or image attachment in file property (that is interpreted depending on message content type) and optional indication whether this message is forwarded ("forward": true property of container) or sent in reply to other message ("quote": {<quoted message>}). See /definition/msgContainer in JTD schema for message container format.

+

Message content can be one of four types:

+
    +
  • text - no file attachment is expected for this format, text property MUST be non-empty.
  • +
  • file - attached file is required, text property MAY be empty.
  • +
  • image - attached file is required, text property MAY be empty.
  • +
  • video - attached file is required, text property MAY be empty.
  • +
  • voice - attached file is required, text property MAY be empty.
  • +
  • link - no file attachment is expected, text property MUST be non-empty. preview property contains information about link preview.
  • +
+

See /definition/msgContent in JTD schema for message container format.

+

x.msg.update - update of the previously sent message

+

This message is used to update previously created chat item. Its params property contains msgId of the previously sent message that this one is updating and content with the message content that the clients must use to replace the content of the original chat item.

+

If the referenced message does not exist, the clients MUST create a new chat item with the ID of the referenced message. If the referenced message is not a content message, the clients MUST ignore this message.

+

x.msg.del - request to delete previously sent message

+

This message is used to delete previously sent chat items. Receiving clients MUST implement it as soft-delete, replacing the original chat item with a special chat item indicating that "message is deleted" that can be fully deleted by the user. If the referenced message does not exist or was sent by the different user than the one sending x.msg.del, the receiving clients MUST ignore this message. Clients are also RECOMMENDED to limit the time during which message deletion is allowed, both for senders and for the recipients.

+

Sub-protocol for sending and receiving files

+

When content message x.msg.new contains file attachment (the invitation to receive the file), this sub-protocol is used to accept this file or to notify the recipient that sending the file was cancelled.

+

File attachment can optionally include connection address to receive the file - clients MUST include it when sending files to direct connections, and MUST NOT include it when sending file attachment to the group (as different members would need different connections to receive the file).

+

x.file.acpt message is used to accept the file in case when file connection address was included in the message (that is the case when the file invitation was sent in direct message). It is sent as part of file connection handshake via file connection, that is why this message contains no reference to the file - the used connection provides sufficient context for the sender.

+

x.file.acpt.inv message is used to accept the file in group conversations, it includes the connection address. It is sent in the same connection where the file was offered and must reference the original message.

+

x.file.cancel message is sent to notify the recipient that sending of the file was cancelled. It is sent in response to accepting the file with x.file.acpt.inv message. It is sent in the same connection where the file was offered.

+

x.msg.file.descr message is used to send XFTP file description. File descriptions that don't fit into a single chat protocol message are sent in parts, with messages including part number (fileDescrPartNo) and description completion marker (fileDescrComplete). Recipient client accumulates description parts and starts file download upon completing file description.

+

Sub-protocol for chat groups

+

Decentralized design for chat groups

+

SimpleX Chat groups are fully decentralized and do not have any globally unique group identifiers - they are only defined on client devices as a group profile and a set of bi-directional SimpleX connections with other group members. When a new member accepts group invitation or joins via group link, the inviting member introduces a new member to all existing members and forwards the connection addresses so that they can establish direct and group member connections.

+

There is a possibility of the attack here: as the introducing member forwards the addresses, they can substitute them with other addresses, performing MITM attack on the communication between existing and introduced members - this is similar to the communication operator being able to perform MITM on any connection between the users. To mitigate this attack this group sub-protocol will be extended to allow validating security of the connection by sending connection verification out-of-band.

+

Clients are RECOMMENDED to indicate in the UI whether the connection to a group member or contact was made directly or via another user.

+

Each member in the group is identified by a group-wide unique identifier used by all members in the group. This is to allow referencing members in the messages and to allow group message integrity validation.

+

The diagram below shows the sequence of messages sent between the users' clients to add the new member to the group.

+

While introduced members establish connection inside group, inviting member forwards messages between them by sending x.grp.msg.forward messages. When introduced members finalize connection, they notify inviting member to stop forwarding via x.grp.mem.con message.

+

Adding member to the group

+

Member roles

+

Currently members can have one of four roles - owner, admin, member and observer. The user that created the group is self-assigned owner role, the new members are assigned role by the member who adds them - only owner and admin members can add new members; only owner members can add members with owner role. Observer members only receive messages and aren't allowed to send messages.

+

Messages to manage groups and add members

+

x.grp.inv message is sent to invite contact to the group via contact's direct connection and includes group member connection address. This message MUST only be sent by members with admin or owner role. Optional groupLinkId is included when this message is sent to contacts connected via the user's group link. This identifier is a random byte sequence, with no global or even local uniqueness - it is only used for the user's invitations to a given group to provide confirmation to the contact that the group invitation is for the same group the contact was connecting to via the group link, so that the invitation can be automatically accepted by the contact - the contact compares it with the group link id contained in the group link uri's data field.

+

x.grp.acpt message is sent as part of group member connection handshake, only to the inviting user.

+

x.grp.link.inv message is sent as part of connection handshake to member joining via group link, and contains group profile and initial information about inviting and joining member.

+

x.grp.link.mem message is sent as part of connection handshake to member joining via group link, and contains remaining information about inviting member.

+

x.grp.mem.new message is sent by the inviting user to all connected members (and scheduled as pending to all announced but not yet connected members) to announce a new member to the existing members. This message MUST only be sent by members with admin or owner role. Receiving clients MUST ignore this message if it is received from member with member role.

+

x.grp.mem.intro messages are sent by the inviting user to the invited member, via their group member connection, one message for each existing member. When this message is sent by any other member than the one who invited the recipient it MUST be ignored.

+

x.grp.mem.inv messages are sent by the invited user to the inviting user, one message for each existing member previously introduced with x.grp.mem.intro message. When this message is sent by any other member than the one who was invited by the recipient it MUST be ignored.

+

x.grp.mem.fwd message is used by the inviting user to forward the invitations received from invited member in x.grp.mem.inv messages to all other members. This message can only be sent by the member who previously announced the new member, otherwise the recipients MUST ignore it.

+

x.grp.mem.info this message is sent as part of member connection handshake - it includes group member profile.

+

x.grp.mem.role message is sent to update group member role - it is sent to all members by the member who updated the role of the member referenced in this message. This message MUST only be sent by members with admin or owner role. Receiving clients MUST ignore this message if it is received from member with role less than admin.

+

x.grp.mem.restrict message is sent to group members to communicate group member restrictions, such as member being blocked for sending messages.

+

x.grp.mem.con message is sent by members connecting inside group to inviting member, to notify the inviting member they have completed the connection and no longer require forwarding messages between them.

+

x.grp.mem.del message is sent to delete a member - it is sent to all members by the member who deletes the member referenced in this message. This message MUST only be sent by members with admin or owner role. Receiving clients MUST ignore this message if it is received from member with member role.

+

x.grp.leave message is sent to all members by the member leaving the group. If the only group owner leaves the group, it will not be possible to delete it with x.grp.del message - but all members can still leave the group with x.grp.leave message and then delete a local copy of the group.

+

x.grp.del message is sent to all members by the member who deletes the group. Clients who received this message SHOULD keep a local copy of the deleted group, until it is deleted by the user. This message MUST only be sent by members with owner role. Receiving clients MUST ignore this message if it is received from member other than with owner role.

+

x.grp.info message is sent to all members by the member who updated group profile. Only group owners can update group profiles. Clients MAY implement some conflict resolution strategy - it is currently not implemented by SimpleX Chat client. This message MUST only be sent by members with owner role. Receiving clients MUST ignore this message if it is received from member other than with owner role.

+

x.grp.direct.inv message is sent to a group member to propose establishing a direct connection between members, thus creating a contact with another member.

+

x.grp.msg.forward message is sent by inviting member to forward messages between introduced members, while they are connecting.

+

Sub-protocol for WebRTC audio/video calls

+

This sub-protocol is used to send call invitations and to negotiate end-to-end encryption keys and pass WebRTC signalling information.

+

These message are used for WebRTC calls:

+
    +
  1. +

    x.call.inv: the client initiating the call sends x.call.inv message in direct connection to invite another client to the call. At this point WebRTC session is not initialized yet, this message only contains call type and DH key for key agreement.

    +
  2. +
  3. +

    x.call.offer: to accept the call, the receiving client sends x.call.offer message. This message contains WebRTC offer and collected ICE candidates. Additional ICE candidates can be sent in x.call.extra message.

    +
  4. +
  5. +

    x.call.answer: to continue with call connection the initiating clients must reply with x.call.answer message. This message contains WebRTC answer and collected ICE candidates. Additional ICE candidates can be sent in x.call.extra message.

    +
  6. +
  7. +

    x.call.end message is sent to notify the other party that the call is terminated.

    +
  8. +
+

Threat model

+

This threat model compliments SMP, XFTP, push notifications and XRCP protocols threat models:

+ +

A user's contact

+

can:

+
    +
  • +

    send messages prohibited by user's preferences or otherwise act non-compliantly with user's preferences (for example, if message with updated preferences was lost or failed to be processed, or with modified client), in which case user client should treat such messages and actions as prohibited.

    +
  • +
  • +

    by exchanging special messages with user's client, match user's contact with existing group members and/or contacts that have identical user profile (see Probing for duplicate contacts).

    +
  • +
  • +

    identify that and when a user is using SimpleX, in case user has delivery receipts enabled, or based on other automated client responses.

    +
  • +
+

cannot:

+
    +
  • +

    match user's contact with existing group members and/or contacts with different or with incognito profiles.

    +
  • +
  • +

    match user's contact without communicating with the user's client.

    +
  • +
+

A group member

+

can:

+
    +
  • +

    send messages prohibited by group's preferences and member restrictions or otherwise act non-compliantly with preferences and restrictions (for example, if decentralized group state diverged, or with modified client), in which case user client should treat such messages and actions as prohibited.

    +
  • +
  • +

    create a direct contact with a user if group permissions allow it.

    +
  • +
  • +

    by exchanging special messages with user's client, match user's group member record with the existing group members and/or contacts that have identical user profile.

    +
  • +
  • +

    undetectably send different messages to different group members, or selectively send messages to some members and not send to others.

    +
  • +
  • +

    identify that and when a user is using SimpleX, in case user has delivery receipts enabled, or based on other automated client responses.

    +
  • +
  • +

    join the same group several times, from the same or from different user profile, and pretend to be different members.

    +
  • +
+

cannot:

+
    +
  • +

    match user's contact with existing group members and/or contacts with different or with incognito profiles.

    +
  • +
  • +

    match user's group member record with existing group members and/or contacts without communication of user's client.

    +
  • +
  • +

    determine whether two group members with different or with incognito profiles are the same user.

    +
  • +
+

A group admin

+

can:

+
    +
  • +

    carry out MITM attack between user and other group member(s) when forwarding invitations for group connections (user can detect such attack by verifying connection security codes out-of-band).

    +
  • +
  • +

    undetectably forward different messages to different group members, selectively adding, modifying, and dropping forwarded messages.

    +
  • +
  • +

    disrupt decentralized group state by sending different messages that change group state (such as adding or removing members, member role changes, etc.) to different group members, or sending such messages selectively.

    +
  • +
+

cannot:

+
    +
  • prove that two group members with incognito profiles is the same user.
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/protocol/simplex-chat.schema.json b/docs/protocol/simplex-chat.schema.json new file mode 100644 index 0000000000..4614ba6929 --- /dev/null +++ b/docs/protocol/simplex-chat.schema.json @@ -0,0 +1,823 @@ +{ + "metadata": { + "description": "JTD schema for SimpleX Chat Protocol messages for chat functions" + }, + "definitions": { + "profile": { + "properties": { + "displayName": { + "type": "string", + "metadata": { + "format": "non-empty string, the first character must not be # or @" + } + }, + "fullName": {"type": "string"} + }, + "optionalProperties": { + "image": { + "type": "string", + "metadata": { + "format": "data URI format for base64 encoded image" + } + }, + "shortDescr": { + "type": "string", + "metadata": {"comment": "profile bio (160 characters)"} + }, + "contactLink": {"ref": "connReqUri"}, + "peerType": {"enum": ["human", "bot"]}, + "preferences": { + "optionalProperties": { + "commands": { + "elements": {"ref": "command"} + } + }, + "additionalProperties": true, + "metadata": { + "format": "an object with user or contact preferences" + } + } + }, + "additionalProperties": true + }, + "groupProfile": { + "properties": { + "displayName": { + "type": "string", + "metadata": { + "format": "non-empty string, the first character must not be # or @" + } + }, + "fullName": {"type": "string"} + }, + "optionalProperties": { + "image": { + "type": "string", + "metadata": { + "format": "data URI format for base64 encoded image" + } + }, + "shortDescr": { + "type": "string", + "metadata": {"comment": "group purpose / short description (160 characters)"} + }, + "groupPreferences": { + "optionalProperties": { + "commands": { + "elements": {"ref": "command"} + } + }, + "additionalProperties": "true", + "metadata": { + "format": "an object with group preferences" + } + } + }, + "additionalProperties": true + }, + "command": { + "discriminator": "type", + "mapping": { + "command": { + "properties": { + "keyword": { + "type": "string", + "metadata": {"format": "Must start from / and consist from letters, digits and underscores only, no punctuation or spaces"} + }, + "label": { + "type": "string", + "metadata": {"comment": "shown to the user after command keyword in menus"} + } + }, + "optionalProperties": { + "params": { + "type": "string", + "metadata": {"comment": "Params that can follow after keyword using command-line syntax. If params property is not present, command will be sent on selection"}} + }, + "hidden": { + "type": "bool", + "metadata": {"comment": "Won't be shown in menu when true"} + } + } + }, + "menu": { + "properties": { + "label": {"type": "string"}, + "commands": { + "elements": {"ref": "command"} + } + } + } + } + }, + "msgContainer": { + "properties": { + "content": {"ref": "msgContent"} + }, + "optionalProperties": { + "file": {"ref": "fileInvitation"}, + "ttl": {"type": "integer"}, + "live": {"type": "boolean"}, + "quote": { + "properties": { + "msgRef": {"ref": "msgRef"}, + "content": {"ref": "msgContent"} + } + }, + "forward": {"type": "boolean"} + }, + "metadata": { + "comment": "optional properties `quote` and `forward` are mutually exclusive" + } + }, + "msgContent": { + "discriminator": "type", + "mapping": { + "text": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "non-empty"}} + } + }, + "link": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "non-empty"}}, + "preview": {"ref": "linkPreview"} + } + }, + "image": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "can be empty"}}, + "image": {"ref": "base64url"} + } + }, + "video": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "can be empty"}}, + "image": {"ref": "base64url"}, + "duration": {"type": "integer"} + } + }, + "voice": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "can be empty"}}, + "duration": {"type": "integer"} + } + }, + "file": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "can be empty"}} + } + }, + "report": { + "properties": { + "text": {"type": "string", "metadata": {"comment": "can be empty, includes report reason for old clients"}}, + "reason": {"enum": ["spam", "illegal", "community", "other"]} + } + } + }, + "metadata": { + "comment": "it is RECOMMENDED that the clients support other values in `type` properties showing them as text messages in case `text` property is present" + } + }, + "msgReaction" : { + "discriminator": "type", + "mapping": { + "emoji": { + "properties": { + "emoji": { + "type": "string", + "metadata": {"comment": "emoji character"} + } + } + } + } + }, + "msgRef": { + "properties": { + "msgId": {"ref": "base64url"}, + "sentAt": { + "type": "string", + "metadata": { + "format": "ISO8601 UTC time of the message" + } + }, + "sent": {"type": "boolean"} + }, + "optionalProperties": { + "memberId": {"ref": "base64url"}, + "metadata": { + "comment": "memberId must be present in all group message references, both for sent and received" + } + } + }, + "fileInvitation": { + "properties": { + "fileName": {"type": "string"}, + "fileSize": {"type": "uint32"} + }, + "optionalProperties": { + "fileDigest": {"ref": "base64url"}, + "fileConnReq": {"ref": "connReqUri"}, + "fileDescr": {"ref": "fileDescription"} + } + }, + "fileDescription": { + "properties": { + "fileDescrText": { + "type": "string", + "metadata": { + "format": "XFTP file description part text" + } + }, + "fileDescrPartNo": { + "type": "integer", + "metadata": { + "format": "XFTP file description part number" + } + }, + "fileDescrComplete": { + "type": "boolean", + "metadata": { + "format": "XFTP file description completion marker" + } + } + } + }, + "linkPreview": { + "properties": { + "uri": {"type": "string"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "image": {"ref": "base64url"} + }, + "optionalProperties": { + "content": {"ref": "linkContent"} + } + }, + "linkContent": { + "discriminator": "type", + "mapping": { + "page": {}, + "image": {}, + "video": { + "optionalProperties": { + "duration": {"type": "integer"} + } + } + } + }, + "groupInvitation": { + "properties": { + "fromMember": {"ref": "memberIdRole"}, + "invitedMember": {"ref": "memberIdRole"}, + "connRequest": {"ref": "connReqUri"}, + "groupProfile": {"ref": "groupProfile"} + }, + "optionalProperties": { + "groupLinkId": {"ref": "base64url"}, + "groupSize": {"type": "integer"}, + "metadata": { + "comment": "groupLinkId is used to identify invitation via group link" + } + } + }, + "groupLinkInvitation": { + "properties": { + "fromMember": {"ref": "memberIdRole"}, + "fromMemberName": {"type": "string"}, + "invitedMember": {"ref": "memberIdRole"}, + "groupProfile": {"ref": "groupProfile"} + }, + "optionalProperties": { + "groupSize": {"type": "integer"} + } + }, + "memberIdRole": { + "properties": { + "memberId": {"ref": "base64url"}, + "memberRole": {"ref": "groupMemberRole"} + } + }, + "memberInfo": { + "properties": { + "memberId": {"ref": "base64url"}, + "memberRole": {"ref": "groupMemberRole"}, + "profile": {"ref": "profile"} + }, + "optionalProperties": { + "v": {"ref": "chatVersionRange"} + } + }, + "memberRestrictions": { + "properties": { + "restriction": {"ref": "memberRestrictionStatus"} + } + }, + "memberRestrictionStatus": { + "enum": ["blocked", "unrestricted"] + }, + "chatVersionRange": { + "type": "string", + "metadata": { + "format": "chat version range string encoded as `-`, or as `` if min = max" + } + }, + "introInvitation": { + "properties": { + "groupConnReq": {"ref": "connReqUri"} + }, + "optionalProperties": { + "directConnReq": {"ref": "connReqUri"} + } + }, + "groupMemberRole": { + "enum": ["observer", "author", "member", "admin", "owner"] + }, + "callInvitation": { + "properties": { + "callType": {"ref": "callType"} + }, + "optionalProperties": { + "callDhPubKey": {"ref": "base64url"} + } + }, + "callOffer": { + "properties": { + "callType": {"ref": "callType"}, + "rtcSession": {"ref": "webRTCSession"} + }, + "optionalProperties": { + "callDhPubKey": {"ref": "base64url"} + } + }, + "callAnswer": { + "properties": { + "rtcSession": {"ref": "webRTCSession"} + } + }, + "callExtraInfo": { + "properties": { + "rtcExtraInfo": { + "properties": { + "rtcIceCandidates": {"type": "string"} + } + } + } + }, + "callType": { + "properties": { + "media": {"enum": ["audio", "video"]}, + "capabilities": { + "properties": { + "encryption": {"type": "boolean"} + } + } + } + }, + "webRTCSession": { + "properties": { + "rtcSession": {"type": "string"}, + "rtcIceCandidates": {"type": "string"} + } + }, + "base64url": { + "type": "string", + "metadata": { + "format": "base64url encoded string" + } + }, + "connReqUri": { + "type": "string", + "metadata": { + "format": "URI for connection request" + } + } + }, + "discriminator": "event", + "mapping": { + "x.contact": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "profile": {"ref": "profile"}, + "contactReqId": {"ref": "base64url"} + } + } + } + }, + "x.info": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "profile": {"ref": "profile"} + } + } + } + }, + "x.info.probe": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "probe": {"ref": "base64url"} + } + } + } + }, + "x.info.probe.check": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "probeHash": {"ref": "base64url"} + } + } + } + }, + "x.info.probe.ok": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "probe": {"ref": "base64url"} + } + } + } + }, + "x.msg.new": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": {"ref": "msgContainer"} + } + }, + "x.msg.file.descr": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"}, + "fileDescr": {"ref": "fileDescription"} + } + } + } + }, + "x.msg.update": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"}, + "content": {"ref": "msgContent"} + }, + "optionalProperties": { + "ttl": {"type": "integer"}, + "live": {"type": "boolean"} + } + } + } + }, + "x.msg.del": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"} + }, + "optionalProperties": { + "memberId": {"ref": "base64url"} + } + } + } + }, + "x.msg.react": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"}, + "reaction": {"ref": "msgReaction"}, + "add": {"type": "boolean"} + }, + "optionalProperties": { + "memberId": {"ref": "base64url"} + } + } + } + }, + "x.file.acpt": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "fileName": {"type": "string"} + } + } + } + }, + "x.file.acpt.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"}, + "fileName": {"type": "string"} + }, + "optionalProperties": { + "fileConnReq": {"ref": "connReqUri"} + } + } + } + }, + "x.file.cancel": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "msgId": {"ref": "base64url"} + } + } + } + }, + "x.direct.del": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": {} + } + } + }, + "x.grp.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "groupInvitation": {"ref": "groupInvitation"} + } + } + } + }, + "x.grp.acpt": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"} + } + } + } + }, + "x.grp.link.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "groupLinkInvitation": {"ref": "groupLinkInvitation"} + } + } + } + }, + "x.grp.link.mem": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "profile": {"ref": "profile"} + } + } + } + }, + "x.grp.mem.new": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberInfo": {"ref": "memberInfo"} + } + } + } + }, + "x.grp.mem.intro": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberInfo": {"ref": "memberInfo"} + }, + "optionalProperties": { + "memberRestrictions": {"ref": "memberRestrictions"} + } + } + } + }, + "x.grp.mem.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"}, + "memberIntro": {"ref": "introInvitation"} + } + } + } + }, + "x.grp.mem.fwd": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberInfo": {"ref": "memberInfo"}, + "memberIntro": {"ref": "introInvitation"} + } + } + } + }, + "x.grp.mem.info": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"}, + "profile": {"ref": "profile"} + } + } + } + }, + "x.grp.mem.role": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"}, + "role": {"ref": "groupMemberRole"} + } + } + } + }, + "x.grp.mem.restrict": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"}, + "memberRestrictions": {"ref": "memberRestrictions"} + } + } + } + }, + "x.grp.mem.con": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"} + } + } + } + }, + "x.grp.mem.del": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"} + } + } + } + }, + "x.grp.leave": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": {} + } + } + }, + "x.grp.del": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": {} + } + } + }, + "x.grp.info": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "groupProfile": {"ref": "groupProfile"} + } + } + } + }, + "x.grp.prefs": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "groupPreferences": {"ref": "groupPreferences"} + } + } + } + }, + "x.grp.direct.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "connReq": {"ref": "connReqUri"} + }, + "optionalProperties": { + "content": {"ref": "msgContent"} + } + } + } + }, + "x.grp.msg.forward": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "memberId": {"ref": "base64url"}, + "msg": { + "type": "string", + "metadata": { + "format": "JSON encoded chat message" + } + }, + "msgTs": { + "type": "string", + "metadata": { + "format": "ISO8601 UTC time of the message" + } + } + } + } + } + }, + "x.call.inv": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "callId": {"ref": "base64url"}, + "invitation": {"ref": "callInvitation"} + } + } + } + }, + "x.call.offer": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "callId": {"ref": "base64url"}, + "offer": {"ref": "callOffer"} + } + } + } + }, + "x.call.answer": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "callId": {"ref": "base64url"}, + "answer": {"ref": "callAnswer"} + } + } + } + }, + "x.call.extra": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "callId": {"ref": "base64url"}, + "extra": {"ref": "callExtraInfo"} + } + } + } + }, + "x.call.end": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": { + "callId": {"ref": "base64url"} + } + } + } + }, + "x.ok": { + "properties": { + "msgId": {"ref": "base64url"}, + "params": { + "properties": {} + } + } + } + } +} diff --git a/docs/server.html b/docs/server.html new file mode 100644 index 0000000000..46fe1177c4 --- /dev/null +++ b/docs/server.html @@ -0,0 +1,2916 @@ + + + + + + + + + Hosting your own SMP Server + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Hosting your own SMP Server

+

| Updated 12.10.2024 | Languages: EN, FR, CZ, PL |

+

Table of Contents

+ +

Overview

+

SMP server is the relay server used to pass messages in SimpleX network. SimpleX Chat apps have preset servers (for mobile apps these are smp11, smp12 and smp14.simplex.im), but you can easily change app configuration to use other servers.

+

SimpleX clients only determine which server is used to receive the messages, separately for each contact (or group connection with a group member), and these servers are only temporary, as the delivery address can change.

+

To create SMP server, you'll need:

+
    +
  1. VPS or any other server.
  2. +
  3. Your own domain, pointed at the server (smp.example.com)
  4. +
  5. A basic Linux knowledge.
  6. +
+

Please note: when you change the servers in the app configuration, it only affects which servers will be used for the new contacts, the existing contacts will not automatically move to the new servers, but you can move them manually using "Change receiving address" button in contact/member information pages – it will be automated in the future.

+

Quick start

+

To create SMP server as a systemd service, you'll need:

+
    +
  • VPS or any other server.
  • +
  • Your server domain, with A and AAAA records specifying server IPv4 and IPv6 addresses (smp1.example.com)
  • +
  • A basic Linux knowledge.
  • +
+

Please note: while you can run an SMP server without a domain name, in the near future client applications will start using server domain name in the invitation links (instead of simplex.chat domain they use now). In case a server does not have domain name and server pages (see below), the clients will be generaing the links with simplex: scheme that cannot be opened in the browsers.

+
    +
  1. +

    Install server with Installation script.

    +
  2. +
  3. +

    Adjust firewall:

    +
    ufw allow 80/tcp &&\
    +ufw allow 443/tcp &&\
    +ufw allow 5223/tcp
    +
    +
  4. +
  5. +

    Init server:

    +

    Replace smp1.example.com with your actual server domain.

    +
    su smp -c 'smp-server init --yes \
    +                        --store-log \
    +                        --no-password \
    +                        --control-port \
    +                        --socks-proxy \
    +                        --source-code \
    +                        --fqdn=smp1.example.com
    +
    +
  6. +
  7. +

    Install tor:

    +
    CODENAME="$(lsb_release -c | awk '{print $2}')"
    +
    +echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main
    +deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list &&\
    +curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null &&\
    +apt update && apt install -y tor deb.torproject.org-keyring
    +
    +
  8. +
  9. +

    Configure tor:

    +
    tor-instance-create tor2 &&\
    +mkdir /var/lib/tor/simplex-smp/ &&\
    +chown debian-tor:debian-tor /var/lib/tor/simplex-smp/ &&\
    +chmod 700 /var/lib/tor/simplex-smp/
    +
    +
    vim /etc/tor/torrc
    +
    +

    Paste the following:

    +
    # Enable log (otherwise, tor doesn't seem to deploy onion address)
    +Log notice file /var/log/tor/notices.log
    +# Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonimity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, keep standard configuration.
    +SOCKSPort 0
    +HiddenServiceNonAnonymousMode 1
    +HiddenServiceSingleHopMode 1
    +# smp-server hidden service host directory and port mappings
    +HiddenServiceDir /var/lib/tor/simplex-smp/
    +HiddenServicePort 5223 localhost:5223
    +HiddenServicePort 443 localhost:443
    +
    +
    vim /etc/tor/instances/tor2/torrc
    +
    +

    Paste the following:

    +
    # Log tor to systemd daemon
    +Log notice syslog
    +# Listen to local 9050 port for socks proxy
    +SocksPort 9050
    +
    +
  10. +
  11. +

    Start tor:

    +
    systemctl enable tor &&\
    +systemctl start tor &&\
    +systemctl restart tor &&\
    +systemctl enable --now tor@tor2
    +
    +
  12. +
  13. +

    Install Caddy:

    +
    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl &&\
    +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg &&\
    +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list &&\
    +sudo apt update && sudo apt install caddy
    +
    +
  14. +
  15. +

    Configure Caddy:

    +
    vim /etc/caddy/Caddyfile
    +
    +

    Replace smp1.example.com with your actual server domain. Paste the following:

    +
    http://smp1.example.com {
    +   redir https://smp1.example.com{uri} permanent
    +}
    +
    +smp1.example.com:8443 {
    +   tls {
    +      key_type rsa4096
    +   }
    +}
    +
    +
    vim /usr/local/bin/simplex-servers-certs
    +
    +

    Replace smp1.example.com with your actual server domain. Paste the following:

    +
    #!/usr/bin/env sh
    +set -eu
    +
    +user='smp'
    +group="$user"
    +
    +domain='smp1.example.com'
    +folder_in="/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/${domain}"
    +folder_out='/etc/opt/simplex'
    +key_name='web.key'
    +cert_name='web.crt'
    +
    +# Copy certifiacte from Caddy directory to smp-server directory
    +cp "${folder_in}/${domain}.crt" "${folder_out}/${cert_name}"
    +# Assign correct permissions
    +chown "$user":"$group" "${folder_out}/${cert_name}"
    +
    +# Copy certifiacte key from Caddy directory to smp-server directory
    +cp "${folder_in}/${domain}.key" "${folder_out}/${key_name}"
    +# Assign correct permissions
    +chown "$user":"$group" "${folder_out}/${key_name}"
    +
    +
    chmod +x /usr/local/bin/simplex-servers-certs
    +
    +
    sudo crontab -e
    +
    +

    Paste the following:

    +
    # Every week on 00:20 sunday
    +20 0 * * 0 /usr/local/bin/simplex-servers-certs
    +
    +
  16. +
  17. +

    Enable and start Caddy service:

    +

    Wait until "good to go" has been printed.

    +
    systemctl enable --now caddy &&\
    +sleep 10 &&\
    +/usr/local/bin/simplex-servers-certs &&\
    +echo 'good to go'
    +
    +
  18. +
  19. +

    Enable and start smp-server:

    +
    systemctl enable --now smp-server.service
    +
    +
  20. +
  21. +

    Print your address:

    +
    smp="$(journalctl --output cat -q _SYSTEMD_INVOCATION_ID="$(systemctl show -p InvocationID --value smp-server)" | grep -m1 'Server address:' | awk '{print $NF}' | sed 's/:443.*//')"
    +tor="$(cat /var/lib/tor/simplex-smp/hostname)"
    +
    +echo "$smp,$tor"
    +
    +
  22. +
+

Installation options

+

You can install SMP server in one of the following ways:

+ +

systemd service

+

Installation script

+

This installation script will automatically install binaries, systemd services and additional scripts that will manage backups, updates and uninstallation. This is the recommended option due to its flexibility, easy updating, and being battle tested on our servers.

+

Please note that currently only Ubuntu distribution is supported.

+

Run the following script on the server:

+
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/install.sh -o simplex-server-install.sh &&\
+if echo '53fcdb4ceab324316e2c4cda7e84dbbb344f32550a65975a7895425e5a1be757 simplex-server-install.sh' | sha256sum -c; then
+  chmod +x ./simplex-server-install.sh
+  ./simplex-server-install.sh
+  rm ./simplex-server-install.sh
+else
+  echo "SHA-256 checksum is incorrect!"
+  rm ./simplex-server-install.sh
+fi
+
+

Type 1 and hit enter to install smp-server.

+

Manual deployment

+

Manual installation is the most advanced deployment that provides the most flexibility. Generally recommended only for advanced users.

+
    +
  1. +

    Install binary:

    +
      +
    • +

      Using pre-compiled binaries:

      +
      curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/smp-server && chmod +x /usr/local/bin/smp-server
      +
      +
    • +
    • +

      Compiling from source:

      +

      Please refer to Build from source: Using your distribution

      +
    • +
    +
  2. +
  3. +

    Create user and group for smp-server:

    +
    sudo useradd -m smp
    +
    +
  4. +
  5. +

    Create necessary directories and assign permissions:

    +
    sudo mkdir -p /var/opt/simplex /etc/opt/simplex
    +sudo chown smp:smp /var/opt/simplex /etc/opt/simplex
    +
    +
  6. +
  7. +

    Allow smp-server port in firewall:

    +
    # For Ubuntu
    +sudo ufw allow 5223/tcp
    +sudo ufw allow 443/tcp
    +sudo ufw allow 80/tcp
    +# For Fedora
    +sudo firewall-cmd --permanent --add-port=5223/tcp --add-port=443/tcp --add-port=80/tcp && \
    +sudo firewall-cmd --reload
    +
    +
  8. +
  9. +

    Optional — If you're using distribution with systemd, create /etc/systemd/system/smp-server.service file with the following content:

    +
    [Unit]
    +Description=SMP server systemd service
    +
    +[Service]
    +User=smp
    +Group=smp
    +Type=simple
    +ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
    +ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
    +LimitNOFILE=65535
    +KillSignal=SIGINT
    +TimeoutStopSec=infinity
    +AmbientCapabilities=CAP_NET_BIND_SERVICE
    +
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    And execute sudo systemctl daemon-reload.

    +
  10. +
+

Docker container

+

You can deploy smp-server using Docker Compose. This is second recommended option due to its popularity and relatively easy deployment.

+

This deployment provides two Docker Compose files: the automatic one and manual. If you're not sure, choose automatic.

+

This will download images from Docker Hub.

+

Docker: Automatic setup

+

This configuration provides quick and easy way to setup your SMP server: Caddy will automatically manage Let's Encrypt certificates and redirect HTTP to HTTPS, while smp-server will serve both server information page and SMP Protocol by 443 port. 5223 port is used as fallback.

+

Please note that you must have 80 and 443 ports unallocated by other servers.

+
    +
  1. Create smp-server directory and switch to it:
  2. +
+
mkdir smp-server && cd smp-server
+
+
    +
  1. Create docker-compose.yml file with the following content:
  2. +
+

You can also grab it from here - docker-compose-smp-complete.yml. Don't forget to rename it to docker-compose.yml.

+
name: SimpleX Chat - smp-server
+
+services:
+  oneshot:
+    image: ubuntu:latest
+    environment:
+      CADDYCONF: |
+        ${CADDY_OPTS:-}
+
+        http://{$$ADDR} {
+            redir https://{$$ADDR}{uri} permanent
+        }
+
+        {$$ADDR}:8443 {
+            tls {
+                key_type rsa4096
+            }
+        }
+    command: sh -c 'if [ ! -f /etc/caddy/Caddyfile ]; then printf "$${CADDYCONF}" > /etc/caddy/Caddyfile; fi'
+    volumes:
+      - ./caddy_conf:/etc/caddy
+
+  caddy:
+    image: caddy:latest
+    depends_on:
+      oneshot:
+        condition: service_completed_successfully
+    cap_add:
+      - NET_ADMIN
+    environment:
+      ADDR: ${ADDR?"Please specify the domain."}
+    volumes:
+      - ./caddy_conf:/etc/caddy
+      - caddy_data:/data
+      - caddy_config:/config
+    ports:
+      - 80:80
+    restart: unless-stopped
+    healthcheck:
+      test: "test -d /data/caddy/certificates/${CERT_PATH:-acme-v02.api.letsencrypt.org-directory}/${ADDR} || exit 1"
+      interval: 1s
+      retries: 60
+
+  smp-server:
+    image: ${SIMPLEX_IMAGE:-simplexchat/smp-server:latest}
+    depends_on:
+      caddy:
+        condition: service_healthy
+    environment:
+      ADDR: ${ADDR?"Please specify the domain."}
+      PASS: ${PASS:-}
+    volumes:
+      - ./smp_configs:/etc/opt/simplex
+      - ./smp_state:/var/opt/simplex
+      - type: volume
+        source: caddy_data
+        target: /certificates
+        volume:
+          subpath: "caddy/certificates/${CERT_PATH:-acme-v02.api.letsencrypt.org-directory}/${ADDR}"
+    ports:
+      - 443:443
+      - 5223:5223
+    restart: unless-stopped
+
+volumes:
+  caddy_data:
+  caddy_config:
+
+
    +
  1. In the same directory, create .env file with the following content:
  2. +
+

You can also grab it from here - docker-compose-smp-complete.env. Don't forget to rename it to .env.

+

Change variables according to your preferences.

+
# Mandatory
+ADDR=your_ip_or_addr
+
+# Optional
+#PASS='123123'
+
+
    +
  1. Start your containers:
  2. +
+
docker compose up
+
+

Docker: Manual setup

+

If you know what you are doing, this configuration provides bare SMP server setup without automatically managed Let's Encrypt certificates by Caddy to serve server information page with 5223 port set as primary.

+

This configuration allows you to retain the ability to manage 80 and 443 ports yourself. As a downside, SMP server *can not be served to 443 port.

+
    +
  1. Create smp-server directory and switch to it:
  2. +
+
mkdir smp-server && cd smp-server
+
+
    +
  1. Create docker-compose.yml file with the following content:
  2. +
+

You can also grab it from here - docker-compose-smp-manual.yml. Don't forget to rename it to docker-compose.yml.

+
name: SimpleX Chat - smp-server
+
+services:
+  smp-server:
+    image: ${SIMPLEX_IMAGE:-simplexchat/smp-server:latest}
+    environment:
+      WEB_MANUAL: ${WEB_MANUAL:-1}
+      ADDR: ${ADDR?"Please specify the domain."}
+      PASS: ${PASS:-}
+    volumes:
+      - ./smp_configs:/etc/opt/simplex
+      - ./smp_state:/var/opt/simplex
+    ports:
+      - 5223:5223
+    restart: unless-stopped
+
+
    +
  1. In the same directory, create .env file with the following content:
  2. +
+

You can also grab it from here - docker-compose-smp-manual.env. Don't forget to rename it to .env.

+

Change variables according to your preferences.

+
# Mandatory
+ADDR=your_ip_or_addr
+
+# Optional
+#PASS='123123'
+WEB_MANUAL=1
+
+
    +
  1. Start your containers:
  2. +
+
docker compose up
+
+

Linode marketplace

+

You can deploy smp-server upon creating new Linode VM. Please refer to: Linode Marketplace

+

Verifying server binaries

+

Starting from v6.3 server builds are reproducible.

+

That also allows us to sign server releases, confirming the integrity of GitHub builds.

+

To verify server binaries after you downloaded them:

+
    +
  1. +

    Download _sha256sums (hashes of all server binaries) and _sha256sums.asc (signature).

    +
  2. +
  3. +

    Download our key FB44AF81A45BDE327319797C85107E357D4A17FC from openpgp.org

    +
  4. +
  5. +

    Import the key with gpg --import FB44AF81A45BDE327319797C85107E357D4A17FC. Key filename should be the same as its fingerprint, but please change it if necessary.

    +
  6. +
  7. +

    Run gpg --verify _sha256sums.asc _sha256sums. It should print:

    +
  8. +
+
+

Good signature from "SimpleX Chat chat@simplex.chat"

+
+
    +
  1. Compute the hashes of the binaries you plan to use with shu256sum <file> or with openssl sha256 <file> and compare them with the hashes in the file _sha256sums - they must be the same.
  2. +
+

That is it - you now verified authenticity of our GitHub server binaries.

+

Configuration

+

To see which options are available, execute smp-server without flags:

+
sudo su smp -c smp-server
+
+...
+Available commands:
+  init                     Initialize server - creates /etc/opt/simplex and
+                           /var/opt/simplex directories and configuration files
+  start                    Start server (configuration:
+                           /etc/opt/simplex/smp-server.ini)
+  delete                   Delete configuration and log files
+
+

You can get further help by executing sudo su smp -c "smp-server <command> -h"

+

After that, we need to configure smp-server:

+

Interactively

+

Execute the following command:

+
sudo su smp -c "smp-server init"
+
+

There are several options to consider:

+
    +
  • +

    Enable store log to restore queues and messages on server restart (Yn):

    +

    Enter y to enable saving and restoring connections and messages when the server is restarted.

    +

    Please note: it is important to use SIGINT to restart the server, as otherwise the undelivered messages will not be restored. The connections will be restored irrespective of how the server is restarted, as unlike messages they are added to append-only log on every change.

    +
  • +
  • +

    Enable logging daily statistics (yN):

    +

    Enter y to enable logging statistics in CSV format, e.g. they can be used to show aggregate usage charts in Grafana.

    +
  • +
+

These statistics include daily counts of created, secured and deleted queues, sent and received messages, and also daily, weekly, and monthly counts of active queues (that is, the queues that were used for any messages). We believe that this information does not include anything that would allow correlating different queues as belonging to the same users, but please let us know, confidentially, if you believe that this can be exploited in any way.

+
    +
  • +

    Require a password to create new messaging queues?

    +

    Press Enter or enter your arbitrary password to password-protect smp-server, or n to disable password protection.

    +
  • +
  • +

    Enter server FQDN or IP address for certificate (127.0.0.1):

    +

    Enter your domain or ip address that your smp-server is running on - it will be included in server certificates and also printed as part of server address.

    +
  • +
+

Via command line options

+

Execute the following command:

+
sudo su smp -c "smp-server init -h"
+
+...
+Available options:
+  -l,--store-log           Enable store log for persistence
+  -s,--daily-stats         Enable logging daily server statistics
+  -a,--sign-algorithm ALG  Signature algorithm used for TLS certificates:
+                           ED25519, ED448 (default: ED448)
+  --ip IP                  Server IP address, used as Common Name for TLS online
+                           certificate if FQDN is not supplied
+                           (default: "127.0.0.1")
+  -n,--fqdn FQDN           Server FQDN used as Common Name for TLS online
+                           certificate
+  --no-password            Allow creating new queues without password
+  --password PASSWORD      Set password to create new messaging queues
+  -y,--yes                 Non-interactive initialization using command-line
+                           options
+  -h,--help                Show this help text
+
+

You should determine which flags are needed for your use-case and then execute smp-server init with -y flag for non-interactive initialization:

+
sudo su smp -c "smp-server init -y -<your flag> <your option>"
+
+

For example, run:

+
sudo su smp -c "smp-server init -y -l --ip 192.168.1.5 --password test"
+
+

to initialize your smp-server configuration with:

+
    +
  • restoring connections and messages when the server is restarted (-l flag),
  • +
  • IP address 192.168.1.5,
  • +
  • protect smp-server with a password test.
  • +
+
+

After that, your installation is complete and you should see in your teminal output something like this:

+
Certificate request self-signature ok
+subject=CN = 127.0.0.1
+Server initialized, you can modify configuration in /etc/opt/simplex/smp-server.ini.
+Run `smp-server start` to start server.
+----------
+You should store CA private key securely and delete it from the server.
+If server TLS credential is compromised this key can be used to sign a new one, keeping the same server identity and established connections.
+CA private key location: /etc/opt/simplex/ca.key
+----------
+SMP server v3.4.0
+Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+
+

The server address above should be used in your client configuration, and if you added server password it should only be shared with the other people who you want to allow using your server to receive the messages (all your contacts will be able to send messages - it does not require a password). If you passed IP address or hostnames during the initialisation, they will be printed as part of server address, otherwise replace <hostnames> with the actual server hostnames.

+

Further configuration

+

All generated configuration, along with a description for each parameter, is available inside configuration file in /etc/opt/simplex/smp-server.ini for further customization. Depending on the smp-server version, the configuration file looks something like this:

+
[INFORMATION]
+# AGPLv3 license requires that you make any source code modifications
+# available to the end users of the server.
+# LICENSE: https://github.com/simplex-chat/simplexmq/blob/stable/LICENSE
+# Include correct source code URI in case the server source code is modified in any way.
+# If any other information fields are present, source code property also MUST be present.
+
+source_code: https://github.com/simplex-chat/simplexmq
+
+# Declaring all below information is optional, any of these fields can be omitted.
+
+# Server usage conditions and amendments.
+# It is recommended to use standard conditions with any amendments in a separate document.
+# usage_conditions: https://github.com/simplex-chat/simplex-chat/blob/stable/PRIVACY.md
+# condition_amendments: link
+
+# Server location and operator.
+# server_country: ISO-3166 2-letter code
+# operator: entity (organization or person name)
+# operator_country: ISO-3166 2-letter code
+# website:
+
+# Administrative contacts.
+# admin_simplex: SimpleX address
+# admin_email:
+# admin_pgp:
+# admin_pgp_fingerprint:
+
+# Contacts for complaints and feedback.
+# complaints_simplex: SimpleX address
+# complaints_email:
+# complaints_pgp:
+# complaints_pgp_fingerprint:
+
+# Hosting provider.
+# hosting: entity (organization or person name)
+# hosting_country: ISO-3166 2-letter code
+
+[STORE_LOG]
+# The server uses STM memory for persistence,
+# that will be lost on restart (e.g., as with redis).
+# This option enables saving memory to append only log,
+# and restoring it when the server is started.
+# Log is compacted on start (deleted objects are removed).
+enable: on
+
+# Undelivered messages are optionally saved and restored when the server restarts,
+# they are preserved in the .bak file until the next restart.
+restore_messages: on
+expire_messages_days: 21
+expire_ntfs_hours: 24
+
+# Log daily server statistics to CSV file
+log_stats: on
+
+[AUTH]
+# Set new_queues option to off to completely prohibit creating new messaging queues.
+# This can be useful when you want to decommission the server, but not all connections are switched yet.
+new_queues: on
+
+# Use create_password option to enable basic auth to create new messaging queues.
+# The password should be used as part of server address in client configuration:
+# smp://fingerprint:password@host1,host2
+# The password will not be shared with the connecting contacts, you must share it only
+# with the users who you want to allow creating messaging queues on your server.
+# create_password: password to create new queues (any printable ASCII characters without whitespace, '@', ':' and '/')
+
+# control_port_admin_password:
+# control_port_user_password:
+
+[TRANSPORT]
+# Host is only used to print server address on start.
+# You can specify multiple server ports.
+host: <domain/ip>
+port: 5223,443
+log_tls_errors: off
+
+# Use `websockets: 443` to run websockets server in addition to plain TLS.
+websockets: off
+# control_port: 5224
+
+[PROXY]
+# Network configuration for SMP proxy client.
+# `host_mode` can be 'public' (default) or 'onion'.
+# It defines prefferred hostname for destination servers with multiple hostnames.
+# host_mode: public
+# required_host_mode: off
+
+# The domain suffixes of the relays you operate (space-separated) to count as separate proxy statistics.
+# own_server_domains: 
+
+# SOCKS proxy port for forwarding messages to destination servers.
+# You may need a separate instance of SOCKS proxy for incoming single-hop requests.
+# socks_proxy: localhost:9050
+
+# `socks_mode` can be 'onion' for SOCKS proxy to be used for .onion destination hosts only (default)
+# or 'always' to be used for all destination hosts (can be used if it is an .onion server).
+# socks_mode: onion
+
+# Limit number of threads a client can spawn to process proxy commands in parrallel.
+# client_concurrency: 32
+
+[INACTIVE_CLIENTS]
+# TTL and interval to check inactive clients
+disconnect: off
+# ttl: 21600
+# check_interval: 3600
+
+[WEB]
+# Set path to generate static mini-site for server information and qr codes/links
+static_path: /var/opt/simplex/www
+
+# Run an embedded server on this port
+# Onion sites can use any port and register it in the hidden service config.
+# Running on a port 80 may require setting process capabilities.
+#http: 8000
+
+# You can run an embedded TLS web server too if you provide port and cert and key files.
+# Not required for running relay on onion address.
+https: 443
+cert: /etc/opt/simplex/web.crt
+key: /etc/opt/simplex/web.key
+
+

Server security

+

Initialization

+

Although it's convenient to initialize smp-server configuration directly on the server, operators ARE ADVISED to initialize smp-server fully offline to protect your SMP server CA private key.

+

Follow the steps to quickly initialize the server offline:

+
    +
  1. +

    Install Docker on your system.

    +
  2. +
  3. +

    Deploy smp-server locally.

    +
  4. +
  5. +

    Destroy the container. All relevant configuration files and keys will be available at $HOME/simplex/smp/config.

    +
  6. +
  7. +

    Move your CA private key (ca.key) to the safe place. For further explanation, see the next section: Server security: Private keys.

    +
  8. +
  9. +

    Copy all other configuration files except the CA key to the server:

    +
    rsync -hzasP $HOME/simplex/smp/config/ <server_user>@<server_address>:/etc/opt/simplex/
    +
    +
  10. +
+

Private keys

+

Connection to the smp server occurs via a TLS connection. During the TLS handshake, the client verifies smp-server CA and server certificates by comparing its fingerprint with the one included in server address. If server TLS credential is compromised, this key can be used to sign a new one, keeping the same server identity and established connections. In order to protect your smp-server from bad actors, operators ARE ADVISED to move CA private key to a safe place. That could be:

+ +

Follow the steps to secure your CA keys:

+
    +
  1. +

    Login to your server via SSH.

    +
  2. +
  3. +

    Copy the CA key to a safe place from this file:

    +
    /etc/opt/simplex/ca.key
    +
    +
  4. +
  5. +

    Delete the CA key from the server. Please make sure you've saved you CA key somewhere safe. Otherwise, you would lose the ability to rotate the online certificate:

    +
    rm /etc/opt/simplex/ca.key
    +
    +
  6. +
+

Online certificate rotation

+

Operators of smp servers ARE ADVISED to rotate online certificate regularly (e.g., every 3 months). In order to do this, follow the steps:

+
    +
  1. +

    Create relevant folders:

    +
    mkdir -p $HOME/simplex/smp/config
    +
    +
  2. +
  3. +

    Copy the configuration files from the server to the local machine (if not yet):

    +
    rsync -hzasP <server_user>@<server_address>:/etc/opt/simplex/ $HOME/simplex/smp/config/
    +
    +
  4. +
  5. +

    Copy your CA private key from a safe place to the local machine and name it ca.key.

    +
  6. +
  7. +

    Download latest smp-server binary from Github releases:

    +
    curl -L 'https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64' -o smp-server
    +
    +
  8. +
  9. +

    Put the smp-server binary to your $PATH and make it executable:

    +
    sudo mv smp-server /usr/local/bin/ && chmod +x /usr/local/bin/smp-server
    +
    +
  10. +
  11. +

    Export a variable to configure your path to smp-server configuration:

    +
    export SMP_SERVER_CFG_PATH=$HOME/simplex/smp/config
    +
    +
  12. +
  13. +

    Execute the following command:

    +
    smp-server cert
    +
    +

    This command should print:

    +
    Certificate request self-signature ok
    +subject=CN = <your domain or IP>
    +Generated new server credentials
    +----------
    +You should store CA private key securely and delete it from the server.
    +If server TLS credential is compromised this key can be used to sign a new one, keeping the same server identity and established connections.
    +CA private key location:
    +$HOME/simplex/smp/config/ca.key
    +----------
    +
    +
  14. +
  15. +

    Remove the CA key from the config folder (make sure you have a backup!):

    +
    rm $HOME/simplex/smp/config/ca.key
    +
    +
  16. +
  17. +

    Upload new certificates to the server:

    +
    rsync -hzasP $HOME/simplex/smp/config/ <server_user>@<server_address>:/etc/opt/simplex/
    +
    +
  18. +
  19. +

    Connect to the server via SSH and restart the service:

    +
    ssh <server_user>@<server_address> "systemctl restart smp-server"
    +
    +
  20. +
  21. +

    Done!

    +
  22. +
+

Tor: installation and configuration

+

Installation for onion address

+

SMP-server can also be deployed to be available via Tor network. Run the following commands as root user.

+
    +
  1. +

    Install tor:

    +

    We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to offical tor documentation or your distribution guide.

    +
      +
    • +

      Configure offical Tor PPA repository:

      +
      CODENAME="$(lsb_release -c | awk '{print $2}')"
      +echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main
      +deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list
      +
      +
    • +
    • +

      Import repository key:

      +
      curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
      +
      +
    • +
    • +

      Update repository index:

      +
      apt update
      +
      +
    • +
    • +

      Install tor package:

      +
      apt install -y tor deb.torproject.org-keyring
      +
      +
    • +
    +
  2. +
  3. +

    Configure tor:

    +
      +
    • +

      File configuration:

      +

      Open tor configuration with your editor of choice (nano,vim,emacs,etc.):

      +
      vim /etc/tor/torrc
      +
      +

      And insert the following lines to the bottom of configuration. Please note lines starting with #: this is comments about each individual options.

      +
      # Enable log (otherwise, tor doesn't seem to deploy onion address)
      +Log notice file /var/log/tor/notices.log
      +# Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonimity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, you may want to keep standard configuration instead.
      +SOCKSPort 0
      +HiddenServiceNonAnonymousMode 1
      +HiddenServiceSingleHopMode 1
      +# smp-server hidden service host directory and port mappings
      +HiddenServiceDir /var/lib/tor/simplex-smp/
      +HiddenServicePort 5223 localhost:5223
      +HiddenServicePort 443 localhost:443
      +
      +
    • +
    • +

      Create directories:

      +
      mkdir /var/lib/tor/simplex-smp/ && chown debian-tor:debian-tor /var/lib/tor/simplex-smp/ && chmod 700 /var/lib/tor/simplex-smp/
      +
      +
    • +
    +
  4. +
  5. +

    Start tor:

    +

    Enable systemd service and start tor. Offical tor is a bit flaky on the first start and may not create onion host address, so we're restarting it just in case.

    +
    systemctl enable --now tor && systemctl restart tor
    +
    +
  6. +
  7. +

    Display onion host:

    +

    Execute the following command to display your onion host address:

    +
    cat /var/lib/tor/simplex-smp/hostname
    +
    +
  8. +
+

SOCKS port for SMP PROXY

+

SMP-server versions starting from v5.8.0-beta.0 can be configured to PROXY smp servers available exclusively through Tor network to be accessible to the clients that do not use Tor. Run the following commands as root user.

+
    +
  1. +

    Install tor as described in the previous section.

    +
  2. +
  3. +

    Execute the following command to creatae a new Tor daemon instance:

    +
    tor-instance-create tor2
    +
    +
  4. +
  5. +

    Open the tor2 configuration and replace its content with the following lines:

    +
    vim /etc/tor/instances/tor2/torrc
    +
    +
    # Log tor to systemd daemon
    +Log notice syslog
    +# Listen to local 9050 port for socks proxy
    +SocksPort 9050
    +
    +
  6. +
  7. +

    Enable service at startup and start the daemon:

    +
    systemctl enable --now tor@tor2
    +
    +

    You can check tor2 logs with the following command:

    +
    journalctl -u tor@tor2
    +
    +
  8. +
  9. +

    After server initialization, configure the PROXY section like so:

    +
    ...
    +[PROXY]
    +socks_proxy: 127.0.0.1:9050
    +own_server_domains: <your domain suffixes if using `log_stats: on`>
    +...
    +
    +
  10. +
+

Server information page

+

SMP server SHOULD be configured to serve Web page with server information that can include admin info, server info, provider info, etc. It will also serve connection links, generated using the mobile/desktop apps. Run the following commands as root user.

+

Please note: this configuration is supported since v6.1.0-beta.2.

+
    +
  1. +

    Add the following to your smp-server configuration (please modify fields in [INFORMATION] section to include relevant information):

    +
    vim /etc/opt/simplex/smp-server.ini
    +
    +
    [TRANSPORT]
    +# host is only used to print server address on start
    +host: <domain/ip>
    +port: 443,5223
    +websockets: off
    +log_tls_errors: off
    +control_port: 5224
    +
    +[WEB]
    +https: 443
    +static_path: /var/opt/simplex/www
    +cert: /etc/opt/simplex/web.crt
    +key: /etc/opt/simplex/web.key
    +
    +[INFORMATION]
    +# AGPLv3 license requires that you make any source code modifications
    +# available to the end users of the server.
    +# LICENSE: https://github.com/simplex-chat/simplexmq/blob/stable/LICENSE
    +# Include correct source code URI in case the server source code is modified in any way.
    +# If any other information fields are present, source code property also MUST be present.
    +
    +source_code: https://github.com/simplex-chat/simplexmq
    +
    +# Declaring all below information is optional, any of these fields can be omitted.
    +
    +# Server usage conditions and amendments.
    +# It is recommended to use standard conditions with any amendments in a separate document.
    +# usage_conditions: https://github.com/simplex-chat/simplex-chat/blob/stable/PRIVACY.md
    +# condition_amendments: link
    +
    +# Server location and operator.
    +server_country: <YOUR_SERVER_LOCATION>
    +operator: <YOUR_NAME>
    +operator_country: <YOUR_LOCATION>
    +website: <WEBSITE_IF_AVAILABLE>
    +
    +# Administrative contacts.
    +#admin_simplex: SimpleX address
    +admin_email: <EMAIL>
    +# admin_pgp:
    +# admin_pgp_fingerprint:
    +
    +# Contacts for complaints and feedback.
    +# complaints_simplex: SimpleX address
    +complaints_email: <COMPLAINTS_EMAIL>
    +# complaints_pgp:
    +# complaints_pgp_fingerprint:
    +
    +# Hosting provider.
    +hosting: <HOSTING_PROVIDER_NAME>
    +hosting_country: <HOSTING_PROVIDER_LOCATION> 
    +
    +
  2. +
  3. +

    Install the webserver. For easy deployment we'll describe the installtion process of Caddy webserver on Ubuntu server:

    +
      +
    1. +

      Install the packages:

      +
      sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
      +
      +
    2. +
    3. +

      Install caddy gpg key for repository:

      +
      curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
      +
      +
    4. +
    5. +

      Install Caddy repository:

      +
      curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
      +
      +
    6. +
    7. +

      Install Caddy:

      +
      sudo apt update && sudo apt install caddy
      +
      +
    8. +
    +

    Full Caddy instllation instructions

    +
  4. +
  5. +

    Replace Caddy configuration with the following:

    +

    Please replace YOUR_DOMAIN with your actual domain (smp.example.com).

    +
    vim /etc/caddy/Caddyfile
    +
    +
    http://YOUR_DOMAIN {
    +   redir https://YOUR_DOMAIN{uri} permanent
    +}
    +
    +YOUR_DOMAIN:8443 {
    +   tls {
    +      key_type rsa4096
    +   }
    +}
    +
    +
  6. +
  7. +

    Enable and start Caddy service:

    +
    systemctl enable --now caddy
    +
    +
  8. +
  9. +

    Create script to copy certificates to your smp directory:

    +

    Please replace YOUR_DOMAIN with your actual domain (smp.example.com).

    +
    vim /usr/local/bin/simplex-servers-certs
    +
    +
    #!/usr/bin/env sh
    +set -eu
    +
    +user='smp'
    +group="$user"
    +
    +domain='HOST'
    +folder_in="/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/${domain}"
    +folder_out='/etc/opt/simplex'
    +key_name='web.key'
    +cert_name='web.crt'
    +
    +# Copy certifiacte from Caddy directory to smp-server directory
    +cp "${folder_in}/${domain}.crt" "${folder_out}/${cert_name}"
    +# Assign correct permissions
    +chown "$user":"$group" "${folder_out}/${cert_name}"
    +
    +# Copy certifiacte key from Caddy directory to smp-server directory
    +cp "${folder_in}/${domain}.key" "${folder_out}/${key_name}"
    +# Assign correct permissions
    +chown "$user":"$group" "${folder_out}/${key_name}"
    +
    +
  10. +
  11. +

    Make the script executable and execute it:

    +
    chmod +x /usr/local/bin/simplex-servers-certs && /usr/local/bin/simplex-servers-certs
    +
    +
  12. +
  13. +

    Check if certificates were copied:

    +
    ls -haltr /etc/opt/simplex/web*
    +
    +
  14. +
  15. +

    Create cronjob to copy certificates to smp directory in timely manner:

    +
    sudo crontab -e
    +
    +
    # Every week on 00:20 sunday
    +20 0 * * 0 /usr/local/bin/simplex-servers-certs
    +
    +
  16. +
  17. +

    Then:

    + +
  18. +
  19. +

    Access the webpage you've deployed from your browser (https://smp.example.org). You should see the smp-server information that you've provided in your ini file.

    +
  20. +
+

Documentation

+

All necessary files for smp-server are located in /etc/opt/simplex/ folder.

+

Stored messages, connections, statistics and server log are located in /var/opt/simplex/ folder.

+

SMP server address

+

SMP server address has the following format:

+
smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]
+
+
    +
  • +

    <fingerprint>

    +

    Your smp-server fingerprint of certificate. You can check your certificate fingerprint in /etc/opt/simplex/fingerprint.

    +
  • +
  • +

    optional <password>

    +

    Your configured password of smp-server. You can check your configured pasword in /etc/opt/simplex/smp-server.ini, under [AUTH] section in create_password: field.

    +
  • +
  • +

    <public_hostname>, optional <onion_hostname>

    +

    Your configured hostname(s) of smp-server. You can check your configured hosts in /etc/opt/simplex/smp-server.ini, under [TRANSPORT] section in host: field.

    +
  • +
+

Systemd commands

+

To start smp-server on host boot, run:

+
sudo systemctl enable smp-server.service
+
+Created symlink /etc/systemd/system/multi-user.target.wants/smp-server.service → /etc/systemd/system/smp-server.service.
+
+

To start smp-server, run:

+
sudo systemctl start smp-server.service
+
+

To check status of smp-server, run:

+
sudo systemctl status smp-server.service
+
+● smp-server.service - SMP server
+     Loaded: loaded (/etc/systemd/system/smp-server.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sat 2022-11-23 19:23:21 UTC; 1min 48s ago
+   Main PID: 30878 (smp-server)
+     CGroup: /docker/5588ab759e80546b4296a7c50ffebbb1fb7b55b8401300e9201313b720989aa8/system.slice/smp-server.service
+             └─30878 smp-server start
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

To stop smp-server, run:

+
sudo systemctl stop smp-server.service
+
+

To check tail of smp-server log, run:

+
sudo journalctl -fu smp-server.service
+
+Nov 23 19:23:21 5588ab759e80 systemd[1]: Started SMP server.
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: SMP server v3.4.0
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Fingerprint: d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Server address: smp://d5fcsc7hhtPpexYUbI2XPxDbyU2d3WsVmROimcL90ss=:V8ONoJ6ICwnrZnTC_QuSHfCEYq53uLaJKQ_oIC6-ve8=@<hostnames>
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Store log: /var/opt/simplex/smp-server-store.log
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: Listening on port 5223 (TLS)...
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: not expiring inactive clients
+Nov 23 19:23:21 5588ab759e80 smp-server[30878]: creating new queues requires password
+
+

Control port

+

Enabling control port in the configuration allows administrator to see information about the smp-server in real-time. Additionally, it allows to delete queues for content moderation and see the debug info about the clients, sockets, etc. Enabling the control port requires setting the admin and user passwords.

+
    +
  1. +

    Generate two passwords for each user:

    +
    tr -dc A-Za-z0-9 </dev/urandom | head -c 20; echo
    +
    +
  2. +
  3. +

    Open the configuration file:

    +
    vim /etc/opt/simplex/smp-server.ini
    +
    +
  4. +
  5. +

    Configure the control port and replace the passwords:

    +
    [AUTH]
    +control_port_admin_password: <your_randomly_generated_admin_password>
    +control_port_user_password: <your_randomly_generated_user_password>
    +
    +[TRANSPORT]
    +control_port: 5224
    +
    +
  6. +
  7. +

    Restart the server:

    +
    systemctl restart smp-server
    +
    +
  8. +
+

To access the control port, use:

+
nc 127.0.0.1 5224
+
+

or:

+
telnet 127.0.0.1 5224
+
+

Upon connecting, the control port should print:

+
SMP server control port
+'help' for supported commands
+
+

To authenticate, type the following and hit enter. Change the my_generated_password with the user or admin password from the configuration:

+
auth my_generated_password
+
+

Here's the full list of commands, their descriptions and who can access them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommandDescriptionRequires admin role
statsReal-time statistics. Fields described in Daily statistics-
stats-rtsGHC/Haskell statistics. Can be enabled with +RTS -T -RTS option-
clientsClients information. Useful for debugging.yes
socketsGeneral sockets information.-
socket-threadsThread infomation per socket. Useful for debugging.yes
threadsThreads information. Useful for debugging.yes
server-infoAggregated server infomation.-
deleteDelete known queue. Useful for content moderation.-
saveSave queues/messages from memory.yes
helpHelp menu.-
quitExit the control port.-
+

Daily statistics

+

You can enable smp-server statistics for Grafana dashboard by setting value on in /etc/opt/simplex/smp-server.ini, under [STORE_LOG] section in log_stats: field.

+

Logs will be stored as csv file in /var/opt/simplex/smp-server-stats.daily.log. Fields for the csv file are:

+
fromTime,qCreated,qSecured,qDeleted,msgSent,msgRecv,dayMsgQueues,weekMsgQueues,monthMsgQueues,msgSentNtf,msgRecvNtf,dayCountNtf,weekCountNtf,monthCountNtf,qCount,msgCount,msgExpired,qDeletedNew,qDeletedSecured,pRelays_pRequests,pRelays_pSuccesses,pRelays_pErrorsConnect,pRelays_pErrorsCompat,pRelays_pErrorsOther,pRelaysOwn_pRequests,pRelaysOwn_pSuccesses,pRelaysOwn_pErrorsConnect,pRelaysOwn_pErrorsCompat,pRelaysOwn_pErrorsOther,pMsgFwds_pRequests,pMsgFwds_pSuccesses,pMsgFwds_pErrorsConnect,pMsgFwds_pErrorsCompat,pMsgFwds_pErrorsOther,pMsgFwdsOwn_pRequests,pMsgFwdsOwn_pSuccesses,pMsgFwdsOwn_pErrorsConnect,pMsgFwdsOwn_pErrorsCompat,pMsgFwdsOwn_pErrorsOther,pMsgFwdsRecv,qSub,qSubAuth,qSubDuplicate,qSubProhibited,msgSentAuth,msgSentQuota,msgSentLarge,msgNtfs,msgNtfNoSub,msgNtfLost,qSubNoMsg,msgRecvGet,msgGet,msgGetNoMsg,msgGetAuth,msgGetDuplicate,msgGetProhibited,psSubDaily,psSubWeekly,psSubMonthly,qCount2,ntfCreated,ntfDeleted,ntfSub,ntfSubAuth,ntfSubDuplicate,ntfCount,qDeletedAllB,qSubAllB,qSubEnd,qSubEndB,ntfDeletedB,ntfSubB,msgNtfsB,msgNtfExpired
+
+

Fields description

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field numberField nameField Description
1fromTimeDate of statistics
Messaging queue:
2qCreatedCreated
3qSecuredEstablished
4qDeletedDeleted
Messages:
5msgSentSent
6msgRecvReceived
7dayMsgQueuesActive queues in a day
8weekMsgQueuesActive queues in a week
9monthMsgQueuesActive queues in a month
Messages with "notification" flag
10msgSentNtfSent
11msgRecvNtfReceived
12dayCountNtfActive queues in a day
13weekCountNtfActive queues in a week
14monthCountNtfActive queues in a month
Additional statistics:
15qCountStored queues
16msgCountStored messages
17msgExpiredExpired messages
18qDeletedNewNew deleted queues
19qDeletedSecuredSecured deleted queues
Requested sessions with all relays:
20pRelays_pRequests- requests
21pRelays_pSuccesses- successes
22pRelays_pErrorsConnect- connection errors
23pRelays_pErrorsCompat- compatability errors
24pRelays_pErrorsOther- other errors
Requested sessions with own relays:
25pRelaysOwn_pRequests- requests
26pRelaysOwn_pSuccesses- successes
27pRelaysOwn_pErrorsConnect- connection errors
28pRelaysOwn_pErrorsCompat- compatability errors
29pRelaysOwn_pErrorsOther- other errors
Message forwards to all relays:
30pMsgFwds_pRequests- requests
31pMsgFwds_pSuccesses- successes
32pMsgFwds_pErrorsConnect- connection errors
33pMsgFwds_pErrorsCompat- compatability errors
34pMsgFwds_pErrorsOther- other errors
Message forward to own relays:
35pMsgFwdsOwn_pRequests- requests
36pMsgFwdsOwn_pSuccesses- successes
37pMsgFwdsOwn_pErrorsConnect- connection errors
38pMsgFwdsOwn_pErrorsCompat- compatability errors
39pMsgFwdsOwn_pErrorsOther- other errors
Received message forwards:
40pMsgFwdsRecv
Message queue subscribtion errors:
41qSubAll
42qSubAuthAuthentication erorrs
43qSubDuplicateDuplicate SUB errors
44qSubProhibitedProhibited SUB errors
Message errors:
45msgSentAuthAuthentication errors
46msgSentQuotaQuota errors
47msgSentLargeLarge message errors
48msgNtfsXXXXXXXXXXXXXXXXXXXX
49msgNtfNoSubXXXXXXXXXXXXXXXXXXXX
50msgNtfLostXXXXXXXXXXXXXXXXXXXX
51qSubNoMsgRemoved, always 0
52msgRecvGetXXXXXXXXXXXXXXXXX
53msgGetXXXXXXXXXXXXXXXXX
54msgGetNoMsgXXXXXXXXXXXXXXXXX
55msgGetAuthXXXXXXXXXXXXXXXXX
56msgGetDuplicateXXXXXXXXXXXXXXXXX
57msgGetProhibitedXXXXXXXXXXXXXXXXX
58psSub_dayCountRemoved, always 0
59psSub_weekCountRemoved, always 0
60psSub_monthCountRemoved, always 0
61qCountXXXXXXXXXXXXXXXXX
62ntfCreatedXXXXXXXXXXXXXXXXX
63ntfDeletedXXXXXXXXXXXXXXXXX
64ntfSubXXXXXXXXXXXXXXXXX
65ntfSubAuthXXXXXXXXXXXXXXXXX
66ntfSubDuplicateXXXXXXXXXXXXXXXXX
67ntfCountXXXXXXXXXXXXXXXXX
68qDeletedAllBXXXXXXXXXXXXXXXXX
69qSubAllBXXXXXXXXXXXXXXXXX
70qSubEndXXXXXXXXXXXXXXXXX
71qSubEndBXXXXXXXXXXXXXXXXX
72ntfDeletedBXXXXXXXXXXXXXXXXX
73ntfSubBXXXXXXXXXXXXXXXXX
74msgNtfsBXXXXXXXXXXXXXXXXX
75msgNtfExpiredXXXXXXXXXXXXXXXXX
+

To import csv to Grafana one should:

+
    +
  1. +

    Install Grafana plugin: Grafana - CSV datasource

    +
  2. +
  3. +

    Allow local mode by appending following:

    +
    [plugin.marcusolsson-csv-datasource]
    +allow_local_mode = true
    +
    +

    ... to /etc/grafana/grafana.ini

    +
  4. +
  5. +

    Add a CSV data source:

    +
      +
    • In the side menu, click the Configuration tab (cog icon)
    • +
    • Click Add data source in the top-right corner of the Data Sources tab
    • +
    • Enter "CSV" in the search box to find the CSV data source
    • +
    • Click the search result that says "CSV"
    • +
    • In URL, enter a file that points to CSV content
    • +
    +
  6. +
  7. +

    You're done! You should be able to create your own dashboard with statistics.

    +
  8. +
+

For further documentation, see: CSV Data Source for Grafana - Documentation

+

Updating your SMP server

+

To update your smp-server to latest version, choose your installation method and follow the steps:

+
    +
  • +

    Manual deployment

    +
      +
    1. +

      Stop the server:

      +
      sudo systemctl stop smp-server
      +
      +
    2. +
    3. +

      Update the binary:

      +
       curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/smp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/smp-server && chmod +x /usr/local/bin/smp-server
      +
      +
    4. +
    5. +

      Start the server:

      +
      sudo systemctl start smp-server
      +
      +
    6. +
    +
  • +
  • +

    Offical installation script

    +
      +
    1. +

      Execute the followin command:

      +
      sudo simplex-servers-update
      +
      +

      To install specific version, run:

      +
      export VER=<version_from_github_releases> &&\
      +sudo -E simplex-servers-update
      +
      +
    2. +
    3. +

      Done!

      +
    4. +
    +
  • +
  • +

    Docker container

    +
      +
    1. +

      Stop and remove the container:

      +
      docker rm $(docker stop $(docker ps -a -q --filter ancestor=simplexchat/smp-server --format="\{\{.ID\}\}"))
      +
      +
    2. +
    3. +

      Pull latest image:

      +
      docker pull simplexchat/smp-server:latest
      +
      +
    4. +
    5. +

      Start new container:

      +
      docker run -d \
      +  -p 5223:5223 \
      +  -p 443:443 \
      +  -v $HOME/simplex/smp/config:/etc/opt/simplex:z \
      +  -v $HOME/simplex/smp/logs:/var/opt/simplex:z \
      +  simplexchat/smp-server:latest
      +
      +
    6. +
    +
  • +
  • +

    Linode Marketplace

    +
      +
    1. +

      Pull latest images:

      +
      docker-compose --project-directory /etc/docker/compose/simplex pull
      +
      +
    2. +
    3. +

      Restart the containers:

      +
      docker-compose --project-directory /etc/docker/compose/simplex up -d --remove-orphans
      +
      +
    4. +
    5. +

      Remove obsolete images:

      +
      docker image prune
      +
      +
    6. +
    +
  • +
+

Reproduce builds

+

You can locally reproduce server binaries, following these instructions.

+

If you are a security expert or researcher, you can help SimpleX network and users community by signing the release checksums – we will publish your signature. Please reach out to us!

+

To reproduce the build you must have:

+
    +
  • Linux machine
  • +
  • x86-64 architecture
  • +
  • Installed docker, curl and git
  • +
+
    +
  1. +

    Download script:

    +
    curl -LO 'https://raw.githubusercontent.com/simplex-chat/simplexmq/refs/heads/master/scripts/simplexmq-reproduce-builds.sh'
    +
    +
  2. +
  3. +

    Make it executable:

    +
    chmod +x simplexmq-reproduce-builds.sh
    +
    +
  4. +
  5. +

    Execute the script with the required tag:

    +
    ./simplexmq-reproduce-builds.sh 'v6.3.1'
    +
    +

    The script executes these steps (please review the script to confirm):

    +
      +
    1. builds all server binaries for the release in docker container.
    2. +
    3. downloads binaries from the same GitHub release and compares them with the built binaries.
    4. +
    5. if they all match, generates _sha256sums file with their checksums.
    6. +
    +

    This will take a while.

    +
  6. +
  7. +

    After compilation, you should see the folder named as the tag (e.g., v6.3.1) with two subfolders:

    +
    ls v6.3.1
    +
    +
    from-source  prebuilt  _sha256sums
    +
    +

    The file _sha256sums contains the hashes of all builds - you can compare it with the same file in GitHub release.

    +
  8. +
+

Configuring the app to use the server

+

To configure the app to use your messaging server copy it's full address, including password, and add it to the app. You have an option to use your server together with preset servers or without them - you can remove or disable them.

+

It is also possible to share the address of your server with your friends by letting them scan QR code from server settings - it will include server password, so they will be able to receive messages via your server as well.

+

Please note: you need SMP server version 4.0 to have password support. If you already have a deployed server, you can add password by adding it to server INI file.

+

     

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/server_config_1.png b/docs/server_config_1.png new file mode 100644 index 0000000000..701fa502ab Binary files /dev/null and b/docs/server_config_1.png differ diff --git a/docs/server_config_2.png b/docs/server_config_2.png new file mode 100644 index 0000000000..7a7a3d7279 Binary files /dev/null and b/docs/server_config_2.png differ diff --git a/docs/server_config_3.png b/docs/server_config_3.png new file mode 100644 index 0000000000..4793f99f1a Binary files /dev/null and b/docs/server_config_3.png differ diff --git a/docs/simplex.html b/docs/simplex.html new file mode 100644 index 0000000000..164421199f --- /dev/null +++ b/docs/simplex.html @@ -0,0 +1,1166 @@ + + + + + + + + + SimpleX platform + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 07.02.2023 | Languages: EN, FR, CZ, PL |

+

SimpleX platform - motivation and comparison

+

Problems

+

Existing chat platforms and protocols have some or all of the following problems:

+
    +
  • Lack of privacy of the user profile and contacts (meta-data privacy).
  • +
  • No protection (or only optional protection) of E2EE implementations from MITM attacks via provider.
  • +
  • Unsolicited messages (spam and abuse).
  • +
  • Lack of data ownership and protection.
  • +
  • Complexity of usage for all non-centralized protocols to non-technical users.
  • +
+

The concentration of the communication in a small number of centralized platforms makes resolving these problems quite difficult.

+

Proposed solution

+

Proposed stack of protocols solves these problems by making both messages and contacts stored only on client devices, reducing the role of the servers to simple message relays that only require authorization of messages sent to the queues, but do NOT require user authentication - not only the messages but also the metadata is protected because users do not have any identifiers assigned to them - unlike with any other platforms.

+

See SimpleX whitepaper for more information on platform objectives and technical design.

+

Why use SimpleX

+

SimpleX unique approach to privacy and security

+

Everyone should care about privacy and security of their communications - even ordinary conversations can put you in danger.

+

Full privacy of your identity, profile, contacts and metadata

+

Unlike any other existing messaging platform, SimpleX has no identifiers assigned to the users - it does not use phone numbers (like Signal or WhatsApp), domain-based addresses (like email, XMPP or Matrix), usernames (like Telegram), public keys or even random numbers (like all other messengers) to identify its users - we do not even know how many people use SimpleX.

+

To deliver the messages instead of user identifiers that all other platforms use, SimpleX uses the addresses of unidirectional (simplex) message queues. Using SimpleX is like having a different email address or a phone number for each contact you have, but without the hassle of managing all these addresses. In the near future SimpleX apps will also change the message queues automatically, moving the conversations from one server to another, to provide even better privacy to the users.

+

This approach protects the privacy of who are you communicating with, hiding it from SimpleX platform servers and from any observers. You can further improve your privacy by configuring your network access to connect to SimpleX servers via some overlay transport network, e.g. Tor.

+

The best protection against spam and abuse

+

As you have no identifier on SimpleX platform, you cannot be contacted unless you share a one-time invitation link or an optional temporary user address. Even with the optional user addresses, while they can be used to send spam contact requests, you can change or completely delete it without losing any of your connections.

+

Complete ownership, control and security of your data

+

SimpleX stores all user data on client devices, the messages are only held temporarily on SimpleX relay servers until they are received.

+

We use portable database format that can be used on all supported devices - we will soon add the ability to export the chat database from the mobile app so it can be used on another device.

+

Unlike servers of federated networks (email, XMPP or Matrix), SimpleX servers do not store user accounts, they simply relay messages to the recipients, protecting the privacy of both parties. There are no identifiers or encrypted messages in common between sent and received traffic of the server, thanks to the additional encryption layer for delivered messages. So if anybody is observing server traffic, they cannot easily determine who is communicating with whom (see SimpleX whitepaper for the known traffic correlation attacks).

+

Users own SimpleX network

+

You can use SimpleX with your own servers and still communicate with people using the servers that are pre-configured in the apps or any other SimpleX servers.

+

SimpleX platform uses an open protocol and provides SDK to create chat bots, allowing implementation of services that users can interact with via SimpleX Chat apps – we are really looking forward to see what SimpleX services can be built.

+

If you are considering developing with the SimpleX platform, whether for chat bot services for SimpleX app users or to integrate the SimpleX Chat library into your mobile apps, please get in touch for any advice and support.

+

Comparison with other protocols

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SimpleX chatSignal, big platformsXMPP, MatrixP2P protocols
Requires user identifiersNo = privateYes1Yes2Yes3
Possibility of MITMNo = secureYes4YesYes
Dependence on DNSNo = resilientYesYesNo
Single operator or networkNo = decentralizedYesNoYes5
Central component or other network-wide attackNo = resilientYesYes2Yes6
+
    +
  1. Usually based on a phone number, in some cases on usernames.
  2. +
  3. DNS based.
  4. +
  5. Public key or some other globally unique ID.
  6. +
  7. If operator’s servers are compromised.
  8. +
  9. While P2P networks and cryptocurrency-based networks are distributed, they are not decentralized - they operate as a single network, with a single namespace of user addresses.
  10. +
  11. P2P networks either have a central authority or the whole network can be compromised - see the next section.
  12. +
+

Comparison with P2P messaging protocols

+

There are several P2P chat/messaging protocols and implementations that aim to solve privacy and centralisation problem, but they have their own set of problems that makes them less reliable than the proposed design, more complex to implement and analyse and more vulnerable to attacks.

+
    +
  1. +

    P2P networks use some variant of DHT to route messages/requests through the network. DHT implementations have complex designs that have to balance reliability, delivery guarantee and latency. The proposed design has both better delivery guarantees and lower latency (the message is passed multiple times in parallel, through one node each time, using servers chosen by the recipient, while in P2P networks the message is passed through O(log N) nodes sequentially, using nodes chosen by the algorithm).

    +
  2. +
  3. +

    The proposed design, unlike most P2P networks, has no global user identifiers of any kind, even temporary.

    +
  4. +
  5. +

    P2P itself does not solve MITM attack problem, and most existing solutions do not use out-of-band messages for the initial key exchange. The proposed design uses out-of-band messages or, in some cases, pre-existing secure and trusted connections for the initial key exchange.

    +
  6. +
  7. +

    P2P implementations can be blocked by some Internet providers (like BitTorrent). The proposed design is transport agnostic - it can work over standard web protocols, and the servers can be deployed on the same domains as the websites.

    +
  8. +
  9. +

    All known P2P networks are likely to be vulnerable to Sybil attack, because each node is discoverable, and the network operates as a whole. Known measures to reduce the probability of the Sybil attack either require a centralized component or expensive proof of work. The proposed design, on the opposite, has no server discoverability - servers are not connected, not known to each other and to all clients. The SimpleX network is fragmented and operates as multiple isolated connections. It makes network-wide attacks on SimpleX network impossible - even if some servers are compromised, other parts of the network can operate normally, and affected clients can switch to using other servers without losing contacts or messages.

    +
  10. +
  11. +

    P2P networks are likely to be vulnerable to DRDoS attack. In the proposed design clients only relay traffic from known trusted connection and cannot be used to reflect and amplify the traffic in the whole network.

    +
  12. +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/stun_1.png b/docs/stun_1.png new file mode 100644 index 0000000000..d40db4bbdd Binary files /dev/null and b/docs/stun_1.png differ diff --git a/docs/stun_2.png b/docs/stun_2.png new file mode 100644 index 0000000000..4bc2319c58 Binary files /dev/null and b/docs/stun_2.png differ diff --git a/docs/stun_3.png b/docs/stun_3.png new file mode 100644 index 0000000000..4b3728da51 Binary files /dev/null and b/docs/stun_3.png differ diff --git a/docs/themes.html b/docs/themes.html new file mode 100644 index 0000000000..431d15ec29 --- /dev/null +++ b/docs/themes.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

App color themes

+

Mobile apps allow to configure, export and import color themes. Currently this is only supported in Android app.

+

You can contribute your themes to the repository by creating a pull request.

+

How to contribute a theme

+
    +
  1. +

    Once you have configured your theme in the app, export it to a file and give it a descriptive name – e.g., example.theme

    +
  2. +
  3. +

    Export your app database, and import a sample chat database - the passphrase is passphrase.

    +
  4. +
  5. +

    Make three screenshots - the list of conversations with opened profile picker, conversation and privacy settings.

    +
  6. +
  7. +

    Create PR that includes these files and amends this THEMES.md file, following the example below.

    +
  8. +
  9. +

    Restore your database from the backup.

    +
  10. +
+

Color themes

+

SimpleX - included dark blue theme

+

Download SimpleX theme

+

        

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/trademark.html b/docs/trademark.html new file mode 100644 index 0000000000..0fb06f4078 --- /dev/null +++ b/docs/trademark.html @@ -0,0 +1,942 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

SimpleX Chat Trademark Policy

+

The SimpleX Chat name and logo are trademarks of SimpleX Chat Ltd. This policy protects the brand from confusion. All uses must follow both the context rules (permitted/prohibited) and usage guidelines below. Unauthorized uses require written permission.

+

Permitted Contexts

+
    +
  • Communities/Events: For unofficial groups or events.
  • +
  • Addresses/Entities: To indicate a SimpleX address, person, business, or community.
  • +
  • Publications: In articles, blogs, videos, social media posts and presentations about SimpleX Chat or SimpleX network.
  • +
  • Software Descriptions: To state compatibility, e.g., "Compatible with SimpleX network", in docs or descriptions (not in software name/branding).
  • +
+

Prohibited Contexts

+
    +
  • Software Branding: As part of any software's name, branding, or logo, including forks.
  • +
  • Implied Affiliation: Suggesting endorsement, sponsorship, or official ties without permission.
  • +
  • Commercial Activities: In ads, merchandise, or promotions without permission.
  • +
  • Any Other: Uses not listed as permitted.
  • +
+

Usage Guidelines

+

When using in permitted contexts:

+
    +
  • Include "Unofficial" for communities/events.
  • +
  • Use logo unchanged (shape/colors), except grayscale if needed.
  • +
  • Use icon or icon with "SimpleX" word. See logos here.
  • +
  • Avoid modifications or implications of official status.
  • +
+

General Terms

+

We reserve all trademark rights. For permissions, contact us via email or SimpleX. We may enforce against violations. Policy updates posted here.

+

Note

+

SimpleX Chat software is licensed under AGPLv3 - see LICENSE. This policy covers only trademarks, not code use.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/translations.html b/docs/translations.html new file mode 100644 index 0000000000..c3f1608015 --- /dev/null +++ b/docs/translations.html @@ -0,0 +1,1161 @@ + + + + + + + + + Contributing translations to SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| 19.03.2023 | EN, CZ, FR, PL |

+

Contributing translations to SimpleX Chat

+

Huge thanks for your interest in translating SimpleX Chat - it helps a lot to make it accessible to a wider range of users, and we really appreciate your help.

+

It requires a substantial time investment - most people underestimate it initially - and ongoing maintenance as we develop the application.

+

This document is created to speed up this process, and share some important "gotchas" we've discovered while working with Weblate - the platform we use for interface translations.

+

Before you start translation

+
    +
  1. +

    Create an account in Weblate, using the same email that you use in GitHub - it will make your contributions associated with your GitHub account, and might help you in some cases. Once translation is released to the users we will add your account name to the list of translators, unless you ask us not to do it.

    +
  2. +
  3. +

    Before you start the translation there is a simple contributor license agreement to sign via Weblate - this is to avoid any conflicts around IP rights. The copy of this agreement is also available here.

    +
  4. +
  5. +

    We can also add you to the group of translators for any questions and updates - please connect to the developers via chat (when you just install the app or later, via "Send questions and ideas" in the app settings).

    +
  6. +
+

Translation process

+

It's easier to translate Android app first, and then iOS app, as Android app strings are set up as a glossary for iOS.

+

The steps are:

+
    +
  1. You translate Android app in Weblate.
  2. +
  3. We review and release Android app translations.
  4. +
  5. You review translations in the app and correct any mistakes.
  6. +
  7. You translate iOS app in Weblate
  8. +
  9. We review and release iOS app translations.
  10. +
+

Translating Android app

+
    +
  1. +

    Please start from Android app, both when you do the most time-consuming initial translation, and add any strings later. Firstly, iOS strings can be a bit delayed from appearing in Weblate, as it requires a manual step from us before they are visible. Secondary, Android app is set up as a glossary for iOS app, and 2/3 of all strings require just to clicks to transfer them from Android to iOS (it still takes some time, Weblate doesn't automate it, unfortunately).

    +
  2. +
  3. +

    Some of the strings do not need translations, but they still need to be copied over - there is a button in weblate UI for that:

    +
  4. +
+weblate: copy source to translation +
    +
  1. +

    Weblate also has automatic suggestions that can speed up the process. Sometimes they can be used as is, sometimes they need some editing - click to use them in translations.

    +
  2. +
  3. +

    Also, please note the string Key (it's on the right of the screen) - it may give you a hint about what this string means when unclear. E.g., the key for "Additional accent" (not clear) is "color_primary_variant" (a bit more clear that it refers to a color used in the app).

    +
  4. +
  5. +

    Once all strings in Android app are translated, please review it to ensure consistent style and language, so that the same words are consistently used for similar user actions, same as in English. Sometimes, you will have to use different words in cases when English has just one, please try to use these choices consistently in similar contexts, to make it easier for the end users.

    +
  6. +
+

Please also review reverse translations using Chrome browser and Translate to English feature in the Browse mode of weblate - this is what we will be reviewing before translations are released. Fix any mistakes, and please add comments in cases when a sufficiently different translations are justified - it will make review much faster.

+

Releasing Android app translations

+

Once Android app is translated, please let us know.

+

We will then:

+
    +
  • review all the translations and suggest any corrections - it also takes a bit of time :)
  • +
  • merge them to the source code - while we do it weblate will be locked for changes.
  • +
  • create beta releases of both iOS and Android apps - we can also add you to the internal tester groups, so you can install the apps before anybody else.
  • +
  • release it to our beta users - it's more than a thousand people who use our beta versions.
  • +
  • release the app and include the new language in the announcement.
  • +
+

Translating iOS app

+
    +
  1. +

    When you translate iOS app, a large part of the strings are exactly the same - they can be copied over in one click in glossary section. The visual hint that it can be done is that the whole source string is highlighted in yellow. Many other strings are very similar, they only differ in interpolation syntax or how bold font is used - they require minimal editing. There are some strings that are unique to iOS platform - they need to be translated separately

    +
  2. +
  3. +

    Please review iOS translations in the same way as Android and let us know when it's ready for review - we will repeat the same process for iOS app.

    +
  4. +
+

Thanks a lot! This is a huge effort and a huge help for SimpleX Network to grow.

+weblate: automatic suggestions +

Common translation mistakes

+
    +
  1. +

    The word "chat" is used in several meanings, depending on the context. It can mean either "SimpleX Chat app" (e.g. in Start/stop chat) or "a single conversation". Please ask when it is not clear, and we will be adding more translation notes.

    +
  2. +
  3. +

    Please use plural and singular as in the original strings, this may change the meaning otherwise. E.g., some settings apply to all contacts, and some to just one contact, it will be confusing if you use plural in both cases.

    +
  4. +
  5. +

    The app uses "Passcode" to provide access, not "password" - in many languages it is translated as "access code". The database uses "Passphrase" - in many languages it is translated as "Password". Please use these words consistently.

    +
  6. +
  7. +

    Member "role". This word refers to the set of permissions the user has, it can be "owner", "admin", "member" or "observer" (the lowest permission that only allows to read messages and add message reactions). Translating it as "identity" or as "function" may be incorrect.

    +
  8. +
  9. +

    "Moderate" / "moderated". These words means "to delete message of another member" and "deleted by admin" respectively. This feature is used when a member sends the message that is not appropriate for the group. Many languages have similar words.

    +
  10. +
+

How we review the translations

+

To validate the correctness of the translations we review reverse translations by browsing Weblate pages in Google Chrome browser in "Translate to English" mode. E.g., to review the German translations of Android interface somebody from our team scrolled through these 68 pages.

+

We are not looking for reverse translation being exactly the same as the original, it is rarely the case, only that it is generally correct.

+

You would make the review much easier if you could review it in advance in the same way, and comment on any cases where reverse translations are completely different (there may be valid cases for that).

+

What is next

+
    +
  1. +

    As we update the app, we post the updates in the group of translators. You are absolutely under no obligation to translate these additional strings. We hugely appreciate if you do though, as it makes the users experience so much better when they depend on your translations, than if some new part of the app is not translated.

    +
  2. +
  3. +

    You can further help SimpleX adoption in your country / language group by translating our website (also via weblate) and/or GitHub documents (this is only possible via git)!

    +
  4. +
  5. +

    Also, if you want to be a moderator/admin of the users group in your language, once the app is translated we can host such group - we are preparing community guidelines and adding some moderation tools to the app to be released in v4.6 in March.

    +
  6. +
+

Thank you very much again for helping us grow SimpleX Chat!

+

Evgeny, SimpleX Chat founder.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/webrtc.html b/docs/webrtc.html new file mode 100644 index 0000000000..e3b5e8bcee --- /dev/null +++ b/docs/webrtc.html @@ -0,0 +1,1198 @@ + + + + + + + + + Using custom WebRTC ICE servers in SimpleX Chat + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 31.01.2023 | Languages: EN, FR, CZ, PL |

+

Using custom WebRTC ICE servers in SimpleX Chat

+

Deploy STUN/TURN server

+

For this guide, we'll be using the most featureful and battle-tested STUN/TURN server implementation – coturn and Ubuntu 20.04 LTS Linux distribution.

+
    +
  1. +

    Obtain stun.$YOUR_DOMAIN and turn.$YOUR_DOMAIN certificates.

    +

    We're using Let's Encrypt.

    +
  2. +
  3. +

    Install coturn package from the main repository.

    +
  4. +
+
apt update && apt install coturn`
+
+
    +
  1. Uncomment TURNSERVER_ENABLED=1 from /etc/default/coturn:
  2. +
+
sed -i '/TURN/s/^#//g' /etc/default/coturn
+
+
    +
  1. +

    Configure coturn in /etc/turnserver.conf:

    +

    Also, please see comments for each individual option.

    +
  2. +
+
# Also listen to 443 port for tls
+alt-tls-listening-port=443
+# Use fingerprints in the TURN messages
+fingerprint
+# Use long-term credentials mechanism
+lt-cred-mech
+# Your credentials
+user=$YOUR_LOGIN:$YOUR_PASSWORD
+# Your server domain
+server-name=$YOUR_DOMAIN
+# The default realm to be used for the users when no explicit origin/realm relationship was found
+realm=$YOUR_DOMAIN
+# Path to your certificates. Make sure they're readable by cotun process user/group
+cert=/var/lib/turn/cert.pem
+pkey=/var/lib/turn/key.pem
+# Use 2066 bits predefined DH TLS key
+dh2066
+# Log to journalctl
+syslog
+# User/group which will be running coturn service
+proc-user=turnserver
+proc-group=turnserver
+# Disable weak encryption
+no-tlsv1
+no-tlsv1_1
+no-tlsv1_2
+
+
    +
  1. Start and enable coturn service:
  2. +
+
systemctl enable coturn && systemctl start coturn
+
+
    +
  1. Optionally, if using ufw firewall, open relevant ports:
  2. +
+
    +
  • 3478 – "plain" TURN/STUN;
  • +
  • 5349 – TURN/STUN over TLS;
  • +
  • 443 – TURN/STUN over TLS, which can bypass firewalls;
  • +
  • 49152:65535 – port range that Coturn will use by default for TURN relay.
  • +
+
# For Ubuntu
+sudo ufw allow 3478 && \
+sudo ufw allow 443 && \
+sudo ufw allow 5349 && \
+sudo ufw allow 49152:65535/tcp && \
+sudo ufw allow 49152:65535/udp
+
+# For Fedora
+sudo firewall-cmd --permanent --add-port=443/tcp && \
+sudo firewall-cmd --permanent --add-port=443/udp && \
+sudo firewall-cmd --permanent --add-port=5349/tcp && \
+sudo firewall-cmd --permanent --add-port=5349/udp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/tcp && \
+sudo firewall-cmd --permanent --add-port=49152:65535/udp && \
+sudo firewall-cmd --reload
+
+

Configure mobile apps

+

To configure your mobile app to use your server:

+
    +
  1. +

    Open Settings / Network & Servers / WebRTC ICE servers and switch toggle Configure ICE servers.

    +
  2. +
  3. +

    Enter all server addresses in the field, one per line, for example if you servers are on the port 5349:

    +
  4. +
+
stun:stun.example.com:5349
+turn:username:password@turn.example.com:5349
+
+

This is it - you now can make audio and video calls via your own server, without sharing any data with our servers (other than the key exchange with your contact in E2E encrypted messages).

+

Troubleshoot

+
    +
  • +

    Determine if server is available:

    +

    Run this command in your terminal:

    +
    ping <your_ip_or_domain>
    +
    +

    If packets being transmitted, server is up!

    +
  • +
  • +

    Determine if ports are open:

    +

    Run this command in your terminal:

    +
    nc -zvw10 <your_ip_or_domain> 443 5349
    +
    +

    You should see:

    +
    Connection to <your_ip_or_domain> 443 port [tcp/https] succeeded!
    +Connection to <your_ip_or_domain> 5349 port [tcp/*] succeeded!
    +
    +
  • +
  • +

    Test STUN/TURN connectivity:

    +
      +
    1. +

      Go to IceTest.

      +
    2. +
    3. +

      In Build up ICE Server List section, add:

      + +
        +
      • STUN: stun:<your_ip_or_domain>:<port> and hit Add STUN
      • +
      • TURN: turn:<your_ip_or_domain>:<port>, Username: <your_login>, Credential: <your_pass> and hit Add TURN
      • +
      +

      Where <port> is 443 or 5349.

      +
    4. +
    5. +

      You should see your servers in ICE server list section. If everything is set up correctly, hit Start test:

      + +
    6. +
    7. +

      In Results section, you should see something like this:

      + +

      If results show srflx and relay candidates, everything is set up correctly!

      +
    8. +
    +
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/xftp-server.html b/docs/xftp-server.html new file mode 100644 index 0000000000..7383689b8a --- /dev/null +++ b/docs/xftp-server.html @@ -0,0 +1,1512 @@ + + + + + + + + + Hosting your own XFTP Server + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Hosting your own XFTP Server

+

Table of Contents

+ +

Overview

+

XFTP is a new file transfer protocol focussed on meta-data protection - it is based on the same principles as SimpleX Messaging Protocol used in SimpleX Chat messenger:

+
    +
  • asynchronous file delivery - the sender does not need to be online for file to be received, it is stored on XFTP relays for a limited time (currently, it is 48 hours) or until deleted by the sender.
  • +
  • padded e2e encryption of file content.
  • +
  • content padding and fixed size chunks sent via different XFTP relays, assembled back into the original file by the receiving client.
  • +
  • efficient sending to multiple recipients (the file needs to be uploaded only once).
  • +
  • no identifiers or ciphertext in common between sent and received relay traffic, same as for messages delivered by SMP relays.
  • +
  • protection of sender IP address from the recipients.
  • +
+

Installation options

+

You can install XFTP server in one of the following ways:

+ +

systemd service

+

Installation script

+

This installation script will automatically install binaries, systemd services and additional scripts that will manage backups, updates and uninstallation. This is the recommended option due to its flexibility, easy updating, and being battle tested on our servers.

+

Please note that currently only Ubuntu distribution is supported.

+

Run the following script on the server:

+
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/simplex-chat/simplexmq/stable/install.sh -o simplex-server-install.sh &&\
+if echo '53fcdb4ceab324316e2c4cda7e84dbbb344f32550a65975a7895425e5a1be757 simplex-server-install.sh' | sha256sum -c; then
+  chmod +x ./simplex-server-install.sh
+  ./simplex-server-install.sh
+  rm ./simplex-server-install.sh
+else
+  echo "SHA-256 checksum is incorrect!"
+  rm ./simplex-server-install.sh
+fi
+
+

Type 2 and hit enter to install xftp-server.

+

Manual deployment

+

Manual installation is the most advanced deployment that provides the most flexibility. Generally recommended only for advanced users.

+
    +
  1. +

    Install binary:

    +
      +
    • +

      Using offical binaries:

      +
      curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/xftp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/xftp-server && chmod +x /usr/local/bin/xftp-server
      +
      +
    • +
    • +

      Compiling from source:

      +

      Please refer to Build from source: Using your distribution

      +
    • +
    +
  2. +
  3. +

    Create user and group for xftp-server:

    +
    sudo useradd -m xftp
    +
    +
  4. +
  5. +

    Create necessary directories and assign permissions:

    +
    sudo mkdir -p /var/opt/simplex-xftp /etc/opt/simplex-xftp /srv/xftp
    +sudo chown xftp:xftp /var/opt/simplex-xftp /etc/opt/simplex-xftp /srv/xftp
    +
    +
  6. +
  7. +

    Allow xftp-server port in firewall:

    +
    # For Ubuntu
    +sudo ufw allow 443/tcp
    +# For Fedora
    +sudo firewall-cmd --permanent --add-port=443/tcp && \
    +sudo firewall-cmd --reload
    +
    +
  8. +
  9. +

    Optional — If you're using distribution with systemd, create /etc/systemd/system/xftp-server.service file with the following content:

    +
    [Unit]
    +Description=XFTP server systemd service
    +
    +[Service]
    +User=xftp
    +Group=xftp
    +Type=simple
    +ExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS
    +ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex-xftp/file-server-store.log" ] && cp "/var/opt/simplex-xftp/file-server-store.log" "/var/opt/simplex-xftp/file-server-store.log.$(date +'%%FT%%T')"'
    +LimitNOFILE=65535
    +KillSignal=SIGINT
    +TimeoutStopSec=infinity
    +AmbientCapabilities=CAP_NET_BIND_SERVICE
    +   
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    And execute sudo systemctl daemon-reload.

    +
  10. +
+

Docker сontainer

+

You can deploy smp-server using Docker Compose. This is second recommended option due to its popularity and relatively easy deployment.

+

This deployment provides two Docker Compose files: the automatic one and manual. If you're not sure, choose automatic.

+

This will download images from Docker Hub.

+
    +
  1. Create xftp-server directory and switch to it:
  2. +
+
mkdir xftp-server && cd xftp-server
+
+
    +
  1. Create docker-compose.yml file with the following content:
  2. +
+

You can also grab it from here - docker-compose-xftp.yml. Don't forget to rename it to docker-compose.yml.

+
name: SimpleX Chat - xftp-server
+
+services:
+  xftp-server:
+    image: ${SIMPLEX_XFTP_IMAGE:-simplexchat/xftp-server:latest}
+    environment:
+      ADDR: ${ADDR?"Please specify the domain."}
+      QUOTA: ${QUOTA?"Please specify disk quota."}
+      PASS: ${PASS:-}
+    volumes:
+      - ./xftp_configs:/etc/opt/simplex-xftp
+      - ./xftp_state:/var/opt/simplex-xftp
+      - ./xftp_files:/srv/xftp
+    ports:
+      - 443:443
+    restart: unless-stopped
+
+
    +
  1. In the same directory, create .env file with the following content:
  2. +
+

You can also grab it from here - docker-compose-xftp.env. Don't forget to rename it to .env.

+

Change variables according to your preferences.

+
# Mandatory
+ADDR=your_ip_or_addr
+QUOTA=120gb
+
+# Optional
+#PASS='123123'
+
+
    +
  1. Start your containers:
  2. +
+
docker compose up
+
+

Linode marketplace

+

You can deploy xftp-server upon creating new Linode VM. Please refer to: Linode Marketplace

+

Tor installation

+

xftp-server can also be deployed to serve from tor network. Run the following commands as root user.

+
    +
  1. +

    Install tor:

    +

    We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to offical tor documentation or your distribution guide.

    +
      +
    • +

      Configure offical Tor PPA repository:

      +
      CODENAME="$(lsb_release -c | awk '{print $2}')"
      +echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main
      +deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org ${CODENAME} main" > /etc/apt/sources.list.d/tor.list
      +
      +
    • +
    • +

      Import repository key:

      +
      curl --proto '=https' --tlsv1.2 -sSf https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
      +
      +
    • +
    • +

      Update repository index:

      +
      apt update
      +
      +
    • +
    • +

      Install tor package:

      +
      apt install -y tor deb.torproject.org-keyring
      +
      +
    • +
    +
  2. +
  3. +

    Configure tor:

    +
      +
    • +

      File configuration:

      +

      Open tor configuration with your editor of choice (nano,vim,emacs,etc.):

      +
      vim /etc/tor/torrc
      +
      +

      And insert the following lines to the bottom of configuration. Please note lines starting with #: this is comments about each individual options.

      +
      # Enable log (otherwise, tor doesn't seemd to deploy onion address)
      +Log notice file /var/log/tor/notices.log
      +# Enable single hop routing (2 options below are dependencies of third). Will reduce latency in exchange of anonimity (since tor runs alongside xftp-server and onion address will be displayed in clients, this is totally fine)
      +SOCKSPort 0
      +HiddenServiceNonAnonymousMode 1
      +HiddenServiceSingleHopMode 1
      +# xftp-server hidden service host directory and port mappings
      +HiddenServiceDir /var/lib/tor/simplex-xftp/
      +HiddenServicePort 443 localhost:443
      +
      +
    • +
    • +

      Create directories:

      +
      mkdir /var/lib/tor/simplex-xftp/ && chown debian-tor:debian-tor /var/lib/tor/simplex-xftp/ && chmod 700 /var/lib/tor/simplex-xftp/
      +
      +
    • +
    +
  4. +
  5. +

    Start tor:

    +

    Enable systemd service and start tor. Offical tor is a bit flunky on the first start and may not create onion host address, so we're restarting it just in case.

    +
    systemctl enable tor && systemctl start tor && systemctl restart tor
    +
    +
  6. +
  7. +

    Display onion host:

    +

    Execute the following command to display your onion host address:

    +
    cat /var/lib/tor/simplex-xftp/hostname
    +
    +
  8. +
+

Configuration

+

To see which options are available, execute xftp-server without flags:

+
sudo su xftp -c xftp-server
+
+...
+Available commands:
+  init                     Initialize server - creates /etc/opt/simplex-xftp and
+                           /var/opt/simplex-xftp directories and configuration
+                           files
+  start                    Start server (configuration:
+                           /etc/opt/simplex-xftp/file-server.ini)
+  delete                   Delete configuration and log files
+
+
+

You can get further help by executing su xftp -c "xftp-server <command> -h"

+

After that, we need to configure xftp-server:

+
sudo su xftp -c "xftp-server init -h"
+
+...
+Available options:
+  -l,--store-log           Enable store log for persistence
+  -a,--sign-algorithm ALG  Signature algorithm used for TLS certificates:
+                           ED25519, ED448 (default: ED448)
+  --ip IP                  Server IP address, used as Common Name for TLS online
+                           certificate if FQDN is not supplied
+                           (default: "127.0.0.1")
+  -n,--fqdn FQDN           Server FQDN used as Common Name for TLS online
+                           certificate
+  -p,--path PATH           Path to the directory to store files
+  -q,--quota QUOTA         File storage quota (e.g. 100gb)
+  -h,--help                Show this help text
+
+

You should determine which flags are needed for your use-case and then execute xftp-server init:

+
sudo su xftp -c "xftp-server init -<your flag> <your option>"
+
+

For example, run:

+
sudo su xftp -c "xftp-server init -l --ip 192.168.1.5 -q '20gb' -p /srv/xftp/"
+
+

to initialize your xftp-server configuration with:

+
    +
  • restoring connections when the server is restarted (-l flag),
  • +
  • IP address 192.168.1.5 (--ip flag),
  • +
  • set overall storage quota to 10Gb (-q flag),
  • +
  • store files in /srv/xftp directory (-p flag).
  • +
+

To password-protect your xftp-server, change it in the configuration:

+
    +
  1. +

    Open configuration with:

    +
    sudo su xftp -c "vim /etc/opt/simplex-xftp/file-server.ini"
    +
    +
  2. +
  3. +

    Under [AUTH] section uncomment create_password and change it:

    +
    ...
    +[AUTH]
    +# Set new_files option to off to completely prohibit uploading new files.
    +# This can be useful when you want to decommission the server, but still allow downloading the existing files.
    +new_files: on
    +
    +# Use create_password option to enable basic auth to upload new files.
    +# The password should be used as part of server address in client configuration:
    +# xftp://fingerprint:password@host1,host2
    +# The password will not be shared with file recipients, you must share it only
    +# with the users who you want to allow uploading files to your server.
    +create_password: your_very_secure_password
    +...
    +
    +
  4. +
+
+

After that, your installation is complete and you should see in your teminal output something like this:

+
Certificate request self-signature ok
+subject=CN = 192.168.1.5
+Server initialized, you can modify configuration in /etc/opt/simplex-xftp/file-server.ini.
+Run `file-server start` to start server.
+----------
+You should store CA private key securely and delete it from the server.
+If server TLS credential is compromised this key can be used to sign a new one, keeping the same server identity and established connections.
+CA private key location:
+/etc/opt/simplex-xftp/ca.key
+----------
+SimpleX XFTP server v0.1.0
+Fingerprint: ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=
+Server address: xftp://ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=@<hostnames>
+
+

The server address above should be used in your client configuration and if you added server password it should only be shared with the other people when you want to allow them to use your server to upload files. If you passed IP address or hostnames during the initialisation, they will be printed as part of server address, otherwise replace <hostnames> with the actual server addresses.

+

Documentation

+

All necessary files for xftp-server are located in /etc/opt/simplex-xftp/ folder.

+

Stored messages, connections, statistics and server log are located in /var/opt/simplex-xftp/ folder.

+

Location of uploaded files is configured by the user. In our guide we're using /srv/xftp/

+

XFTP server address

+

XFTP server address has the following format:

+
xftp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]
+
+
    +
  • +

    <fingerprint>

    +

    Your xftp-server fingerprint of certificate. You can check your certificate fingerprint in /etc/opt/simplex-xftp/fingerprint.

    +
  • +
  • +

    optional <password>

    +

    Your configured password of xftp-server. You can check your configured pasword in /etc/opt/simplex-xftp/file-server.ini, under [AUTH] section in create_password: field.

    +
  • +
  • +

    <public_hostname>, optional <onion_hostname>

    +

    Your configured hostname(s) of xftp-server. You can check your configured hosts in /etc/opt/simplex-xftp/file-server.ini, under [TRANSPORT] section in host: field.

    +
  • +
+

Systemd commands

+

To start xftp-server on host boot, run:

+
sudo systemctl enable xftp-server.service
+
+Created symlink /etc/systemd/system/multi-user.target.wants/xftp-server.service → /etc/systemd/system/xftp-server.service.
+
+

To start xftp-server, run:

+
sudo systemctl start xftp-server.service
+
+

To check status of xftp-server, run:

+
sudo systemctl status xftp-server.service
+
+● xftp-server.service - XFTP server systemd service
+     Loaded: loaded (/etc/systemd/system/xftp-server.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sat 2023-03-11 13:11:55 UTC; 1 months 10 days ago
+   Main PID: 110770 (xftp-server)
+      Tasks: 14 (limit: 4611)
+     Memory: 2.4G
+     CGroup: /system.slice/xftp-server.service
+             └─110770 /usr/local/bin/xftp-server start +RTS -N -RTS
+
+Feb 27 19:21:11 localhost systemd[1]: Started XFTP server systemd service.
+Feb 27 19:21:11 localhost xftp-server[2350]: SimpleX XFTP server v0.1.0
+Feb 27 19:21:11 localhost xftp-server[2350]: Fingerprint: ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=
+Feb 27 19:21:11 localhost xftp-server[2350]: Server address: xftp://ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=@<hostnames>
+Feb 27 19:21:11 localhost xftp-server[2350]: Store log: /var/opt/simplex-xftp/file-server-store.log
+Feb 27 19:21:11 localhost xftp-server[2350]: Uploading new files allowed.
+Feb 27 19:21:11 localhost xftp-server[2350]: Listening on port 443...
+Feb 27 19:21:11 localhost xftp-server[2350]: [INFO 2023-02-27 19:21:11 +0000 src/Simplex/FileTransfer/Server/Env.hs:85] Total / available storage: 64424509440 / 64424509440
+
+

To stop xftp-server, run:

+
sudo systemctl stop xftp-server.service
+
+

To check tail of xftp-server log, run:

+
sudo journalctl -fu xftp-server.service
+
+Feb 27 19:21:11 localhost systemd[1]: Started XFTP server systemd service.
+Feb 27 19:21:11 localhost xftp-server[2350]: SimpleX XFTP server v0.1.0
+Feb 27 19:21:11 localhost xftp-server[2350]: Fingerprint: ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=
+Feb 27 19:21:11 localhost xftp-server[2350]: Server address: xftp://ioyYeRyy4SqJkNvb_7nM04MuLasOM4c-acVyVnqw248=@<hostnames>
+Feb 27 19:21:11 localhost xftp-server[2350]: Store log: /var/opt/simplex-xftp/file-server-store.log
+Feb 27 19:21:11 localhost xftp-server[2350]: Uploading new files allowed.
+Feb 27 19:21:11 localhost xftp-server[2350]: Listening on port 443...
+Feb 27 19:21:11 localhost xftp-server[2350]: [INFO 2023-02-27 19:21:11 +0000 src/Simplex/FileTransfer/Server/Env.hs:85] Total / available storage: 64424509440 / 64424509440
+
+

Control port

+

Enabling control port in the configuration allows administrator to see information about the xftp-server in real-time. Additionally, it allows to delete file chunks for content moderation and see the debug info about the clients, sockets, etc. Enabling the control port requires setting the admin and user passwords.

+
    +
  1. +

    Generate two passwords for each user:

    +
    tr -dc A-Za-z0-9 </dev/urandom | head -c 20; echo
    +
    +
  2. +
  3. +

    Open the configuration file:

    +
    vim /etc/opt/simplex-xftp/file-server.ini
    +
    +
  4. +
  5. +

    Configure the control port and replace the passwords:

    +
    [AUTH]
    +control_port_admin_password: <your_randomly_generated_admin_password>
    +control_port_user_password: <your_randomly_generated_user_password>
    +
    +[TRANSPORT]
    +control_port: 5224
    +
    +
  6. +
  7. +

    Restart the server:

    +
    systemctl restart xftp-server
    +
    +
  8. +
+

To access the control port, use:

+
nc 127.0.0.1 5224
+
+

or:

+
telnet 127.0.0.1 5224
+
+

Upon connecting, the control port should print:

+
XFTP server control port
+'help' for supported commands
+
+

To authenticate, type the following and hit enter. Change the my_generated_password with the user or admin password from the configuration:

+
auth my_generated_password
+
+

Here's the full list of commands, their descriptions and who can access them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommandDescriptionRequires admin role
stats-rtsGHC/Haskell statistics. Can be enabled with +RTS -T -RTS option-
deleteDelete known file chunk. Useful for content moderation.-
helpHelp menu.-
quitExit the control port.-
+

Daily statistics

+

You can enable xftp-server statistics for Grafana dashboard by setting value on in /etc/opt/simplex-xftp/file-server.ini, under [STORE_LOG] section in log_stats: field.

+

Logs will be stored as csv file in /var/opt/simplex-xftp/file-server-stats.daily.log. Fields for the csv file are:

+
fromTime,filesCreated,fileRecipients,filesUploaded,filesDeleted,dayCount,weekCount,monthCount,fileDownloads,fileDownloadAcks,filesCount,filesSize
+
+
    +
  • +

    fromTime - timestamp; date and time of event

    +
  • +
  • +

    filesCreated - int; chunks created

    +
  • +
  • +

    fileRecipients - int; number of file chunks recipients

    +
  • +
  • +

    filesUploaded - int; chunks uploaded

    +
  • +
  • +

    filesDeleted - int; chunks deleted

    +
  • +
  • +

    dayCount - int; uploaded chunks in a day

    +
  • +
  • +

    weekCount - int; uploaded chunks in a week

    +
  • +
  • +

    monthCount - int; uploaded chunks in a month

    +
  • +
  • +

    fileDownloads - int; chunks downloaded

    +
  • +
  • +

    filesCount - int; count of stored file chunks

    +
  • +
  • +

    filesSize - int; total size of uploaded file chunks

    +
  • +
+

To import csv to Grafana one should:

+
    +
  1. +

    Install Grafana plugin: Grafana - CSV datasource

    +
  2. +
  3. +

    Allow local mode by appending following:

    +
    [plugin.marcusolsson-csv-datasource]
    +allow_local_mode = true
    +
    +

    ... to /etc/grafana/grafana.ini

    +
  4. +
  5. +

    Add a CSV data source:

    +
      +
    • In the side menu, click the Configuration tab (cog icon)
    • +
    • Click Add data source in the top-right corner of the Data Sources tab
    • +
    • Enter "CSV" in the search box to find the CSV data source
    • +
    • Click the search result that says "CSV"
    • +
    • In URL, enter a file that points to CSV content
    • +
    +
  6. +
  7. +

    You're done! You should be able to create your own dashboard with statistics.

    +
  8. +
+

For further documentation, see: CSV Data Source for Grafana - Documentation

+

Updating your XFTP server

+

To update your XFTP server to latest version, choose your installation method and follow the steps:

+
    +
  • +

    Manual deployment

    +
      +
    1. Stop the server:
      sudo systemctl stop xftp-server
      +
      +
    2. +
    3. Update the binary:
       curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/xftp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/xftp-server && chmod +x /usr/local/bin/xftp-server
      +
      +
    4. +
    5. Start the server:
      sudo systemctl start xftp-server
      +
      +
    6. +
    +
  • +
  • +

    Offical installation script

    +
      +
    1. Execute the followin command:
      sudo simplex-servers-update
      +
      +
    2. +
    3. Done!
    4. +
    +
  • +
  • +

    Docker container

    +
      +
    1. Stop and remove the container:
      docker rm $(docker stop $(docker ps -a -q --filter ancestor=simplexchat/xftp-server --format="\{\{.ID\}\}"))
      +
      +
    2. +
    3. Pull latest image:
      docker pull simplexchat/xftp-server:latest
      +
      +
    4. +
    5. Start new container:
      docker run -d \
      +  -p 443:443 \
      +  -v $HOME/simplex/xftp/config:/etc/opt/simplex-xftp:z \
      +  -v $HOME/simplex/xftp/logs:/var/opt/simplex-xftp:z \
      +  -v $HOME/simplex/xftp/files:/srv/xftp:z \
      +  simplexchat/xftp-server:latest
      +
      +
    6. +
    +
  • +
  • +

    Linode Marketplace

    +
      +
    1. Pull latest images:
      docker-compose --project-directory /etc/docker/compose/simplex pull
      +
      +
    2. +
    3. Restart the containers:
      docker-compose --project-directory /etc/docker/compose/simplex up -d --remove-orphans
      +
      +
    4. +
    5. Remove obsolete images:
      docker image prune
      +
      +
    6. +
    +
  • +
+

Configuring the app to use the server

+

Please see: SMP Server: Configuring the app to use the server.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/downloads/index.html b/downloads/index.html new file mode 100644 index 0000000000..8a64fcc8b2 --- /dev/null +++ b/downloads/index.html @@ -0,0 +1,941 @@ + + + + + + + + + Download SimpleX apps + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

| Updated 09.09.2024 | Languages: EN |

+

Download SimpleX apps

+

You can get the latest beta releases from GitHub.

+ +

Desktop app

+desktop app +

You can link your mobile device with desktop to use the same profile remotely, but this is only possible when both devices are connected to the same local network.

+

Linux:

+ +

Mac: x86_64 (Intel), aarch64 (Apple Silicon).

+

Windows: x86_64.

+

Mobile apps

+

iOS: App store, TestFlight.

+

Android: Play store, F-Droid, APK aarch64, APK armv7.

+

Terminal (console) app

+

See Using terminal app.

+

Linux: Ubuntu 22.04 (x86_64, aarch64), Ubuntu 24.04 (x86_64, aarch64).

+

Mac: x86_64, aarch64.

+

Windows: x86_64.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/en/contact/index.html b/en/contact/index.html new file mode 100644 index 0000000000..faf16d6f6e --- /dev/null +++ b/en/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received an address to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/en/fdroid/index.html b/en/fdroid/index.html new file mode 100644 index 0000000000..61a59d3171 --- /dev/null +++ b/en/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stable and beta versions built by the developers

+

To add it to your F-Droid client, scan the QR code or use this URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stable versions built by F-Droid.org

+

The releases to this repo are done several days later.

+

SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/en/index.html b/en/index.html new file mode 100644 index 0000000000..3ae4e3d679 --- /dev/null +++ b/en/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/en/invitation/index.html b/en/invitation/index.html new file mode 100644 index 0000000000..bf2d2a57c8 --- /dev/null +++ b/en/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received a 1-time link to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/en/learn-more/index.html b/en/learn-more/index.html new file mode 100644 index 0000000000..029f5a4c7a --- /dev/null +++ b/en/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
Key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
End-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
Content padding

+
+ +

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+ + + + + + + + + + diff --git a/es/contact/index.html b/es/contact/index.html new file mode 100644 index 0000000000..fbf27b28dd --- /dev/null +++ b/es/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Has recibido una dirección para conectarte con SimpleX Chat

+

Para establecer una conexión:

+ +
+

Instalar SimpleX Chat

+
+ + + +
+ +
+

1

+
+
+ +
+

Conectar en la aplicación

+ + + Abrir la aplicación Simplex + +
+

2

+
+
+ +
+

Pulse el botón ‘conectar’ en la aplicación

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Únase a SimpleX

+

Le invitamos a unirse a la conversación

+ + + +

Suscríbase para recibir nuestras actualizaciones

+ +
+ + + +
+ +
+ +

Obtenga SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/es/fdroid/index.html b/es/fdroid/index.html new file mode 100644 index 0000000000..3f13180710 --- /dev/null +++ b/es/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat en F-Droid

+ +
+ +
+

Repositorio Simplex Chat

+
+
+

Versiones estables y beta compilados por los desarrolladores

+

Para añadirlo a tu cliente F-Droid escanea el código QR usa esta URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Huella digital de la clave de firma (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Repositorio F-Droid.org

+ +

Versión estable compilada por F-Droid.org

+

Las versiones aparecen varios días más tarde en este repositorio.

+

Los repositorios de SimpleX Chat y F-Droid.org firman con distinto certificado. Para cambiar, por favor exportar la base de datos y reinstala la aplicación.

+
+
+ +
+
+ + + + + + + + + + diff --git a/es/index.html b/es/index.html new file mode 100644 index 0000000000..f0593c0dfb --- /dev/null +++ b/es/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/es/invitation/index.html b/es/invitation/index.html new file mode 100644 index 0000000000..798f43e809 --- /dev/null +++ b/es/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Has recibido un enlace de un solo uso para conectarte con SimpleX Chat

+

Para establecer una conexión:

+ +
+

Instalar SimpleX Chat

+
+ + + +
+ +
+

1

+
+
+ +
+

Conectar en la aplicación

+ + + Abrir la aplicación Simplex + +
+

2

+
+
+ +
+

Pulse el botón ‘conectar’ en la aplicación

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Únase a SimpleX

+

Le invitamos a unirse a la conversación

+ + + +

Suscríbase para recibir nuestras actualizaciones

+ +
+ + + +
+ +
+ +

Obtenga SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/es/learn-more/index.html b/es/learn-more/index.html new file mode 100644 index 0000000000..93aa14721a --- /dev/null +++ b/es/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Por qué SimpleX es único

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Su privacidad es completa

+
+ +
+ +
+

+ SimpleX protege la privacidad de su perfil, contactos y metadatos, ocultándolos de los servidores de la red SimpleX y de cualquier observador. +

+

+ A diferencia de cualquier otra red de mensajería existente, SimpleX no tiene identificadores asignados a los usuarios — ni siquiera números aleatorios . +

+ +
+ + + Descubra más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Está protegido
contra el spam y abuso

+
+ +
+ +
+

+ Al no tener identificadores o dirección permanente en la red SimpleX, nadie puede ponerse en contacto con usted salvo que comparta una dirección de usuario de un solo uso o una dirección temporal en forma de enlace o código QR. +

+ +
+ + + Descubra más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Usted controla sus datos

+
+ +
+ +
+

+ SimpleX almacena todos los datos de usuario únicamente en los dispositivos cliente usando un formato cifrado y portable de la base de datos, la cual puede ser transferida a otro dispositivo. +

+

+ Los mensajes cifrados de extremo a extremo (E2E) se mantienen temporalmente en los servidores relay SimpleX hasta que se reciben, y después son borrados permanentemente. +

+ +
+ + + Descubra más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

La red SimpleX le pertenece

+
+ +
+ +
+

+ La red SimpleX está completamente descentralizada y es independiente de cualquier criptodivisa o de cualquier red salvo Internet. +

+

+ Puede usar SimpleX con sus propios servidores o con los servidores proporcionados por nosotros para contactar con cualquier usuario. +

+ +
+ + + Descubra más + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Características

+ +
+ +
+
+ + +
+

Mensajes cifrados E2E con sintáxis markdown y edición

+
+ +
+
+ + +
+

Cifrado E2E
de imágenes, vídeos y archivos

+
+ +
+
+ + +
+

Grupos descentralizados cifrados E2E — sólo los usuarios conocen su existencia

+
+ +
+
+ + +
+

Mensajes de voz cifrados E2E

+
+ +
+
+ + +
+

Mensajes temporales

+
+ +
+
+ + +
+

Llamadas y videollamadas con cifrado E2E

+
+ +
+
+ + +
+

Almacenamiento portable y cifrado — podrá transferir su perfil a otro dispositivo

+
+ +
+
+ + +
+

Modo incógnito —
exclusivo de SimpleX Chat

+
+ +
+
+
+ + +
+
+

Qué hace que SimpleX sea privado

+ +
+
+ + +
+
+ + +
+
+

Identificadores por pares anónimos temporales

+
+ +

SimpleX usa direcciones y credenciales temporales anónimas por pares para cada contacto de usuario o miembro de grupo.

+ +

Esto permite entregar mensajes sin identificadores de perfil de usuario y proporcionando una mayor privacidad de metadatos que las alternativas.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Intercambio de claves
fuera de banda

+
+ +

Muchas redes de comunicaciónes son vulnerables a ataques MITM por parte de los servidores o los proveedores de red.

+ +

Para evitarlo las aplicaciones SimpleX pasan claves de un solo uso fuera de banda cuando compartes un enlace de dirección o un código QR.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Doble capa de
cifrado de extremo a extremo

+
+ +

Protocolo de 'Double Ratchet' —
Mensajería OTR con secreto perfecto hacia adelante y recuperación de intrusión.

+ +

NaCL cryptobox por cada cola de mensajes para prevenir la correlación de tráfico entre colas si el protocolo TLS se ve comprometido.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Verificación de la
integridad del mensaje

+
+ +

Para garantizar la integridad los mensajes se numeran secuencialmente e incluyen el hash del mensaje anterior.

+ +

Si se añade, elimina o modifica algún mensaje, el destinatario es avisado.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Capa de cifrado
adicional en el servidor

+
+ +

Capa de cifrado adicional en la entrega desde el servidor al destinatario, para prevenir la correlación entre los tráficos de recepción y envío del servidor si el protocolo TLS se ve comprometido.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Mezcla de mensajes
para prevenir la correlación

+
+ +

Los servidores SimpleX actúan como nodos de mezcla de baja latencia — los mensajes entrantes y salientes siguen un orden diferente.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Transporte TLS
seguro y autenticado

+
+ +

Para las conexiones cliente servidor se usan exclusivamente el protocolo TLS 1.2/1.3 con algoritmos robustos.

+ +

La huella digital del servidor y la vinculación de canales evitan los ataques de respuesta y MITM.

+ +

La reanudación de la conexión está deshabilitada para evitar ataques de sesión.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Acceso opcional
a través de Tor

+
+ +

Para proteger tu dirección IP puedes acceder a los servidores a través de la red Tor u otras redes de transporte superpuesto.

+ +

Para usar SimpleX a través de Tor, instala la aplicación Orbot y activa el proxy SOCKS5 (o VPN en iOS).

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Colas de mensajes
unidireccionales

+
+ +

Cada cola de mensajes transmite los mensajes en un solo sentido, con las distintas direcciones de envío y recepción.

+ +

Esto reduce los vectores de ataque y los metadatos disponibles, en comparación con los agentes de mensajes tradicionales.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Múltiples capas
de contenido acolchado

+
+ +

SimpleX utiliza relleno de contenido en cada capa de cifrado para frustrar los ataques al tamaño de los mensajes.

+ +

Esto hace que mensajes de distintos tamaños parezcan iguales desde el punto de vista de servidores y observadores de red.

+ +
+

Pulsa para cerrar

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Red SimpleX

+

Simplex Chat proporciona la mejor privacidad al combinar las ventajas de P2P y las redes federadas.

+ +
+
+
+ + +
+
+

Distinto de las redes P2P

+

+ Todos los mensajes se envían a través de los servidores, proporcionando mayor privacidad para los metadatos y una entrega asincrónica fiable de mensajes, evitando al mismo tiempo muchos de los problemas asociados a las redes P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Distinto de las redes federadas

+

+ Los servidores relay SimpleX NO almacenan perfiles de usuario, contactos ni mensajes entregados, NO se conectan entre sí y NO existe un directorio de servidores. +

+
+
+ + + +
+
+ + +
+
+

Red Simplex

+

+ Los servidores proporcionan colas unidireccionales para conectar a los usuarios, pero no pueden ver el mapa de conexión de la red — sólo la tienen los usuarios. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explicado

+ + + + + + + +
+
+ +
+
1. Experiencia del usuario
+
+ +

+ Puedes crear contactos y grupos, y mantener conversaciones bidireccionales como en cualquier aplicación de mensajería. +

+

+ ¿Cómo puede funcionar con colas unidireccionales y sin identificadores de usuario? +

+
+
+ +
+
2. Cómo funciona la red
+
+ +

+ Por cada conexión se usan dos colas de mensajes separadas para que el envío y recepción se hagan a través de servidores diferentes. +

+

+ Los servidores solo transmiten mensajes en un sentido para no disponer de la imagen completa de la conversación y conexiones del usuario. +

+
+
+ +
+
3. Qué ven los servidores
+
+ +

+ Para cada cola los servidores disponen de credenciales separadas y anónimas, por lo que desconocen a qué usuarios pertenecen. +

+

+ El usuario puede mejorar aún más la privacidad de sus metadatos haciendo uso de la red Tor para acceder a los servidores, evitando así la correlación por dirección IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparación con otros protocolos

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plataformasXMPP, MatrixProtocolos P2P
Requiere de identidad globalNo - privado123
Posibilidad de MITMNo - seguro 45
Dependencia del DNSNo - resilienteNo
Red única o centralizadaNo - descentralizadoNo - federado 67
Componente central u otro ataque en toda la redNo - resiliente28
+
+ +
+ +
+
+
    +
  1. Generalmente basado en un número de teléfono, en algunos casos en nombres de usuario
  2. +
  3. Direcciones basadas en DNS
  4. +
  5. Clave pública o algun otro ID único a nivel global
  6. +
  7. Los servidores de retransmisión no pueden comprometer la encriptación e2e. Para evitar posibles ataques, verifique el código de seguridad mediante un canal alternativo
  8. +
  9. Si los servidores del operador se ven comprometidos. Verifique el código de seguridad en Signal y alguna otra aplicación para mitigarlo
  10. +
  11. No protege la privacidad de los metadatos del usuario
  12. +
  13. A pesar de que las redes P2P son distribuidas, no son federadas — funcionan como una única red
  14. +
  15. Las redes P2P o bien tienen una autoridad central o toda la red puede verse comprometida - ver aquí
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/fa/contact/index.html b/fa/contact/index.html new file mode 100644 index 0000000000..fa9e62682e --- /dev/null +++ b/fa/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

شما یک آدرس برای اتصال به چت SimpleX دریافت کرده‌اید

+

برای برقراری ارتباط:

+ +
+

برنامه SimpleX را نصب کنید

+
+ + + +
+ +
+

1

+
+
+ +
+

در برنامه متصل شوید

+ + + برنامه SimpleX را باز کنید + +
+

2

+
+
+ +
+

دکمه ‘اتصال’ را در برنامه بزنید

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

پیوستن SimpleX

+

ما شما را به پیوستن به گفتگو دعوت می‌کنیم

+ + + +

برای دریافت به‌روزرسانی‌های ما ثبت‌نام کنید

+ +
+ + + +
+ +
+ +

برنامه دسکتاپ SimpleX را دریافت کنید

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fa/fdroid/index.html b/fa/fdroid/index.html new file mode 100644 index 0000000000..0353a3e3a9 --- /dev/null +++ b/fa/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat در F-Droid

+ +
+ +
+

مخزن SimpleX Chat

+
+
+

نسخه‌های پایدار و بتا که توسط توسعه‌دهندگان ساخته شده‌اند

+

برای افزودن آن به کلاینت F-Droid خود، کد QR را اسکن کنید یا از این URL استفاده کنید:

+ + https://app.simplex.chat/fdroid/repo + +

+ اثر انگشت کلید امضا (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

مخزن F-Droid.org

+ +

نسخه‌های پایدار که توسط F-Droid.org ساخته شده‌اند

+

انتشارها در این مخزن چندین روز بعد انجام می‌شود.

+

SimpleX Chat و مخازن F-Droid.org بیلدها را با کلیدهای متفاوتی امضا می‌کنند. برای تغییر، لطفاً پایگاه داده چت را اکسپورت کنید و برنامه را دوباره نصب کنید.

+
+
+ +
+
+ + + + + + + + + + diff --git a/fa/index.html b/fa/index.html new file mode 100644 index 0000000000..cf47586c70 --- /dev/null +++ b/fa/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/fa/invitation/index.html b/fa/invitation/index.html new file mode 100644 index 0000000000..7fd883034a --- /dev/null +++ b/fa/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

شما یک لینک یک‌بار مصرف برای اتصال به چت SimpleX دریافت کرده‌اید

+

برای برقراری ارتباط:

+ +
+

برنامه SimpleX را نصب کنید

+
+ + + +
+ +
+

1

+
+
+ +
+

در برنامه متصل شوید

+ + + برنامه SimpleX را باز کنید + +
+

2

+
+
+ +
+

دکمه ‘اتصال’ را در برنامه بزنید

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

پیوستن SimpleX

+

ما شما را به پیوستن به گفتگو دعوت می‌کنیم

+ + + +

برای دریافت به‌روزرسانی‌های ما ثبت‌نام کنید

+ +
+ + + +
+ +
+ +

برنامه دسکتاپ SimpleX را دریافت کنید

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fa/learn-more/index.html b/fa/learn-more/index.html new file mode 100644 index 0000000000..f7566371a2 --- /dev/null +++ b/fa/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

چرا SimpleX منحصربه‌فرد است

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

شما حریم خصوصی کاملی دارید

+
+ +
+ +
+

+ SimpleX حریم خصوصی پروفایل، مخاطبین و فراداده‌های شما را محافظت می‌کند و آن‌ها را از سرورهای شبکه SimpleX و هر ناظر دیگری پنهان می‌سازد. +

+

+ برخلاف هر شبکه پیام‌رسان دیگری، SimpleX هیچ شناسه‌ای به کاربران اختصاص نمی‌دهد — حتی شماره‌های تصادفی نیز وجود ندارد. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

شما از هرزنامه و سوءاستفاده محافظت می‌شوید

+
+ +
+ +
+

+ از آنجا که شما هیچ شناسه یا آدرس ثابتی در شبکه SimpleX ندارید، هیچ‌کس نمی‌تواند با شما تماس بگیرد مگر اینکه یک آدرس کاربری یک‌بار مصرف یا موقتی را به‌عنوان کد QR یا لینک به اشتراک بگذارید. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

شما بر داده‌های خود کنترل دارید

+
+ +
+ +
+

+ SimpleX تمام داده‌های کاربری را بر روی دستگاه‌های کلاینت در یک فرمت پایگاه داده رمزنگاری شده قابل حمل ذخیره می‌کند — این داده‌ها می‌توانند به دستگاه دیگری منتقل شوند. +

+

+ پیام‌های رمزنگاری شده انتها به انتها به‌طور موقت بر روی سرورهای رله SimpleX نگهداری می‌شوند تا دریافت شوند و سپس به‌طور دائمی حذف می‌شوند. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

­شما مالک شبکه SimpleX هستید

+
+ +
+ +
+

+ شبکه SimpleX به‌طور کامل غیرمتمرکز و مستقل از هر ارز دیجیتال یا هر شبکه دیگری به جز اینترنت است. +

+

+ شما می‌توانید از SimpleX با سرورهای خود استفاده کنید یا از سرورهای ارائه‌شده توسط ما استفاده کنید — و همچنان به هر کاربری متصل شوید. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

ویژگی‌ها

+ +
+ +
+
+ + +
+

پیام‌های رمزنگاری شده انتها به انتها با ویرایش و فرمت‌بندی Markdown

+
+ +
+
+ + +
+

تصاویر، ویدیوها و فایل‌های رمزنگاری شده انتها به انتها

+
+ +
+
+ + +
+

گروه‌های غیرمتمرکز رمزنگاری شده انتها به انتها — تنها کاربران می‌دانند که این گروه‎ها وجود دارند

+
+ +
+
+ + +
+

پیام‌های صوتی رمزنگاری شده به صورت انتها به انتها

+
+ +
+
+ + +
+

پیام‌های ناپدید شونده

+
+ +
+
+ + +
+

تماس‌های صوتی و ویدیویی رمزنگاری شده انتها به انتها

+
+ +
+
+ + +
+

فضای ذخیره‌سازی رمزنگاری شده قابل حمل — انتقال پروفایل به دستگاه دیگر

+
+ +
+
+ + +
+

حالت ناشناس —
منحصربه‌فرد برای SimpleX Chat

+
+ +
+
+
+ + +
+
+

چه چیزی SimpleX را خصوصی می‌کند

+ +
+
+ + +
+
+ + +
+
+

شناسه‌های موقت ناشناس دوطرفه

+
+ +

SimpleX از آدرس‌ها و اعتبارنامه‌های موقتی و ناشناس جفت‌به‌جفت برای هر مخاطب کاربر یا عضو گروه استفاده می‌کند.

+ +

این امکان را فراهم می‌کند که پیام‌ها بدون شناسه‌های پروفایل کاربر ارسال شوند و حریم خصوصی فراداده بهتری نسبت به گزینه‌های دیگر ارائه می‌دهد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

مبادله کلید خارج از باند

+
+ +

بسیاری از شبکه‌های ارتباطی در برابر حملات MITM توسط سرورها یا ارائه‌دهندگان شبکه آسیب‌پذیر هستند.

+ +

زمانی که آدرسی را به عنوان لینک یا کد QR به اشتراک می‌گذارید، برنامه‌های SimpleX کلیدهای یک‌بار مصرف را به صورت خارج از باند منتقل می‌کنند تا از این موضوع جلوگیری شود.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

دو لایه از
رمزنگاری انتها به انتها

+
+ +

پروتکل Double-ratchet — پیام‌رسانی OTR با محرمانگی کامل پیشرو و بازیابی در صورت نفوذ.

+ +

NaCL cryptobox در هر صف برای جلوگیری از همبستگی ترافیک بین صف‌های پیام اگر TLS به خطر بیفتد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

تأیید صحت پیام

+
+ +

برای تضمین یکپارچگی، پیام‌ها به صورت ترتیبی شماره‌گذاری شده و شامل هش پیام قبلی هستند.

+ +

اگر هر پیامی اضافه، حذف یا تغییر یابد، گیرنده مطلع خواهد شد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

لایه اضافی از
رمزنگاری سرور

+
+ +

برای تحویل به گیرنده، لایه اضافی رمزنگاری سرور اضافه می‌شود تا در صورت به خطر افتادن TLS، از همبستگی بین ترافیک دریافتی و ارسالی سرور جلوگیری شود.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

مخلوط‌سازی پیام
برای کاهش امکان رهگیری

+
+ +

سرورهای SimpleX به عنوان گره‌های میکس با تأخیر کم عمل می‌کنند — پیام‌های ورودی و خروجی ترتیب متفاوتی دارند.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

انتقال TLS امن و تأییدشده

+
+ +

فقط از TLS 1.2/1.3 با الگوریتم‌های قوی برای اتصالات کلاینت-سرور استفاده می‌شود.

+ +

اثر انگشت سرور و اتصال کانال از حملات MITM و حملات replay جلوگیری می‌کنند.

+ +

برای جلوگیری از حملات نشست، از سرگیری اتصال غیرفعال شده است.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

دسترسی اختیاری از طریق
Tor

+
+ +

برای محافظت از آدرس IP خود، می‌توانید از طریق Tor یا برخی دیگر از شبکه‌های حمل و نقل پوششی به سرورها دسترسی پیدا کنید.

+ +

برای استفاده از SimpleX از طریق Tor، لطفاً برنامه Orbot را نصب کرده و پروکسی SOCKS5 (یا VPN در iOS) را فعال کنید.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

صف‌های پیام یک‌طرفه

+
+ +

هر صف پیام، پیام‌ها را در یک جهت منتقل می‌کند و آدرس‌های ارسال و دریافت متفاوتی دارد.

+ +

این کار نسبت به کارگزارهای پیام سنتی و فراداده‌های موجود، بردارهای حمله را کاهش می‌دهد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

چندین لایه از
پدینگ محتوا

+
+ +

SimpleX از padding محتوا برای هر لایه رمزنگاری استفاده می‌کند تا از حملات اندازه پیام جلوگیری کند.

+ +

این کار باعث می‌شود که پیام‌های با اندازه‌های مختلف برای سرورها و ناظران شبکه یکسان به نظر برسند.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

شبکه SimpleX

+

چت SimpleX بهترین حریم خصوصی را با ترکیب مزایای شبکه‌های P2P و شبکه‌های فدرال ارائه می‌دهد.

+ +
+
+
+ + +
+
+

برخلاف شبکه‌های P2P

+

+ تمام پیام‌ها از طریق سرورها ارسال می‌شوند که هم حریم خصوصی فراداده را بهتر تأمین می‌کند و هم تحویل پیام‌های غیرهمزمان قابل اعتماد را فراهم می‌آورد، در حالی که از بسیاری از مشکلات جلوگیری می‌کند. مشکلات شبکه‌های P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

برخلاف شبکه‌های فدرال

+

+ سرورهای رله SimpleX پروفایل‌های کاربری، مخاطبین و پیام‌های تحویل‌شده را ذخیره نمی‌کنند، به یکدیگر متصل نمی‌شوند و هیچ دایرکتوری سروری وجود ندارد. +

+
+
+ + + +
+
+ + +
+
+

شبکه SimpleX

+

+ سرورها صف‌های یک‌طرفه را برای اتصال کاربران فراهم می‌کنند، اما هیچ دیدگاهی از نمودار ارتباطات شبکه ندارند — تنها کاربران این دید را دارند. +

+
+
+ +
+
+ +
+ + + + + +
+
+

توضیحات در مورد SimpleX

+ + + + + + + +
+
+ +
+
۱. تجربه کاربران
+
+ +

+ شما می‌توانید مخاطبین و گروه‌ها را ایجاد کنید و مانند هر پیام‌رسان دیگری، مکالمات دوطرفه داشته باشید. +

+

+ چگونه می‌تواند با صف‌های یک‌طرفه و بدون شناسه‌های پروفایل کاربر کار کند؟ +

+
+
+ +
+
۲. چگونه کار می‌کند
+
+ +

+ برای هر اتصال، شما از دو صف پیام جداگانه برای ارسال و دریافت پیام‌ها از طریق سرورهای مختلف استفاده می‌کنید. +

+

+ سرورها فقط پیام‌ها را به یک سمت منتقل می‌کنند و از جزئیات کامل مکالمات یا ارتباطات کاربران بی‌خبر هستند. +

+
+
+ +
+
۳. آنچه سرورها می‌بینند
+
+ +

+ سرورها برای هر صف دارای اعتبارنامه‌های جداگانه و ناشناس هستند و نمی‌دانند که این اعتبارنامه‌ها به کدام کاربران تعلق دارند. +

+

+ کاربران می‌توانند با استفاده از Tor برای دسترسی به سرورها، حریم خصوصی فراداده را بیشتر بهبود بخشند و از شناسایی بر اساس آدرس IP جلوگیری کنند. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

مقایسه با سایر پروتکل‌ها

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + سیگنال، پلتفرم‌های بزرگXMPP، Matrixپروتکل‌های P2P
نیاز به هویت جهانی داردخیر - خصوصیبله 1بله 2بله 3
امکان حمله MITMخیر - امن 4بله 5بلهبله
وابستگی به DNSخیر - مقاومبلهبلهخیر
شبکه تک یا متمرکزخیر - غیرمتمرکزبلهخیر - فدرال 6بله 7
مؤلفه مرکزی یا حمله‌ای در سطح شبکهخیر - مقاومبلهبله 2بله 8
+
+ +
+ +
+
+
    +
  1. معمولاً بر اساس شماره تلفن و در برخی موارد بر اساس نام‌های کاربری
  2. +
  3. آدرس‌های مبتنی بر DNS
  4. +
  5. کلید عمومی یا برخی دیگر از شناسه‌های منحصربه‌فرد جهانی
  6. +
  7. رله‌های SimpleX نمی‌توانند رمزنگاری انتها به انتها را به خطر بیندازند. توصیه می‌شود کد امنیتی را برای کاهش حمله در کانال out-of-band تأیید کنید
  8. +
  9. اگر سرورهای اپراتور به خطر بیفتند. کد امنیتی را در سیگنال و برخی دیگر از برنامه‌ها تأیید کنید تا این خطر را کاهش دهید
  10. +
  11. از حریم خصوصی فراداده‌های کاربران محافظت نمی‌کند
  12. +
  13. در حالی که شبکه‌های P2P توزیع‌شده هستند، اما فدرال نیستند — آن‌ها به‌عنوان یک شبکه واحد عمل می‌کنند
  14. +
  15. شبکه‌های P2P یا دارای یک نهاد مرکزی هستند یا کل شبکه می‌تواند به خطر بیفتد - اینجا را ببینید
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 0000000000..4aab0a60c9 --- /dev/null +++ b/faq/index.html @@ -0,0 +1,1368 @@ + + + + + + + + + Frequently Asked Questions + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Frequently Asked Questions

+

How to use it

+ +

Troubleshooting

+ +

Privacy and security

+ +

Funding and business model

+ +

How to use it

+

How do I connect to people?

+

Tap "pencil" button in the right corner, then "Create 1-time link". Share the link with the person you want to connect to. Your contact has to paste the link to the app's search bar. The link will can also be opened via the browser, once the app is installed.

+

Alternatively, you can show the QR code when meeting in person or in a video call.

+

It is safe to share this link over any communication channel, it contains only public keys and can only be used once.

+

If you want to share your address publicly, so that many people can connect to you, use your SimpleX address instead of 1-time links. Tap your profile image/avatar, then Your SimpleX address. Once you create the address, you can share it in social media profiles, email signature, etc. See the comparison of SimpleX address with 1-time links.

+

I have nobody to chat with! Where can I find any groups?

+

Please check our Groups Directory in the first place. You might find some interesting groups and meet even more interesting people.

+

What is database? What can I do with it?

+

Database is essential for SimpleX Chat to function properly. In comparison to centralized messaging providers, it is the user who is responsible for taking care of their data. On the other hand, user is sure that nobody but them has access to it. Please read more about it: Database.

+

Can I send files over SimpleX?

+

Of course! While doing so, you are using a state-of-the-art protocol that greatly reduces metadata leaks. Please read more about it: XFTP Protocol.

+

What’s incognito profile?

+

This feature is unique to SimpleX Chat – it is independent from chat profiles.

+

When "Incognito Mode” is turned on, your currently chosen profile name and image are hidden from your new contacts. It allows anonymous connections with other people without any shared data – when you make new connections or join groups via a link a new random profile name will be generated for each connection.

+

How do invitations work?

+

It is quite a complex process, but fortunately all of this happens in the background, so it's simply to use.

+

Whenever somebody connects to you via your address, they basically ask your client whether they want to establish connection. After that, you can either agree or disagree.
+If interested, please read more: Addresses and invitations.

+

How to configure and delete groups?

+

Please check: Users guide.

+

Are there any reactions to messages? Can I answer specific messages directly?

+

Yes! Currently, there are six emojis available. What's more, you can respond to specific message by holding it and selecting Reply.

+

What do checkmarks mean?

+

It's quite simple:

+
    +
  • one checkmark - message is delivered to the relay (the server).
  • +
  • two checkmarks - message is delivered to the recipient's device.
    +"sent" means accepted by the relay for delivery, "delivered" - stored on the recipient device.
  • +
+

Also see: I do not see the second tick on the messages I sent

+

I want to see when my contacts read my messages

+

To know when your contact read your messages, your contact's app has to send you a confirmation message. And vice versa, for your contact to know when you read the message, your app has to send a confirmation message.

+

The important questions for this feature:

+
    +
  • do you always want that your contacts can see when you read all their messages? Probably, even with your close friends, sometimes you would prefer to have time before you answer their message, and also have a plausible deniability that you have not seen the message. And this should be ok - in the end, this is your device, and it should be for you to decide whether this confirmation message is sent or not, and when it is sent.
  • +
  • what practical problems an automatic notification sent to your contacts when you read the message solves for you compared with you simply adding a reaction to a message or sending a quick reply?
  • +
+

Overall, it seems that this feature is more damaging to your communications with your contacts than it is helpful. It keeps senders longer in the app, nervously waiting for read receipts, exploiting addictive patterns - having you spend more time in the app is the reason why it is usually present in most messaging apps. It also creates a pressure on the recipients to reply sooner, and if read receipts are opt-in, it creates a pressure to enable it, that can be particularly damaging in any relationships with power imbalance.

+

We think that delivery receipts are important and equally benefit both sides as the conversation, as they confirm that communication network functions properly. But we strongly believe that read receipts is an anti-feature that only benefits the app developers, and hurts the relations between the app users. So we are not planning to add it even as opt-in. In case you want your contact to know you've read the message put a reaction to it. And if you don't want them to know it - it is also ok, what your device sends should be under your control.

+

Can I use the same profile on desktop? Do messages sync cross-platform?

+

You can use your profile from mobile device on desktop. However, to do so you need to be on the same network, both on your mobile and desktop. More about it: Release info.

+

Why cannot I delete messages I sent from my contact's device?

+

In SimpleX Chat, you and your contacts can delete the messages you send from recipients' devices if you both agree to that within 24 hours of sending it. To be able to do that you both have to enable "Delete for everyone" option in Contact preferences - tap on the contact's name above the conversation to get there.

+

You can also revoke the files you send. If the recipients did not yet receive the file, they will not be able to receive it after the file is revoked.

+

This is different from most other messengers that allow deleting messages from the recipients' devices without any agreement with the recipients.

+

We believe that allowing deleting information from your device to your contacts is a very wrong design decision for several reasons:

+
    +
  1. it violates your data sovereignty as the device owner - once your are in possession of any information, you have the rights to retain it, and any deletion should be agreed with you. And security and privacy is not possible if users don't have sovereignty over their devices.
  2. +
  3. it may be a business communication, and either your organization policy or a compliance requirement is that every message you receive must be preserved for some time.
  4. +
  5. the message can contain a legally binding promise, effectively a contract between you and your contact, in which case you both need to keep it.
  6. +
  7. the messages may contain threat or abuse and you may want to keep them as a proof.
  8. +
  9. you may have paid for the the message (e.g., it can be a design project or consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation.
  10. +
+

It is also important to remember, that even if your contact enabled "Delete for everyone", you cannot really see it as a strong guarantee that the message will be deleted. Your contact's app can have a very simple modification (a one-line code change), that would prevent this deletion from happening when you request it. So you cannot see it as something that guarantees your security from your contacts.

+

When "Delete for everyone" is not enabled, you can still mark the sent message as deleted within 24 hours of sending it. In this case the recipient will see it as "deleted message", and will be able to reveal the original message.

+

What do group roles mean?

+

Groups support 5 member roles: owner, admin, moderator, member and observer.

+

An observer can:

+
    +
  • add reactions
  • +
  • send reports
  • +
  • talk to admins via "Chat with admins"
  • +
+

A member can:

+
    +
  • send messages
  • +
+

A moderator can:

+
    +
  • approve members in review ("knocking")
  • +
  • moderate messages*
  • +
  • block members temporarily*
  • +
  • participate in "Chats with members"
  • +
+

An admin can:

+
    +
  • add and remove members*
  • +
  • change member roles*, including their own
  • +
  • create group links (but the new members will join via them, so use links of admins who are always online).
  • +
+

A group owner can:

+
    +
  • edit group profile
  • +
  • delete the group
  • +
+

Each role can do everything that the previous roles can, except moderators and higher cannot send reports or "Chat with admins".

+

*Any actions affecting members or their messages can only be applied to members of the same or lower role (so admins can't demote owners or promote anybody to owners, etc., but they can demote other admins and themselves, or make anybody an admin).

+ +

You can replace the server part of the link (e.g., https://smp18.simplex.im/) with simplex:/ and add ?h=smp18.simplex.im (replace it with server of your link) to the end of the link. Then it will not be possible to use it in a web browser, but it will be recognized by SimpleX Chat app.

+

For example, this link: https://smp18.simplex.im/i#E74vSxMwDnEx6DAvRCZmzBeZwwAseJUD/yVTHjaaH_EzL19DG7fvd46Mjry3IBqYT0UMo5G7l4jQ

+

becomes: simplex:/i#E74vSxMwDnEx6DAvRCZmzBeZwwAseJUD/yVTHjaaH_EzL19DG7fvd46Mjry3IBqYT0UMo5G7l4jQ?h=smp18.simplex.im

+

Troubleshooting

+

I do not receive messages or message notifications

+

There may be several reasons messages are not delivered to you from your contact:

+

You or your contact cannot connect to the server that you use to receive messages from your contact.

+

You can check which server is used to receive messages by tapping the contact name above the conversation.

+

You can also run tests for this server from the app Network settings.

+

Please ask your contact if they have a single tick on the message to determine if the message failed to send or if you fail to receive it.

+

Message delivery got stuck because of some unresolved bug.

+

Fully restarting the app is the workaround to resume message delivery.

+

To do it on iOS, simply close the app (swipe up from the opened apps) and open it again.

+

To do it on Android - choose Restart from the app settings, simply closing and re-opening the app will not restart the messaging service.

+

Your Android operating system kills the app while it is in background.

+

Check battery settings for the app - it should be set to Unrestricted.

+

For some devices, there may be additional options to prevent the app from being killed - e.g., on Xiaomi you need to enable Auto Start setting for the app. Please consult https://dontkillmyapp.com site for any additional settings for your device.

+

Why my notifications aren't working on iOS

+

Check the color of the bolt icon next to Notifications in app settings - it should be green.

+

If it's not, please open notifications, disable them (choose Off / Local), and then enable again - you should do it when you have Internet connection.

+

Check if your push server has been restarted at time of the issue (Notifications -> Push server) at https://status.simplex.chat if it has been restarted, you may not receive notifications from that time.

+

If device was offline, you may need to open the app to start receiving notifications.

+

If the above didn't help, the reason could be that iOS failed to issue notification token - we have seen this issue several times. In this case, restarting the whole device should help.

+

In some cases notifications may still not work, iOS notifications are hard to do right in a decentralized app, we will be improving them soon to be more reliable.

+

Messaging server or notification server is under maintenance

+

Please check the current status of preset servers at https://status.simplex.chat. You can also connect to status bot via QR code on that page - it will send the updates when the server is offline for maintenance, and also when the new versions of the app are released.

+

I do not see the second tick on the messages I sent

+

You may not have the second tick on your sent messages for these reasons:

+
    +
  • your contact is not online, and did not receive your message.
  • +
  • possibly, message delivery to your contact or to you is disrupted - see I do not receive messages - please check with your contact via some other channel if they received your message. If the message was delivered, then it means your device could fail to receive the delivery notification.
  • +
  • possibly, your contact disabled sending delivery receipts - it can be disabled for specific or for all contacts - please check with your contact.
  • +
+

I see image preview but cannot open the image

+

It can be for these reasons:

+
    +
  • your contact did not finish uploading the image file, possibly closing the app too quickly. When the image file is fully uploaded there will be a tick in the top right corner or the image
  • +
  • your device fails to receive it. Please check server connectivity and run server tests, and also try increasing network timeouts in Advanced network settings. File reception was substantially improved in v5.7 - please make sure you are using the latest version.
  • +
  • file expired and can no longer be received. Files can be received only for 2 days after they were sent, after that they won't be available and will show X in the top right corner.
  • +
+

I cannot play a voice message

+

This can happen for similar reasons as for images.

+

Please check your network settings and make sure you use the latest version of the app.

+

Please report such issues if you use v5.7 or newer.

+

Audio or video calls do not connect

+

App uses WebRTC for calls. Please check that you can connect to the servers configured in the app: stun.simplex.im and turn.simplex.im - see troubleshooting WebRTC.

+

If you can connect to the server, please report this issue to us privately, including the following information:

+
    +
  • +

    how you connect to the network: WiFi, mobile network, VPN provider - the more information you can provide the better.

    +
  • +
  • +

    app version and platform. For mobile apps, it would help if you can make a screen recording from both devices during unsuccessful calls and share with us.

    +
  • +
  • +

    if the issue is on desktop app, which browser is used for calls. In this case also please check browser console during the call and send us the log, ideally from both sides of the unsuccessful calls.

    +
  • +
+

Thank you for helping us debug and improve calls.

+

Audio or video calls without e2e encryption

+

During the call, the app indicates whether or not the call has end-to-end encryption.

+

If one of the call parties uses Android (or desktop) app, the call would use Android system webview (or browser). Some older systems do not support media stream encryption, in which case the call will connect without it.

+

To determine whether it is the limitation of your, your contact's or both devices:

+
    +
  • if some of your calls have e2e encryption but some don't, then it's certainly the old webview version or browser of your contacts - please ask them to upgrade.
  • +
  • if you are not sure, you can check at what point "no e2e encryption" appears: +
      +
    • if it is shown when the call rings on your device, then your contact's device does not support call encryption.
    • +
    • if it is shown on your screen as soon as you start the call, then your device does not support call encryption.
    • +
    • if in the beginning of the call your device shows "e2e encryption" but when your contact accepts the call it changes to "no e2e encryption", then it is only your contact's device that does not support it.
    • +
    +
  • +
+

You need to upgrade webview (some Android systems allow it), Android system or the device to have support for e2e encryption in the calls - all modern WebViews (and browsers) support it.

+ +

If you confirmed the connection in the app, pending connection will be shown in the list of chats - you can assign the name to it, so you know who it was when your contact is connected (e.g., if they choose some name you don't recognize).

+

For connection to complete, your contact has to be online and have the app running - please ask them to open the app, and try to have the app open at the same time - it will help to complete the connection faster.

+

Once the connection is established you don't need to be online at the same time to send messages.

+

I do not know my database passphrase

+

If you are prompted to enter database passphrase and you do not know it, this could have happened due to:

+
    +
  • You may have forgotten the passphrase. (There is no other way to access your data).
  • +
  • Migration of app data from one device to another while using unsupported migration process, e.g. via iCloud backup. Use SimpleX Chat's own migration process in the app Settings.
  • +
+

In the previous desktop app versions it could also happen in case of error during SimpleX Chat installation.

+

You can resolve it by deleting the app's database: (WARNING: this results in deletion of all profiles, contacts and messages)

+
    +
  • on Android/iOS, uninstall the app and install it again.
  • +
  • on Windows, delete folder C:\AppData\Roaming\SimpleX, you can find it by pressing Windows key + R and entering %appdata%.
  • +
  • on Linux/Mac, delete directories ~/.local/share/simplex and ~/.config/simplex, where ~ represents your home directory (/home/user)
  • +
  • on Flatpak, delete directory ~/.var/app/chat.simplex.simplex.
  • +
+

My mobile app does not connect to desktop app

+
    +
  1. Check that both devices are connected to the same network (e.g., it won't work if mobile is connected to mobile Internet and desktop to WiFi).
  2. +
  3. If you use VPN on mobile, allow connections to local network in you VPN settings, or disable VPN.
  4. +
  5. Allow SimpleX Chat on desktop to accept network connections in system firewall settings. You may choose a specific port in desktop app to accept connections, by default it uses a random port every time.
  6. +
  7. Check that your WiFi router allows connections between devices (e.g., it may have an option for "device isolation", or similar).
  8. +
  9. If you see an error "certificate expired", please check that your device clocks are synchronized within a few seconds.
  10. +
  11. If iOS app fails to connect and shows an error containing "no route", check that local network connections are allowed for the app in system settings.
  12. +
+

Also see this post: https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol

+

If none of the suggestions work for you, you can create a separate profile on each device and create a small group inviting both of your device profiles and your contact.

+

Privacy and security

+

Does SimpleX support post quantum cryptography?

+

Yes! Please read more about quantum resistant encryption is added to SimpleX Chat and about various properties of end-to-end encryption in this post.

+

Why can't I use the same profile on different devices?

+

SimpleX Chat apps support linking of mobile and desktop apps via secure quantum-resistant protocol. It allows using the profile on your mobile device from desktop clients.

+

Seamlessly and securely using the same profile from two or more devices is a complex and unsolved problem. All apps that provide multi-device support do so at a cost of compromising security of end-to-end encryption. E.g., Session removed the Double Ratchet algorithm entirely to enable multi-device support, sacrificing forward secrecy. Signal provides multi-device support with Double Ratchet algorithm, but by compromising its "break-in recovery" property (aka post-compromise security).

+

To the best of our knowledge there is no end-to-end encrypted messenger that solved this problem without compromising security, but we believe that the solution is possible. We have considered several approaches:

+
    +
  1. +

    Convert each direct conversation into a group, where each device participates as a member. This is the approach that Signal and WhatsApp use, and while Signal implementation does not protect from a temporary compromise of long-term identity key (break-in recovery), such protection is possible. The downside of this approach is that the contacts and groups you participate in would know which device you use. Another possible attack is to send different messages to different devices, or to send messages to some devices but not to the others. This could lead to message history inconsistency or enable targeted attacks.

    +
  2. +
  3. +

    Store the state of the Double Ratchet algorithm for each conversation in an encrypted container on the server, allowing concurrent access and modification by each device for encrypting and decrypting messages. We did not see this approach used in any of the messaging apps, but it is technically viable. This approach has no downsides of the first, but it would increase the time it takes to send and to receive messages, as each message would require additional access to the server.

    +
  4. +
  5. +

    "Thin client" approach when user profile is stored on the server. The main challenge with this approach is to prevent the server knowing who connects to whom.

    +
  6. +
+

Whichever approach we choose for multi-device support, it requires careful design and implementation, and there is no existing secure solution to copy from. While we value usability very highly, we will not be improving usability in a way that compromises users' security. We will take a slower path of designing and implementing a solution for multi-device that achieves a better trade-off between usability and security than currently offered.

+

In the meantime, here are several secure options to enhance usability:

+
    +
  • link mobile profiles with desktop app. It does not compromise security in any way.
  • +
  • create small groups with trusted contacts. These contacts would still know which device you use when you send the message, but it won't be shared with all contacts and groups you participate in. This approach is also secure, and it prevents devices being added to the conversation without user noticing.
  • +
  • use "business address" - the app would create a new small group with everybody who connects to you via your address, and you will be able to add your other devices to these groups.
  • +
+

While these approaches are not as convenient as seamless multi-device support offered by other apps, they also do not compromise security to achieve that convenience.

+

What user data can be provided on request?

+

Our objective is to consistently ensure that no user data and absolute minimum of the metadata required for the network to function is available for disclosure by any infrastructure operators, under any circumstances.

+

Please see our Privacy Policy and Transparency Reports.

+

Does SimpleX protect my IP address?

+

Yes!

+

SimpleX Chat from version 6.0 uses private message routing whenever you send messages to unknown servers (all servers in app network settings, both enabled and not, are considered "known").

+

For private routing to work, the servers chosen by your contacts (and by the group members in your groups) must be upgraded to the recent versions. Messaging servers include support for private routing from v5.8, but we recommend using the latest versions.

+

If the servers didn't upgrade, the messages would temporarily fail to deliver. You will see an orange warning icon on the message, and you can decide if you want to deliver them by connecting to these servers directly (it would require changing network settings). At the time of writing (August 2024), all preset servers and absolute majority of self-hosted servers we can see on the network support private message routing.

+

With private routing enabled, instead of connecting to your contact's server directly, your client would "instruct" one of the known servers to forward the message, preventing the destination server from observing your IP address.

+

Your messages are additionally end-to-end encrypted between your client and the destination server, so that the forwarding server cannot observe the destination addresses and server responses – similarly to how onion routing work. Private message routing is, effectively, a two-hop onion packet routing.

+

Also, this connection is protected from man-in-the-middle attack by the forwarding server, as your client will validate destination server certificate using its fingerprint in the server address.

+

You can optionally enable private message routing for all servers in Advanced network settings to complicate traffic correlation for known servers too. This will be default once the clients are improved to "know about" and to take into account network server operators.

+

See this post for more details about how private message routing works.

+

Doesn't private message routing reinvent Tor?

+

No, it does not!

+

It provides better privacy for messaging than Tor, and it can be used with and without Tor or other means to additionally protect your traffic from known servers as well.

+

Tor, VPN and other transport overlay networks route sockets, by creating long-lived TCP circuits between you and the destination server. While it protects your IP address, it does not protect your activity within this circuit. E.g., if you visit a website via Tor, it can still observe all pages you view within a session. Likewise, if you were connecting directly to a messaging server via Tor, this server would be able to list all message queues you send messages to.

+

Private message routing routes packets (each message is one 16kb packet), not sockets. Unlike Tor and VPN, it does not create circuits between your client and destination servers. The forwarding server creates one shared session between itself and the destination, and forwards all messages from you and other clients to that destination server, mixing messages from many clients into a single TCP session.

+

As each message uses its own random encryption key and random (non-sequential) identifier, the destination server cannot link multiple message queue addresses to the same client. At the same time, the forwarding server cannot observe which (and how many) addresses on the destination server your client sends messages to, thanks to e2e encryption between the client and destination server. In that regard, this design is similar to onion routing, but with per-packet anonymity, not per-circuit.

+

This design is similar to mixnets (e.g. Nym network), and it is tailored to the needs of message routing, providing better transport anonymity that general purpose networks, like Tor or VPN. You still can use Tor or VPN to connect to known servers, to protect your IP address from them.

+

Why don't you embed Tor in SimpleX Chat app?

+

Tor is a fantastic transport overlay network - we believe it might be the best there is right now. If its threat model works for you, you absolutely should use it - SimpleX Chat app supports Tor via SOCKS proxy since v3.1, and SimpleX network servers can be available on both public and onion address at the same time since v3.2, improving anonymity of the users who use Tor.

+

If you host your messaging server on the onion address only, the users who don't use Tor would still be able to message you via private message routing - all preset servers are configured to forward messages to onion-only servers.

+

But there are many reasons not to embed Tor in the app:

+
    +
  • it increases response latency, error rate, and battery usage, and we believe that for most users enabling Tor by default would be a bad trade-off.
  • +
  • it would require us regularly updating Tor library in the app, and your Tor integrity would depend on us – you would be "putting too many eggs in one basket".
  • +
  • some networks restrict Tor traffic, so the app UI would have to support advanced Tor configuration, diverting our limited resources from the core app features that benefit all users.
  • +
  • some countries have legislative restrictions on Tor usage, so we would have to support multiple app versions, also increasing our costs and slowing down the progress.
  • +
+

The last, but not the least, it would create an unfair competitive advantage to Tor. We believe in competition, and we want our users to be able to choose which transport overlay network to use, based on what network threat model works best for them.

+

If you want to use Tor or any other overlay network, such as i2p, Nym network, Katzenpost, etc., you need to research their limitations, because none of them provides absolute anonymity against all possible attackers.

+

And if after that research you decide to use Tor, it takes about 2 minutes to install and start Orbot app. We believe that if it seems complex, then you should not be using Tor - it is an advanced technology that can only improve your privacy and anonymity if you understand its limitations and know how to configure it.

+

Can I host my own relays?

+

Of course! Please check these tutorials: SMP server and XFTP server.

+

Funding and business model

+

How are you funded?

+

SimpleX Chat Ltd is funded by private investors and venture capital. As an open-source project, it is also being generously supported by donations as well. Read the posts from 2023 and from 2024 for more details.

+

Why VCs?

+

Here are some reflections on VC funding being a necessity for a project at this scale, as well as sustainability and profitability for longtime operations: https://www.poberezkin.com/posts/2023-10-31-why-privacy-impossible-without-venture-funding.html

+

And another perspective from a team member on the delicate balance of venture-backed and nonprofit structures, and the plans for the SimpleX network protocols to evolve under the stewardship of nonprofit entities in various jurisdictions, so that its continued evolution aligns more closely with the vision of community-driven, independent and transparent governance:
+https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html.

+

What will be the business model?

+

We are focusing on product-market fit, and as such the business model is still a work in progress. However, the app will have a freemium model with extra features or capabilities for paid users (taking into consideration a potential formula like 5% paying $5/month is $3/user/year - ~90% gross profit margin).

+

The other income stream would be via business services, for entities needing direct and customized support to integrate with the SimpleX protocol or related resources. There will also be a revenue-sharing model from customers to network operators, to provide an incentive for them to continue running nodes, which will increase decentralization and reliability of the network.

+

Non-exploitative commercial models with fully open source code are not easy to achieve, and we’re committed to finding the best possible fit for our context. Everything will be fully communicated as this plan progresses.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/fdroid/index.html b/fdroid/index.html new file mode 100644 index 0000000000..61a59d3171 --- /dev/null +++ b/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stable and beta versions built by the developers

+

To add it to your F-Droid client, scan the QR code or use this URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stable versions built by F-Droid.org

+

The releases to this repo are done several days later.

+

SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/feed.atom b/feed.atom new file mode 100644 index 0000000000..5b158356e8 --- /dev/null +++ b/feed.atom @@ -0,0 +1,3738 @@ + + + https://simplex.chat/ + + + SimpleX Chat Blog + It allows you to stay up to date with the latest Blogs from SimpleX Chat. + 2025-07-29T00:00:00Z + + SimpleX Chat + chat@simplex.chat + + + https://simplex.chat/blog/20201022-simplex-chat.html + + 2020-10-22T00:00:00Z + + Simplex Chat + <h1 id="simplex-chat" tabindex="-1">Simplex chat</h1> +<p><strong>Published:</strong> Oct 22, 2020</p> +<p><a href="https://simplex.chat/">https://simplex.chat</a></p> +<p>I'd really appreciate your feedback, criticism and suggestions on the open-source idea I was slowly working on since early 2020. I recently made the demo server for the low-level message queue protocol (&quot;simplex messaging protocol&quot;) and the website to try to explain the chat idea that would use this protocol.</p> +<p>Haskell protocol implementation: <a href="https://github.com/simplex-chat/simplexmq">https://github.com/simplex-chat/simplexmq</a></p> +<p>In short, the protocol defines a minimalist set of commands and server responses (just 7 commands and 5 responses sent over TCP) to operate encrypted message queues with in-memory persistence - the implementation uses STM.</p> +<p>If anything, it was definitely helping to get to know Haskell types etc. much deeper than before :)</p> +<p>Any criticism would be great - thank you in advance!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/jg6uh4/simplex_chat/">https://www.reddit.com/r/haskell/comments/jg6uh4/simplex_chat/</a></p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20210512-simplex-chat-terminal-ui.html + + 2021-05-12T00:00:00Z + + Announcing SimpleX Chat Prototype! + <h1 id="announcing-simplex-chat-prototype" tabindex="-1">Announcing SimpleX Chat Prototype!</h1> +<p><strong>Published:</strong> May 12, 2021</p> +<p>For the last six months <a href="https://github.com/epoberezkin">me</a> and my son Efim have been working to bring you a working prototype of SimpleX Chat. We're excited to announce SimpleX Chat terminal client is now available <a href="https://github.com/simplex-chat/simplex-chat">here</a> on Linux, Windows and Mac (you can either build from source or download the binary for Linux, Windows or Mac from the latest release).</p> +<p>We’ve been using the terminal client between us and a few other people for a couple of months now, eating our own “dog food”, and have developed up to version 0.3.1, with most of the messaging protocol features we originally planned</p> +<h2 id="features" tabindex="-1">Features</h2> +<ul> +<li>End-to-end encryption with protection from man in the middle attack. The connection invitation must be passed out-of-band (see <a href="https://github.com/simplex-chat/simplex-chat#how-to-use-simplex-chat">how to use SimpleX Chat</a> in the repo).</li> +<li>No global identity or any usernames visible to the server(s), ensuring full privacy of your contacts and conversations.</li> +<li>Message signing and verification with automatically generated RSA keys, with keys being unique per each connection.</li> +<li>Authorization of each command/message by the servers with automatically generated RSA key pairs, also unique per connection.</li> +<li>Message integrity validation (via passing the digests of the previous messages).</li> +<li>Encrypted TCP transport, independent of certificates.</li> +<li>You can deploy your own server, but you don’t have to - the demo SMP server to relay your messages is available at <a href="http://smp1.simplex.im:5223/">smp1.simplex.im:5223</a> (pre-configured in the client).</li> +</ul> +<h2 id="we-need-your-help" tabindex="-1">We need your help!</h2> +<p>We're building a new kind of chat network - the only network that lets you control your chat. We'd really appreciate your feedback, criticism and support - a star on the github repo, signing up to the mailing list or any contribution to the project will help. There is so much more to do!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/naw6lz/simplex_chat_prototype_terminal_ui_made_in_haskell/">https://www.reddit.com/r/haskell/comments/naw6lz/simplex_chat_prototype_terminal_ui_made_in_haskell/</a></p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20210914-simplex-chat-v0.4-released.html + + 2021-09-14T00:00:00Z + + SimpleX announces SimpleX Chat v0.4 + <h1 id="simplex-announces-simplex-chat-v04" tabindex="-1">SimpleX announces SimpleX Chat v0.4</h1> +<p><strong>Published:</strong> Sep 14, 2021</p> +<h2 id="open-source-decentralized-chat-that-uses-privacy-preserving-message-routing-protocol" tabindex="-1">Open-source decentralized chat that uses privacy-preserving message routing protocol</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v05" tabindex="-1">What's new in v0.5?</h2> +<p>We're exicted to announce that SimpleX Chat now supports group chat and file transfer!</p> +<h3 id="chat-groups" tabindex="-1">Chat groups</h3> +<p>To create a group use the <code>/g &lt;group&gt;</code> command. You can then invite contacts to the group by entering the <code>/a &lt;group&gt; &lt;name&gt;</code> command. Your contact(s) will need to use the <code>/j accept</code> command to accept the invitation to the group. To send messages to the group, simply enter <code>#&lt;group&gt; &lt;message&gt;</code>.</p> +<p><strong>Please note:</strong> Groups are not stored on any server; they are maintained as a list of members in the app database. Sending a message to the group sends a message to each member of the group.</p> +<p><img src="https://simplex.chat/blog/images/groups.gif" alt="simplex-chat" /></p> +<h3 id="file-transfer" tabindex="-1">File transfer</h3> +<p>Sharing files is simple! To send a file to a contact, use the <code>/f @&lt;contact&gt; &lt;file_path&gt;</code> command. The recipient will have to accept before the file is sent.</p> +<p><img src="https://simplex.chat/blog/images/files.gif" alt="simplex-chat" /></p> +<h2 id="were-always-looking-for-help" tabindex="-1">We're always looking for help!</h2> +<p>We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!</p> +<p><strong>Please note:</strong> SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.</p> +<p>Our goal is to create a new kind of chat platform that lets you control your chat!</p> +<p>Originally published at <a href="https://www.reddit.com/r/selfhosted/comments/poal79/simplex_chat_an_opensource_decentralized_chat/">https://www.reddit.com/r/selfhosted/comments/poal79/simplex_chat_an_opensource_decentralized_chat/</a></p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20211208-simplex-chat-v0.5-released.html + + 2021-12-08T00:00:00Z + + SimpleX announces SimpleX Chat v0.5 + <h1 id="simplex-announces-simplex-chat-v05" tabindex="-1">SimpleX announces SimpleX Chat v0.5</h1> +<p><strong>Published:</strong> Dec 08, 2021</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-simplex-no-access-to-your-connections-graph" tabindex="-1">Simplex Chat is the first chat platform that is 100% private by design - SimpleX no access to your connections graph</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v05" tabindex="-1">What's new in v0.5?</h2> +<h3 id="long-term-chat-addresses" tabindex="-1">Long-term chat addresses</h3> +<p>Users can now create long-term chat addresses that they can share with many people (e.g. in email signature, or online), so that any chat user can send them a connection request.</p> +<p>This is an ALPHA feature, and we have not yet added any protection against spam contact requests. However, if the address you created starts receiving spam connection requests, you can simply delete it without losing any of your accepted connections and create another address - as many times as you like!</p> +<h2 id="we-need-your-help" tabindex="-1">We need your help!</h2> +<p>We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!</p> +<p><strong>Please note:</strong> SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.</p> +<p>Our goal is to create a new kind of chat platform that lets you control your chat!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/rc0xkn/simplex_chat_the_first_chat_platform_that_is_100/">https://www.reddit.com/r/haskell/comments/rc0xkn/simplex_chat_the_first_chat_platform_that_is_100/</a></p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220112-simplex-chat-v1-released.html + + 2022-01-12T00:00:00Z + + SimpleX announces SimpleX Chat v1 + <h1 id="simplex-announces-simplex-chat-v1" tabindex="-1">SimpleX announces SimpleX Chat v1</h1> +<p><strong>Published:</strong> Jan 12, 2022</p> +<h2 id="the-most-private-and-secure-chat-and-application-platform" tabindex="-1">The most private and secure chat and application platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>There is currently no messaging application which respects user privacy and guarantees metadata privacy - in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v1" tabindex="-1">What's new in v1?</h2> +<h3 id="stable-protocol-implementation" tabindex="-1">Stable protocol implementation</h3> +<p>All releases from v1 onwards will be forwards and backwards compatible.</p> +<h3 id="message-encryption-has-been-completely-re-engineered-to-provide-forward-secrecy-and-recovery-from-break-in" tabindex="-1">Message encryption has been completely re-engineered to provide forward secrecy and recovery from break-in.</h3> +<p>SimpleX Chat v1 now uses:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption using AES-256-GCM cipher with <a href="https://www.signal.org/docs/specifications/x3dh/">X3DH key agreement</a> using 2 ephemeral Curve448 keys to derive secrets for ratchet initialization. These keys and secrets are separate for each contact, group membership and file transfer.</li> +<li>in addition to double ratchet, there is a separate E2E encryption in each message queue with DH key exchange using Curve25519 and <a href="https://nacl.cr.yp.to/index.html">NaCl crypto-box</a> - separate E2E encryption has been added to avoid having any cipher-text in common between message queues of a single contact (to prevent traffic correlation).</li> +<li>additional encryption of messages delivered from servers to recipients, also using Curve25519 DH exchange and NaCl crypto-box - to avoid shared cipher-text in sent and received traffic (also to prevent traffic correlation).</li> +</ul> +<h3 id="improved-user-and-server-authentication-and-transport" tabindex="-1">Improved user and server authentication and transport</h3> +<p>SimpleX now uses ephemeral Ed448 keys to sign and verify client commands to the servers. As before, these keys are different per message queue and do not represent a user's identity.</p> +<p>Instead of ad-hoc encrypted transport we now use TLS 1.2+ limited to the most performant and secure cipher with forward secrecy (ECDHE-ECDSA-CHACHA20POLY1305-SHA256), Curve448 groups and Ed448 keys.</p> +<p>Server identity is validated as part of TLS handshake - the fingerprint of offline server certificate is used as a permanent server identity which is included in server address, to protect against MITM attacks between clients and servers.</p> +<p>SimpleX also uses <a href="https://datatracker.ietf.org/doc/html/rfc5929#section-3">tls-unique channel binding</a> in each signed client command to the server to protect against replay attacks.</p> +<h3 id="changes-in-protocol-encoding" tabindex="-1">Changes in protocol encoding</h3> +<p>We switched from inefficient text-based low level protocol encodings, that simplified early development, to space and performance efficient binary encodings, reducing protocol overhead from circa 15% to 3.7% of transmitted application message size.</p> +<h2 id="learn-more-about-simplex" tabindex="-1">Learn more about Simplex</h2> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">here</a>.</p> +<p>SimpleX Chat client can be used in the terminal on all major desktop platforms (Windows/Mac/Linux) and also on Android devices with <a href="https://github.com/termux">Termux</a>.</p> +<p>SimpleX also allows people to host their own servers and own their own chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages).</p> +<h2 id="we-look-forward-to-you-using-it" tabindex="-1">We look forward to you using it!</h2> +<p>We look forward to your feedback and suggestions - via GitHub issues or via SimpleX Chat - you can connect to the team with <code>/simplex</code> command once you run the chat.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220214-simplex-chat-ios-public-beta.html + + 2022-02-14T00:00:00Z + + SimpleX announces SimpleX Chat public beta for iOS + <h1 id="simplex-announces-simplex-chat-public-beta-for-ios" tabindex="-1">SimpleX announces SimpleX Chat public beta for iOS</h1> +<p><strong>Published:</strong> Feb 14, 2022</p> +<h2 id="private-and-secure-chat-and-application-platform-public-beta-is-now-available-for-iphones-with-ios-15" tabindex="-1">Private and secure chat and application platform - <a href="https://testflight.apple.com/join/DWuT2LQu">public beta is now available</a> for iPhones with iOS 15.</h2> +<p>Our new iPhone app is very basic - right now it only supports text messages and emojis.</p> +<p>Even though the app is new, it uses the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 a month ago:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption.</li> +<li>separate keys for each contact.</li> +<li>additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).</li> +<li>additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).</li> +</ul> +<p>You can read more details in our recent <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a>.</p> +<h2 id="join-our-public-beta" tabindex="-1">Join our public beta!</h2> +<p>Install the app <a href="https://testflight.apple.com/join/DWuT2LQu">via TestFlight</a>, connect to us (via <strong>Connect to SimpleX team</strong> link in the app) and to a couple of your friends you usually send messages to - and please let us know what you think!</p> +<p>We would really appreciate any feedback to improve the app and to decide which additional features should be included in our public release in March.</p> +<p>Should it be:</p> +<ul> +<li>images,</li> +<li>link previews,</li> +<li>or maybe something else we couldn't think of.</li> +</ul> +<p>Please vote on the features you think are the most needed in our <a href="https://app.loopedin.io/simplex">app roadmap</a>.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter.</p> +<p>We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which is available for terminal (command line in Windows/Mac/Linux) and as iOS public beta - with Android app coming in a few weeks. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<p>SimpleX also allows people to host their own servers to have control of their chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages). It should be considered though that while self-hosting the servers provides more control, it may reduce meta-data privacy, as it is easier to correlate the traffic of servers with small number of messages coming through.</p> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">in SimpleX platform overview</a>.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220308-simplex-chat-mobile-apps.html + + 2022-03-08T00:00:00Z + + SimpleX announces SimpleX Chat mobile apps for iOS and Android + <h1 id="simplex-announces-simplex-chat-mobile-apps-for-ios-and-android" tabindex="-1">SimpleX announces SimpleX Chat mobile apps for iOS and Android</h1> +<p><strong>Published:</strong> March 8, 2022</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-it-has-no-access-to-your-connections-graph" tabindex="-1">SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections graph</h2> +<p>We have now released iPhone and Android apps to <a href="https://apps.apple.com/us/app/simplex-chat/id1605771084">Apple AppStore</a> and <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Google Play Store</a>, <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK for Android</a> is also available for direct download.</p> +<p><strong>Please note</strong>: the current version is only supported on iPhone 8+ and on Android 10+ - we are planning to add support for iPad and older devices very soon, and we will announce it on our <a href="https://www.reddit.com/r/SimpleXChat/">Reddit</a> and <a href="https://twitter.com/SimpleXChat">Twitter</a> channels - please subscribe to follow our updates there.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter.</p> +<p>We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">in SimpleX platform overview</a>.</p> +<h2 id="why-we-are-building-it" tabindex="-1">Why we are building it</h2> +<p>Evgeny (SimpleX Chat founder): I have been working on this platform for a long time to provide a place where all people can communicate freely with each other, without fear of persecution because of what they said and who they are connected with. Not sharing information about your connections is very important, particularly for people living in oppressive regimes. Because of the terrible conflict between Russia and Ukraine, people of both countries – I have friends and family there – could be at risk when sharing their opinions or just from being connected to people who were prosecuted. Every messenger app that knows who you are can end up sharing all of your connections with undesirable third parties, either as a result of a court order or as a result of attack - so even Signal, which has strong encryption, cannot protect your connection graph. I hope our messenger can help people living in the oppressive regimes to express their opinions without fear and risk of prosecution.</p> +<h2 id="huge-thanks-to-our-testers" tabindex="-1">Huge thanks to our testers!</h2> +<p>Thanks a lot to everybody who helped testing and improving the apps!</p> +<p>If you have a <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight version</a> installed you can continue using it.</p> +<p>We plan to keep it as stable as we can, and it will give you access to all new features 1-2 weeks earlier - it's limited to 10,000 users, so you can grab it while it's available. You can still communicate with people who use a public version – we are committed to maintaining backwards compatibility.</p> +<p>You can always migrate from a public App Store version to a TestFlight version. The opposite migration - from TestFlight to public version - is only possible when we have the same app versions released, as there are usually some database migrations that cannot be reversed. To migrate to public version you have to disable automatic updates on TestFlight, wait until public version catches up and then install it from App Store. In any case, it is safe installing the public version, but it might crash if you have a newer version from TestFlight - in this case you just need to re-install the app from TestFlight and install App Store version a bit later - you would not lose any of your data.</p> +<h2 id="its-not-all-new-our-core-code-has-been-used-for-a-long-time-by-a-few-thousand-people-in-our-terminal-app" tabindex="-1">It's not all new - our core code has been used for a long time by a few thousand people in our terminal app.</h2> +<p>The apps use the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 earlier this year:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption.</li> +<li>separate keys for each contact.</li> +<li>additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).</li> +<li>additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).</li> +</ul> +<p>You can read more technical details in our recent <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a>.</p> +<p>A big thank you to <a href="https://github.com/angerman">@angerman</a> for making it possible to compile our Haskell code to mobile platforms and getting it approved on app stores - it has been a non-trivial project, and it is still ongoing.</p> +<h2 id="install-the-apps-and-make-a-private-connection" tabindex="-1">Install the apps and make a private connection!</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers, it is local to your devices, and it will be shared with your contacts when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link / QR code via &quot;Add contact&quot; button in the app. You can either show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel - only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link (they also should create their profile first) the connection will be created and you can send e2e encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<h2 id="new-features-and-improvements-that-are-coming-soon" tabindex="-1">New features and improvements that are coming soon</h2> +<ul> +<li>push notification server. Currently the apps load messages in the background periodically, that can be quite infrequent on iOS if you don't open the app regularly. With push notifications you would know about the new messages instantly.</li> +<li>e2e encrypted audio and video calls via WebRTC.</li> +<li>export and import of the chat database.</li> +<li>&quot;reply to message&quot; - feature allowing you to quote the message you are replying to.</li> +<li>localization - we will let you know once you can contribute the translations to your languages.</li> +<li>configuring your servers in the apps - this will be released this week, both for iOS and Android. By default the apps are using SimpleX Chat servers, but you will be able to configure your own and still be connected to other users who use our app with our servers.</li> +<li>user profile images.</li> +<li>sending images and files - image preview will be sent via the servers, so it can be asynchronous, and large files/full resolution images via WebRTC, so both devices will have to be online.</li> +</ul> +<p>Please let us know what else you think is important and if you find any bugs.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html + + 2022-04-04T00:00:00Z + + Instant notifications for SimpleX Chat mobile apps + <h1 id="instant-notifications-for-simplex-chat-mobile-apps" tabindex="-1">Instant notifications for SimpleX Chat mobile apps</h1> +<p><strong>Published:</strong> April 04, 2022</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-it-has-no-access-to-your-connections" tabindex="-1">SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections</h2> +<p>Since we released SimpleX Chat mobile apps couple of weeks ago we've had a lot of excitement from our users - nearly 2000 people downloaded the app after <a href="https://simplex.chat/blog/20220308-simplex-chat-mobile-apps.html">the announcement</a>!</p> +<p>Huge thanks to everybody who downloaded and connected to us via the chat - there were many great questions and suggestions, and on some days I spent most of the time chatting to our users :)</p> +<p>Since we released the app, we've added and released:</p> +<ul> +<li>support for iPhone 7.</li> +<li>configurable SimpleX servers.</li> +<li>message replies, editing and deletion.</li> +<li>profile images.</li> +<li>and, most importantly, private instant message notifications on Android devices - more on that below.</li> +</ul> +<h2 id="install-the-apps-and-make-a-private-connection" tabindex="-1">Install the apps and make a private connection!</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link or a QR code via the &quot;Add contact&quot; button in the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<p>See <a href="https://youtu.be/rZeVhsv_JAY">demo video</a> that shows how two users connect and send the first messages.</p> +<h2 id="why-we-are-doing-it" tabindex="-1">Why we are doing it</h2> +<p>We are building SimpleX Chat because we believe that privacy is a fundamental human right, and that protecting our personal network of contacts is even more important than the content of the messages - sharing this network can lead to various adverse consequences, from manipulating us into buying goods we don't need, manipulating election processes, and in some cases, prosecuting innocent people. For example, <a href="https://en.wikipedia.org/wiki/Mohamedou_Ould_Slahi">Mohamedou Ould Salahi</a> was detained in Guantanamo prison for 15 years after a single &quot;wrong&quot; phone call. His story is told in his memoir and in The Mauritanian movie.</p> +<h2 id="problem-users-expect-to-be-instantly-notified-when-messages-arrive" tabindex="-1">Problem - users expect to be instantly notified when messages arrive!</h2> +<p>Our first users realized that what we take for granted in messaging apps - instant message notifications - is missing in our first release of SimpleX Chat apps. Quite a few people thought that it was a bug, rather than a missing feature. Sorry to disappoint!</p> +<h2 id="why-cant-we-just-do-what-messenger-x-does" tabindex="-1">Why can't we just do what messenger X does?</h2> +<p>SimpleX Chat is the first and the only messenger we know of that operates without user identities of any kind. There are no phone numbers, emails, usernames, public keys, or any other addresses or identifiers to uniquely identify the users to the network or servers. That is why we say it is 100% private by design, and fundamentally different than other chat platforms.</p> +<p>Instead, SimpleX Chat assigns these identifiers to unidirectional message queues. What looks to SimpleX Chat users like contacts and groups [1], to SimpleX servers looks like an unorganized and unrelated collection of unidirectional message queues. Our servers do not know which queues belong to which users, contacts or groups. Even a single conversation can happen via two different servers (one for sent and another for received messages). This makes our personal network of contacts invisible to the servers.</p> +<p>But it also creates a problem for instant notifications - all push notification services require having a device token.</p> +<p>So, how can we operate without identities and still have instant notifications?</p> +<p>[1] yes, we have groups in our terminal app, and the UI to manage them is coming to mobile apps soon. Some users have already firgured out how to <a href="https://medium.com/@vsevolod.mineev/how-to-collaborate-across-multiple-devices-whilst-protecting-your-metadata-371af87d0ba0">create groups via chat console</a>.</p> +<h2 id="weve-cracked-it-for-android" tabindex="-1">We've cracked it for Android!</h2> +<p>After some research into how push notifications work on Android, and open-source alternatives to Google push notifications, we discovered how to avoid sharing device tokens with any servers.</p> +<p>We have implemented message reception as a background service (in Android terminology, a &quot;foreground service&quot; showing a notification icon when the service is running) following the same design as <a href="https://github.com/binwiederhier/ntfy-android">ntfy.sh</a> created by <a href="https://github.com/binwiederhier">Philipp Heckel</a>, who, in turn, credits the design to <a href="https://robertohuertas.com/2019/06/29/android_foreground_services/">the blog post by Roberto Huertas</a>. Big thanks to them!</p> +<p>How does it work? When the app is first started on an Android device, it starts the background service that keeps the TCP connections to the messaging servers open with almost no traffic (only doing periodic checks that connections still exist). It consumes only a few percents of battery per day, depending on how stable your internet connection is, and delivers message notifications as soon as messages arrive.</p> +<p>This service continues running when the app is switched off, and it is restarted when the device is restarted even if you don't open the app - so the message notifications arrive instantly every time. To maximize battery life, it can be turned off by switching off &quot;Private notifications&quot;. You will still receive notifications while the app is running or in the background.</p> +<p>So, for Android we can now deliver instant message notifications without compromising users' privacy in any way. The app version 1.5 that includes private instant notifications is now available on <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a>, in our <a href="https://app.simplex.chat/">F-Droid repo</a> and via direct <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK</a> downloads!</p> +<p>Please let us know what needs to be improved - it's only the first version of instant notifications for Android!</p> +<h2 id="ios-notifications-require-a-server" tabindex="-1">iOS notifications require a server</h2> +<p>iOS is much more protective of what apps are allowed to run on the devices, and the solution that worked on Android is not viable on iOS.</p> +<p>We already have background refresh in the iOS app that periodically checks for new messages, and if you use the app every day it delivers notifications within 10 or 20 minutes. It is not instant, but it may be usable for some. If you use the app infrequently, however, this delay can become several hours, or your phone may stop checking for the new messages completely. This is not ideal!</p> +<p>The only solution known to us is using Apple's push notifications service (APN) to deliver push notifications.</p> +<p>We planned for it, so we added to <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 of SMP</a> (the protocol used by our servers) an extension allowing the client to subscribe to notifications from message queues, via separate queue addresses, and using separate cryptographic keys for each queue. This has to be enabled by the client for each queue separately. We haven't used this extension so far, and now we are building a SimpleX notification service based on it.</p> +<p>If the user enables push notifications, then for each contact the app would enable a notification subscription and pass credentials to the notification server together with the device token required to deliver push notifications to user's device.</p> +<p>The notification server will subscribe to these notifications from SMP servers. The notifications do not include any message content, only the signal that a message has arrived to the server. Notification server is only allowed to send 2-3 hidden notifications per hour to the device. The notification is end-to-end encrypted and contains information about which server has a message, so that the client can connect to the server, retrieve and decrypt the message, and show the notification to the users including sender name and the message content. None of this information is shared with any server.</p> +<p>If the user receives more than 2-3 messages per hour, the notification server can send additional visible notifications that would simply say &quot;you have a new message&quot;, and the user will have to open the app to receive and see these messages. We are also investigating whether we can use &quot;mutable-content&quot; notifications that allow doing some processing when the notification arrives before showing it to the users.</p> +<p>It is a substantial amount of development, we are aiming to release it later this month.</p> +<p>This design is a compromise between privacy and convenience. The notification server will have to have a device token to deliver notifications. Several things we did (or plan to do) to improve this compromise:</p> +<ol> +<li>The notification server will only store device tokens and queue addresses in memory, making it more complex for a potential attacker to access. If server has to be restarted, they would lose all configured notification subscriptions and the clients would have to create them again. We will program the clients to periodically check for the existence of notification subscriptions on the notification server.</li> +<li>The notificaiton server will not know the addresses of the messaging queues used to receive or send messages. A different address is used to subscribe to notifications. So while the notification server would have the knowledge of how many queues your device has (and on which servers), it still won't know who is sending you the messages.</li> +<li>We are also planning to split the logic of notification subscriptions and delivering notifications to the devices to two different servers. The server that subscribes to the notifications could be self-hosted, allowing you full control of how you deploy it. Only this server would know which messaging servers you use or how many messaging queues you have. The server that delivers notifications to the devices will be managed by SimpleX Chat as we have to authorize it with Apple's push notification service. This split will not be available in the first release. We plan to add it a bit later.</li> +</ol> +<p>So, with the notification servers added, our network design will look like this:</p> +<pre><code> User's iOS device Internet Servers +--------------------- | ------------------------ | ------------------------- + | | + | | (can be self-hosted now) ++--------------+ | | +----------------+ +| SimpleX Chat | -------------- TLS --------------- | SimpleX | +| client |------&gt; SimpleX Messaging Protocol (SMP) ---&gt; | Messaging | ++--------------+ ---------------------------------- | Server | + ^ | | | +----------------+ + | | | | | | + | | | | | S | T + | | | | | M | L + | | | | | P | S + | | | | | | + | | | | +----------------+ +----------------+ + | | -------------- TLS --------------- | SimpleX | | SimpleX | + | |-----------&gt; Notifications management ----&gt; | Notifications | ----&gt; | Push | + | ---------------------------------- | Subscriber | | Server | + | | | +----------------+ +----------------+ + | | | (can be self-hosted | + | | | in the future) | + | | | V + | -------------- TLS --------------- +-----------------+ + |----------------- Notification delivery &lt;----------------------------- | Apple PN server | + ---------------------------------- +-----------------+ + | | +</code></pre> +<p>Please let us know what you think about this design and about this privacy / usability trade-off:</p> +<ul> +<li>For you, is this an acceptable compromise, if you can choose to disable instant notifications?</li> +<li>Do you have any ideas about how this design could be improved upon?</li> +</ul> +<p>Thank you!</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html + + 2022-05-11T00:00:00Z + + SimpleX Chat v2.0 - sending images and files in mobile apps + <h1 id="simplex-chat-v20-sending-images-and-files-in-mobile-apps" tabindex="-1">SimpleX Chat v2.0 - sending images and files in mobile apps</h1> +<p><strong>Published:</strong> May 11, 2022</p> +<h2 id="new-in-version-20-sending-images-and-files-privately" tabindex="-1">New in version 2.0 - sending images and files privately</h2> +<p>To send image and files SimpleX Chat uses privacy-preserving system components, both in iOS and Android apps. We do not ask for permission to access multiple or selected files, as, for example, Signal and Telegram do - it compromises either privacy or convenience.</p> +<p>How does it work? The gallery and files are accessed from a system provided dialogue that runs in a separate process, and provides a temporary URI to access only one file selected by the user, only until the app is restarted.</p> +<p>To make file and images work for mobile apps we made a breaking change in SimpleX Chat core. The current version can exchange files with the previous version 1.6 of the terminal app, but not with the version before that.</p> +<p>In the mobile app, to send and receive files both devices must have version 2.0 installed - so please check it with your contacts. Receiving images works in the previous version, so even if your contacts did not yet upgrade the app, they should be able to receive the images.</p> +<h2 id="the-first-messaging-platform-without-user-identifiers" tabindex="-1">The first messaging platform without user identifiers</h2> +<p>To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the network – unlike any other messaging platform.</p> +<p>Many people asked: <em>if SimpleX has no user identifiers, how can it deliver messages?</em></p> +<p>To deliver mesages, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts. In the current version of the protocol each queue is used until the contact is deleted. Later this year we plan to add queue rotation to the client protocol, so that even conversations don't have long term identifiers visible to the network. This design prevents leaking any users metadata on the application level.</p> +<p>You define which server(s) to use <strong>to receive</strong> the messages, your contacts – the servers you use <strong>to send</strong> the messages to them. It means that every conversation is likely to use two different servers - one for each message direction.</p> +<p>Only client devices store user profiles, contacts, groups, and messages sent with <strong>2-layer end-to-end encryption</strong>.</p> +<p>Read more in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">SimpleX whitepaper</a>.</p> +<h2 id="how-to-connect-with-your-contacts-in-simplex-chat" tabindex="-1">How to connect with your contacts in SimpleX Chat</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link or a QR code via the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<img src="https://simplex.chat/images/conversation.png" alt="Make a private connection" width="594" height="360" /> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220524-simplex-chat-better-privacy.html + + 2022-05-24T00:00:00Z + + SimpleX Chat v2.1 - better conversation privacy + <h1 id="simplex-chat-v21-better-conversation-privacy" tabindex="-1">SimpleX Chat v2.1 - better conversation privacy</h1> +<p><strong>Published:</strong> May 24, 2022</p> +<h2 id="new-in-version-21-clearing-conversations-without-deleting-contacts" tabindex="-1">New in version 2.1 - clearing conversations without deleting contacts</h2> +<p>In this version you can irreversibly delete individual messages after they were deleted by a sender, and also completely clear the conversation.</p> +<p>The only way to do it before this version was by deleting the contact, now you can keep the connection when you clear the conversation.</p> +<p><img src="https://simplex.chat/blog/images/20220524-clear-chat1.png" width="240" /> <img src="https://simplex.chat/blog/images/20220524-clear-chat2.png" width="240" /></p> +<p>See <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a> for information on how SimpleX protects the security of the messages.</p> +<p>See <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 announcement</a> for more information about SimpleX platform and how it works.</p> +<p>Read about SimpleX design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">whitepaper</a>.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220604-simplex-chat-new-privacy-security-settings.html + + 2022-06-04T00:00:00Z + + SimpleX Chat v2.2 - the new privacy and security features + <h1 id="simplex-chat-v22-the-new-privacy-and-security-features" tabindex="-1">SimpleX Chat v2.2 - the new privacy and security features</h1> +<p><strong>Published:</strong> June 4, 2022</p> +<p>See <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 announcement</a> for more information about SimpleX platform and how it protects your privacy by avoiding user identities of any kind in its design - SimpleX, unlike any other messaging platform, has no identity keys or any numbers that identify its users.</p> +<h2 id="new-privacy-and-security-settings-in-version-22" tabindex="-1">New Privacy and Security settings in version 2.2</h2> +<img src="https://simplex.chat/blog/images/20220604-privacy-settings.png" width="480" /> +<h3 id="protect-your-chats" tabindex="-1">Protect your chats</h3> +<p>To protect your chats you can enable SimpleX Lock. Every time you open the chat after it was in the background for 30 second, you will need to pass biometric or pin code authentication to use the app (provided it is enabled for your device).</p> +<h3 id="save-data-and-avoid-sharing-you-are-online" tabindex="-1">Save data and avoid sharing you are online</h3> +<p>In case you want to save your mobile data or to avoid showing to your contacts that you are online, you can disable automatic image downloads. For many users it is more convenient to have images downloaded automatically, so it is enabled by default.</p> +<p>Low resolution image previews would still be shown, the senders have no way to see if you received them or not.</p> +<h3 id="avoid-visiting-websites-of-the-links-you-send" tabindex="-1">Avoid visiting websites of the links you send</h3> +<p>When you receive the links that include link previews, it is fully private - these previews are generated by the sender, and they do not expose your IP address in any way.</p> +<p>When you send the links, the app automatically downloads the link description and the picture from the website of the link. While it is convenient, it exposes your IP address to the website. To avoid it you can disable sending link previews.</p> +<h3 id="identify-any-lost-messages-in-the-chat" tabindex="-1">Identify any lost messages in the chat</h3> +<p>The app tracks the integrity of the messages you receive by cheching their sequential numbers and by validating that the hash of the previous message matches the hash included in the message – each conversation, effectively, is two blockchains that only you and your contact have access to.</p> +<p>In case some of the messages are lost, you would see it in the chat. It can happen because of one the following reasons:</p> +<ul> +<li>the messages have expired on the server after 30 days not being delivered.</li> +<li>the messages were removed when the server was restarted. We will add server redundancy later this year to avoid message loss in this case, for now if you see an indication that some messages were lost in the chat, you can check with your contact what it was.</li> +<li>some other app error. Please notify us via chat - we will investigate possible root causes.</li> +<li>the connection is compromised. This is very unlikely, but not an impossible scenario.</li> +</ul> +<h3 id="there-is-more" tabindex="-1">There is more</h3> +<p>You can discover additional features we are currently testing in Experimental Features - they will be announced later!</p> +<h2 id="more-information" tabindex="-1">More information</h2> +<p>See <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a> for information on how SimpleX protects the security of the messages.</p> +<p>Read about SimpleX design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">whitepaper</a>.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html + + 2022-07-11T00:00:00Z + + SimpleX announces SimpleX Chat v3 &mdash; with encrypted calls and iOS push notifications + <h1 id="simplex-announces-simplex-chat-v3-with-encrypted-calls-and-ios-push-notifications" tabindex="-1">SimpleX announces SimpleX Chat v3 - with encrypted calls and iOS push notifications</h1> +<p><strong>Published:</strong> Jul 11, 2022</p> +<h2 id="new-in-version-3" tabindex="-1">New in version 3</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#instant-notifications-for-ios">instant notifications for iOS</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#end-to-end-encrypted-audiovideo-calls">end-to-end encrypted audio/video calls</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#database-export-and-import">database export and import</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#protocol-privacy-and-performance-improvements">protocol privacy and performance improvements</a></li> +</ul> +<h3 id="instant-notifications-for-ios" tabindex="-1">Instant notifications for iOS</h3> +<p>I wrote previously about <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html#problem---users-expect-to-be-instantly-notified-when-messages-arrive">our design for iOS notifications</a> - this is now released. The app will offer to migrate the database when updated, and then you need to choose notifications mode – instant or periodic push notifications, or previously available periodic background refresh that does not use push notifications.</p> +<p>To deliver the notifications to iOS devices we use our notification server, as there is a single private key that Apple issues for the app. This server has minimal amount of information about your chat activity:</p> +<ul> +<li>it does not have the addresses of messaging queues used to send and receive messages - there is an additional address used for notification server to receive notifications from the messaging servers.</li> +<li>notifications themselves do not include message content or contacts, even in encrypted form - they only contain end-to-end encrypted metadata about the server and the queue that has available messages - so Apple servers cannot access the information about how many contacts you have or how frequently each of them messages you - they can only see the total number of notifications your device receives.</li> +<li>message senders do not connect to the notification server, so it cannot in any way correlate sent and received traffic across multiple devices.</li> +</ul> +<img src="https://simplex.chat/blog/images/20220711-notifications.png" width="480" /> +<p><strong>Please note</strong>: for periodic notifications to work the app has to be in the background - if the app is completely stopped (removed from the recent apps), it will not check the new messages and you will not receive notifications. Instant notifications work even when the app is completely stopped.</p> +<h3 id="end-to-end-encrypted-audiovideo-calls" tabindex="-1">End-to-end encrypted audio/video calls</h3> +<p>You can now call your contacts via WebRTC, connecting via SimpleX Chat relay servers or peer-to-peer, and in the near future you will be able to configure your own STUN/TURN servers used to establish the connection. The calls are end-to-end encrypted - the key is negotiated via the connection you already have with your contact in the chat, that is also used as a signalling layer for WebRTC - in most cases only three messages in total have to be sent by your and your contact's clients for the call to start, including the initial call invitation.</p> +<img src="https://simplex.chat/blog/images/20220711-call-in-progress.png" width="480" /> +<p>The calls are still quite limited, especially on iOS, - for example, you cannot continue the call while the app is in the background.</p> +<h3 id="database-export-and-import" tabindex="-1">Database export and import</h3> +<p>Quite a few users asked - <em>how can I move my chat profile to a new device</em>? SimpleX Chat v3 has a solution for that - you can now export chat database from one device and import it into another - even to another platform, e.g. you can move chat database from Android phone to iOS or to the terminal (console) client.</p> +<img src="https://simplex.chat/blog/images/20220711-database-chat-stopped.png" width="480" /> +<p>Some important limitations:</p> +<ul> +<li>you cannot run the same chat profile from two devices, neither at the same time nor in turns. You should only use the latest database version - every time you want to move it to another device you need to export a new chat archive from the device that was the latest to use it, and import it to the device where you want to use it next.</li> +<li>we plan to add internal database encryption soon, but currently it is stored on the device without encryption, and the exported archive is also not encrypted. You should store it securely, and encrypt it if you store it in the cloud or send via email.</li> +</ul> +<p>This feature can be useful in some other scenarios:</p> +<ul> +<li>managing multiple chat profiles - it's not very convenient, and a better support of multiple profiles is coming soon.</li> +<li>share access to the same profile with other people, as long as it is not used at the same time. For that use case it may be better to run SimpleX Chat terminal client in the cloud, as we do with our public account that you can connect to via the app.</li> +<li>preserve chat profile when you need to temporarily delete the app from your device.</li> +</ul> +<h3 id="protocol-privacy-and-performance-improvements" tabindex="-1">Protocol privacy and performance improvements</h3> +<p>Adding push notifications for iOS required SimpleX Messaging Protocol changes. We managed not just to keep the same level of meta-data privacy from passive observers, but to improve it - now all message meta-data that is passed from the server to the recipient is included into the same encrypted envelope as the message itself - as before, there is no identifiers or ciphertext in common inside TLS traffic between received and sent traffic of the server, and now there is no message timestamp inside TLS as well.</p> +<p>We also improved the protocol flow for establishing bidirectional connection between two users - it is substantially faster now, consuming much less network traffic and battery. It improves the time it takes to connect to your contacts and to start delivering images and files.</p> +<p>All these changes did not affect backward compatibility - if your contact has the previous version of the client, or you are connecting to a previous version of the server, the previous version of the protocol will be used - SimpleX has independent version negotiation in 4 protocol layers <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html#stable-protocol-implementation">since v1</a>, allowing us to evolve the protocols without any disruption to the users.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h3 id="the-first-and-we-believe-the-only-messaging-platform-without-user-identifiers-of-any-kind-100percent-private-by-design" tabindex="-1">The first (and we believe the only) messaging platform without user identifiers of any kind - 100% private by design!</h3> +<p>To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the servers and the network – unlike any other messaging platform. Not only SimpleX doesn't use phone numbers or emails, as Signal and many other platforms, it also does not have any persistent identifiers to identify users - unlike many other messengers considered private - Session, Cwtch, Ricochet, Briar, Jami, etc., - all these platforms have global user identifiers, uniquely identifying their users and creating the risks of de-anonymising the users.</p> +<h3 id="why-having-users-identifiers-is-bad-for-the-users" tabindex="-1">Why having users' identifiers is bad for the users?</h3> +<p>When each user has a unique identifier on the platform, even if this is just a random number, e.g. as a Session ID, it creates risks that whoever gains access to the platform data can observe how the users are connected and how many messages are transmitted between them, and then correlate this information with the existing public social networks, determining the real identities of some users. Even with the most private messengers built on top of Tor network, having a persistent identity means that if you talk to two different users via the same profile they can prove that they communicate with the same person, as they would use the same address to send messages.</p> +<p>SimpleX platform avoids these risks by not having any user identity in its design - so even if you talk to two different people from the same chat profile, they would not be able to prove they are talking to the same person - only that user profiles look the same. And we are planning to add a feature allowing to have a different display name for each contact you connect to - quite a few users asked for it.</p> +<h3 id="how-does-it-work" tabindex="-1">How does it work</h3> +<p>Many people asked: <em>if SimpleX has no user identifiers, how can it deliver messages?</em></p> +<p>I wrote about it in <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 release announcement</a> and you can get more information about SimpleX platform objectives and technical design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">the whitepaper</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to <a href="https://github.com/sponsors/simplex-chat">donate via GitHub</a>, which is commission-free for us, or <a href="https://opencollective.com/simplex-chat">via OpenCollective</a>, that also accepts donations in crypto-currencies, but charges a commission.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html + + 2022-07-23T00:00:00Z + + SimpleX Chat v3.1-beta is released &mdash; improved battery/traffic usage + <h1 id="simplex-chat-v31-beta-is-released-improved-batterytraffic-usage" tabindex="-1">SimpleX Chat v3.1-beta is released - improved battery/traffic usage</h1> +<p><strong>Published:</strong> Jul 23, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li>terminal app: <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#terminall-app-access-to-messaging-servers-via-socks5-proxy--tor">access to messaging servers via SOCKS5 proxy</a> (e.g., Tor).</li> +<li>mobile apps: <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#mobile-apps-join-and-leave-chat-groups">join and leave chat groups</a>.</li> +<li><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#optimized-battery-and-traffic-usage---up-to-90x-reduction">optimized battery and traffic usage - up to 90x reduction!</a>.</li> +<li><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#docker-configuration-for-self-hosted-smp-servers">two docker configurations for self-hosted SMP servers</a>.</li> +</ul> +<h3 id="terminall-app-access-to-messaging-servers-via-socks5-proxy-tor" tabindex="-1">Terminall app: access to messaging servers via SOCKS5 proxy / Tor</h3> +<img src="https://simplex.chat/blog/images/20220723-tor.jpg" width="480" /> +<p>While SMP protocol is focussed on protecting application-level meta-data by using pairwise connection identifiers instead of user identifiers (that are used by all other messaging platforms), there are scenarios when it is important for the users to protect their IP addresses from the servers - quite a few users have been somewhat disappointed that we didn't add it earlier.</p> +<p>This release of terminal app supports accessing the servers via Tor, but the servers themselves are still available on their usual addresses. We are planning to add .onion addresses (v3 hidden service) to all messaging servers we provide, and the users who self-host the servers will also be able to have dual servers addresses - so that one party in the conversation can access the servers via .onion address without necessarily requiring that the other party uses Tor as well.</p> +<p>To access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with <code>-x</code> option. See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md#access-messaging-servers-via-tor-beta">terminal app docs</a> for more information.</p> +<p>As this is a beta release, to install it you need to use this command:</p> +<pre><code class="language-sh">curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | sh -s -- v3.1.0-beta.0 +</code></pre> +<h3 id="mobile-apps-join-and-leave-chat-groups" tabindex="-1">Mobile apps: join and leave chat groups</h3> +<p><img src="https://simplex.chat/blog/images/20220723-group-invite.png" width="330" /> <img src="https://simplex.chat/blog/images/20220723-group-accept.png" width="330" /> <img src="https://simplex.chat/blog/images/20220723-group-leave.png" width="330" /></p> +<p>Groups have been supported by SimpleX Chat core for a very long time, but there was no user interface in the mobile apps to use them - users had to use chat console to create groups, add members, and accept invitations.</p> +<p>This release allows accepting the invitations to join groups via mobile apps UI, making it much easier to create groups - only one user (a group owner) needs to use chat console, while all other groups members just need to tap a button in the UI to join or leave the group. Full group UI is coming in v3.1 in 1-2 weeks, but you can already start using groups today by installing beta-versions of mobile apps via <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight</a>, <a href="https://play.google.com/apps/testing/chat.simplex.app">Google PlayStore Beta</a> and <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK download</a>.</p> +<p>To manage groups via terminal app or via chat console in the mobile apps you have to use these commands:</p> +<ul> +<li>to create group: <code>/g &lt;group_name&gt; [&lt;description&gt;]</code></li> +<li>to add member (admin by default): <code>/a &lt;group_name&gt; &lt;contact_name&gt; [owner/admin/member]</code></li> +<li>to remove member from the group: <code>/rm &lt;group_name&gt; &lt;contact_name&gt;</code></li> +</ul> +<p>Accepting group invitations, leaving and deleting groups no longer requires using console commands.</p> +<h3 id="optimized-battery-and-traffic-usage-up-to-90x-reduction" tabindex="-1">Optimized battery and traffic usage - up to 90x reduction</h3> +<p>To reduce battery and traffic usage this release updated SMP protocol to allow batching multiple server commands (up to 90!) into one traffic block – provided both the server and the client are upgraded. It means that if you have 90 contacts (or group members) on one server, to subscribe to all messaging queues you now need to send only one 16kb block instead of ~1.5Mb of traffic (90 blocks). It also hides how many contacts you have from any attackers who observe your network.</p> +<p>You might notice that sending commands to multiple queues in one block would allow the server to correlate that all these queues belong to the same user, even though the current server implementation we use does not do it. But even without batching, as the commands are sent via the same TCP connection, this correlation was already possible, so compared with the previous version it has no downsides.</p> +<p>To mitigate the risk of servers correlating your messaging queues we will soon add an option to access each queue via a separate TCP connection, which will have to be used together with access via Tor (as otherwise the servers would still see the same IP address). While it will increase battery and traffic consumption, it will also provide the highest level of privacy.</p> +<h3 id="docker-configuration-for-self-hosted-smp-servers" tabindex="-1">Docker configuration for self-hosted SMP servers</h3> +<p>When we released SimpleX Chat v3 two weeks ago many users wanted to host messaging servers in docker containers. So, we are now offering <a href="https://github.com/simplex-chat/simplexmq/tree/stable/scripts/docker">two versions of docker configurations</a>:</p> +<ul> +<li>fast and convenient - it downloads SMP server binary from GitHub.</li> +<li>more secure - it builds SMP server from the source code.</li> +</ul> +<p>Let us know how it works for you!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h3 id="the-first-and-the-only-messaging-platform-without-user-identifiers-of-any-kind-100percent-private-by-design" tabindex="-1">The first (and the only?) messaging platform without user identifiers of any kind - 100% private by design!</h3> +<p>To protect identities of users and their connections, instead of user identifiers visible to the servers and/or the network (that are used by all other messaging platforms), SimpleX Chat uses <a href="https://csrc.nist.gov/glossary/term/Pairwise_Pseudonymous_Identifier">pairwise identifiers</a> of connections between the users – there are two queues in each connection, each queue having 2 different identifiers to send and to receive the messages. It increases the number of used identifiers to the square of the number of users, making it more difficult (or impossible) to determine who is talking to whom. I <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">wrote previously</a> why it is bad for the users' privacy to have any identifiers, even random numbers, associated with their profiles.</p> +<h3 id="if-simplex-has-no-user-identifiers-how-can-it-deliver-messages" tabindex="-1">If SimpleX has no user identifiers, how can it deliver messages?</h3> +<p>I wrote about it in <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 release announcement</a> and you can get more information about SimpleX platform objectives and technical design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">the whitepaper</a>.</p> +<h3 id="privacy-technical-details-and-limitations" tabindex="-1">Privacy: technical details and limitations</h3> +<p>SimpleX design follows &quot;defence in depth&quot; security principles having multiple overlapping defensive mechanisms to protect users privacy and security:</p> +<ul> +<li>TLS transport with server identity validation and channel binding, limited to the most secure cryptographic algorithms.</li> +<li>Three levels of encryption that both protect message content and meta-data, preventinc trafic correlation even if TLS is compromised: +<ul> +<li>end-to-end encryption in each messaging queue.</li> +<li>end-to-end encryption of the conversation using double-ratchet algorithms, that provides OTR messaging with forward secrecy and break-in recovery.</li> +<li>additional encryption layer between the server and message recipient, to prevent traffic correlation by ciphertext or any identifiers.</li> +</ul> +</li> +<li>Four levels of message padding to prevent any attack based on the content size - the TLS transport block is padded to a fixed 16kb size, and each of 3 encrypted envelopes is padded to a constant size before encryption as well.</li> +</ul> +<p>What we plan to add soon to further improve privacy and security:</p> +<ul> +<li>message queue rotation, so that pairwise identifiers become temporary, and your conversations move from server to server automatically.</li> +<li>access to the messaging servers via Tor v3 hidden services.</li> +<li>message mixing - adding latencies to message delivery, to protect against traffic correlation by message time.</li> +<li>using Tor v3 hidden service addresses for messaging servers.</li> +<li>passphrase-based local database encryption.</li> +</ul> +<p>SimpleX Chat <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#privacy-technical-details-and-limitations">README page</a> has more details about it.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to <a href="https://github.com/sponsors/simplex-chat">donate via GitHub</a>, which is commission-free for us, or <a href="https://opencollective.com/simplex-chat">via OpenCollective</a>, that also accepts donations in crypto-currencies, but charges a commission.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html + + 2022-08-08T00:00:00Z + + SimpleX Chat v3.1 is released &mdash; with secret groups and server access via Tor + <h1 id="simplex-chat-v31-is-released-with-secret-groups-and-server-access-via-tor" tabindex="-1">SimpleX Chat v3.1 is released - with secret groups and server access via Tor</h1> +<p><strong>Published:</strong> Aug 8, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#secret-chat-groups">secret chat groups</a>!</li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#access-messaging-servers-via-tor">access to messaging servers via Tor</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#advanced-network-settings">advanced network settings</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#published-chat-protocol">published chat protocol</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#new-app-icons">new app icons</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#other-changes-since-v3">other changes since v3</a>: +<ul> +<li>optimized battery and traffic usage - up to 90x reduction!</li> +<li>two docker configurations for self-hosted SMP servers</li> +</ul> +</li> +</ul> +<h3 id="secret-chat-groups" tabindex="-1">Secret chat groups</h3> +<p><img src="https://simplex.chat/blog/images/20220808-group1.png" width="330" /> <img src="https://simplex.chat/blog/images/20220808-group2.png" width="330" /> <img src="https://simplex.chat/blog/images/20220808-group3.png" width="330" /></p> +<p>It's been <a href="https://simplex.chat/blog/20210914-simplex-chat-v0.4-released.html">nearly a year</a> since the users of SimpleX Chat terminal app started experimenting with the groups, and now it is available to mobile app users as well. Many bugs were fixed, the stability was improved, but there are both the features we need to add and the bugs we need to fix to make groups more useful - we really look forward to your feedback. You can send any suggestions via the app by choosing <code>Chat with the developers</code> via app Settings (or using <code>/simplex</code> command in the terminal app) – this would connect you to SimpleX team via its <a href="https://simplex.chat/contact#/?v=1&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D">fixed chat address</a>.</p> +<p>SimpleX network is decentralized, so how do groups work? Unlike Matrix or Signal that host the group profile and the list of group members on their servers, SimpleX servers have no information about the group's existence - only its members do. SimpleX network does not assign any globally unique identifiers to the group, there is only a local database identifier and the list of members stored on members' devices. A user has an independent connection to each member in a group. When a user sends a message to the group, the app sends this message independently to each member. You can read more about how groups work in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/protocol/simplex-chat.md#sub-protocol-for-chat-groups">SimpleX Chat Protocol</a>.</p> +<p>But how can it scale, you might ask? It simply won't, and the current design for the groups is only suitable for relatively small groups of people who know each other well, definitely not larger than few hundred members – this design prioritized privacy and security of the group over its size or performance. For example, to send a message to the group of 100 members a user would need to send a total of ~1.6mb of data (as each message uses a fixed size block of 16kb). And if you were to send a 1mb file then it would also require sending it 100 times (provided each member accepts it).</p> +<p>What if you need to send many large files to group members? We will be developing a file hosting server where the users will be able to upload the file (or image) once, and only send the file link and credentials to all group members, without the need to send the actual file. A small hosting quota will be available to all users for free, paid for by donations, and for larger files or to increase the total quota the users would either have to pay a small hosting cost or to self-host this server – it will be available as an open-source code.</p> +<p>What if you need to have a large group - e.g. 100,000 members or more? We will be introducing SimpleX channels later this year, that can be both public and private. These channels would require a server to host them, either provided by SimpleX Chat or self-hosted - same as for a website. If this is a public channel it would be optionally accessible via the web browser as well, and it will be possible to embed it into any webpage.</p> +<p>Other group improvements we will add soon:</p> +<ul> +<li>manage notifications in each group independently.</li> +<li>search for messages - it is useful for direct conversations too, but more important for groups.</li> +</ul> +<h3 id="access-messaging-servers-via-tor" tabindex="-1">Access messaging servers via Tor</h3> +<p><img src="https://simplex.chat/blog/images/20220808-tor1.png" width="330" />   <img src="https://simplex.chat/blog/images/20220808-tor2.png" width="330" /></p> +<p>SimpleX protocols are focussed on protecting application-level meta-data – they don't have any user identifiers used by all other messaging platforms, instead relying on pairwise connection identifiers.</p> +<p>But there are scenarios when users need to protect their IP addresses from the servers and any network observers – this is best done by using Tor to access any network services.</p> +<p>This release allows to access SimpleX messaging servers via Tor on all platforms:</p> +<ul> +<li>terminal app beta supported it for a couple weeks now: to access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with <code>-x</code> option. See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md#access-messaging-servers-via-tor-beta">terminal app docs</a> for more information.</li> +<li>Android app supports access via Tor using Orbot SOCKS proxy. Once you install and start Orbot, you need to enable <code>Network &amp; Servers / Use SOCKS proxy</code> setting in the app to access SimpleX servers via Tor.</li> +<li>iOS app can also be used with Orbot iOS app (that is installed as a system-wide VPN provider). The only setting you might need to change is to increase network timeouts in the app - to do that you have to enable <code>Developer tools</code>, and then chose <code>Network &amp; Servers / Advanced network settings / Set timeouts for proxy</code>.</li> +</ul> +<p>Currently all servers are accessed via their public Internet addresses, and while users can self-host messaging servers on .onion addresses (as v3 hidden services), it would require both connected contacts to use Tor. We are planning to add support for dual server addresses very soon, to allow the same server to be accessed both via its public Internet address and via .onion address, so that users can access servers without exiting Tor (via .onion address), but their contacts can access the same servers without using Tor.</p> +<h3 id="advanced-network-settings" tabindex="-1">Advanced network settings</h3> +<p>To reduce traffic on slow networks we added network access settings. To use these settings, you need to first enable <code>Developer tools</code> and then choose <code>Network &amp; Servers / Advanced network settings</code>:</p> +<ul> +<li>if your connections to the servers are unstable, and you frequently see the spinners in the list of chats, please increase the connection and protocol timeouts - it should reduce the traffic, but it may also make the app a bit slower when your Internet connection is slow.</li> +<li>if your connection to the servers appears stable, but the traffic usage is high, please try disabling TCP keep-alive setting or increasing keep-alive idle period (<code>TCP_KEEP_IDLE</code>) and interval (<code>TCP_KEEP_INTVL</code>).</li> +</ul> +<p>Once we investigated how these settings affect traffic and user experience we will simplify them - huge thanks to everyone testing them and reporting any traffic issues.</p> +<h3 id="new-app-icons" tabindex="-1">New app icons</h3> +<img src="https://simplex.chat/blog/images/20220808-icons.png" width="330" /> +<p>Many users asked to allow customizing the app, this is just a start - you can now choose either light or dark icon option via <code>Appearance</code> settings.</p> +<p>More options to customize the app are coming - please let us know what are the most important.</p> +<h3 id="published-chat-protocol" tabindex="-1">Published chat protocol</h3> +<p>The <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/">low level SimpleX protocols</a> were published long time ago, and updated to reflect the evolution of the protocols, the high level chat protocol was not published before. The reason for that was to allow us to iterate it quickly, without committing to any of the decisions.</p> +<p>This is the <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/protocol/simplex-chat.md">first draft of SimpleX Chat Protocol</a> - let us know any questions or suggestions.</p> +<h3 id="other-changes-since-v3" tabindex="-1">Other changes since v3</h3> +<p>Since v3 release we also optimized battery and traffic usage - with up to 90x traffic reduction in some cases – and published two docker configurations for self-hosted SMP servers. Read more about it in the previous <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html">beta version announcement</a>.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html + + 2022-09-01T00:00:00Z + + SimpleX Chat v3.2 is released &mdash; meet Incognito mode, unique to Simplex Chat + <h1 id="simplex-chat-v32-is-released-meet-incognito-mode-unique-to-simplex-chat" tabindex="-1">SimpleX Chat v3.2 is released - meet Incognito mode, unique to Simplex Chat</h1> +<p><strong>Published:</strong> Sep 1, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">Incognito mode</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#assign-names-to-your-contacts">assign names to your contacts</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">use .onion server addresses with Tor</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#endless-scrolling-and-search-in-chats">endless scrolling and search in chats</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#choose-accent-color-and-dark-mode">choose accent color and dark mode</a></li> +<li>disable notifications per contact / group</li> +<li>on Android: +<ul> +<li>swipe to reply</li> +<li>reduced APK size for direct download and in F-Droid repo from 200 to 50Mb!</li> +</ul> +</li> +</ul> +<p><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#we-ask-you-to-help-us-pay-for-3rd-party-security-audit">Implementation audit is arranged for October</a>!</p> +<h3 id="incognito-mode" tabindex="-1">Incognito mode</h3> +<p><img src="https://simplex.chat/blog/images/20220901-incognito1.png" width="330" /> <img src="https://simplex.chat/blog/images/20220901-incognito2.png" width="330" /> <img src="https://simplex.chat/blog/images/20220901-incognito3.png" width="330" /></p> +<p><em>SimpleX is already private, so why do we need an incognito mode</em>, you may ask.</p> +<p>You indeed can choose a pseudonym as your main profile name, but there are several problems:</p> +<ul> +<li>many users want to have their real name as their main profile, so that their friends recognise them. SimpleX objective is to provide anonymity from the network operators, but not necessarily from your contacts.</li> +<li>even if you choose a pseudonym, it would be used for all your contacts. And if two of them meet, while they cannot prove they are talking to the same person, as they use different addresses in SimpleX network to send you the messages, they could <em>suspect it</em>.</li> +<li>any pseudonym you manually choose leaks some information about you, as it's not really random.</li> +</ul> +<p>You could also use multiple chat profiles - currently you can only switch between them via export/import, we will make it easier very soon! But there are problems with multiple profiles too:</p> +<ul> +<li>if you make many anonymous connections, each in its own user profile, you would end up having too many profiles - it is very inconvenient to manage.</li> +<li>sometimes, as your relationship with your contact evolves, you may want to share your main profile with them and have them among your friends - multiple profiles don't make it possible.</li> +</ul> +<p>So, the new Incognito mode allows having a new random name shared with each new contact, while having them all in the same user profile, and without the hassle of managing it manually. It's like a private mode in the browsers, where you can temporarily enable it when you connect to somebody you don't trust, and then disable it when connecting to the friend who knows you. It can be turned on via the app settings - see the pictures.</p> +<p>I don't know any other messenger with this feature, and I always wanted to have this mode, so we are really looking forward to your feedback about it!</p> +<h3 id="assign-names-to-your-contacts" tabindex="-1">Assign names to your contacts</h3> +<p>You can now change the name under which your contacts appear in the chats. This is particularly useful when somebody connected to you using a random name – you can change it to be related to the context of the connection.</p> +<h3 id="using-onion-server-addresses-with-tor" tabindex="-1">Using .onion server addresses with Tor</h3> +<p><img src="https://simplex.chat/blog/images/20220901-onion1.png" width="330" />   <img src="https://simplex.chat/blog/images/20220901-onion2.png" width="330" /></p> +<p>We have released support for using SOCKS proxy to access messaging servers via Tor, but previously the servers were still available via their public Internet addresses. It means that while your IP address was protected from the server, the whole Tor circuit could have been observed by some actors, and for some communication scenarios it is not desirable.</p> +<p>This release adds support for servers with multiple hostnames - all servers provided by SimpleX Chat now have dual addresses (one public and one .onion), and you can have your own servers available via two addresses as well - all you have to do is to install Tor client on your server and register its address with Tor. If you server has both public and .onion address, it is not really hidden, so you should enable HiddenServiceSingleHopMode to reduce the latency of connection - it protects anonymity of the people who connect to the server, but not of the server itself. The server address would include both its public and onion address, as you can see in the server addresses in the app (in the contacts pages) - you should use the same format for the addresses of your servers.</p> +<p>Both android and iOS app allow managing whether .onion addresses are used, and you can also enforce using .onion addresses - in this case the app will not connect to the server unless one of its hostname is .onion address. On Android, .onion addresses are used by default when SOCKS proxy is enabled.</p> +<h3 id="endless-scrolling-and-search-in-chats" tabindex="-1">Endless scrolling and search in chats</h3> +<p>Now you can access the full chat history via the app - it's embarrassing how long it took us to add it! And you can search the messages as well.</p> +<h3 id="choose-accent-color-and-dark-mode" tabindex="-1">Choose accent color and dark mode</h3> +<p>Many of you said that blue is the worst possible color, so you can now make the app buttons and links look like you want! My favourite colours are green and orange.</p> +<p>And you can choose dark or light mode independently of the system settings.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>Our great news is that we have already signed the agreement and paid for the security audit!</p> +<p>It is planned in October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.</p> +<p>This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.</p> +<p>Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.</p> +<p>Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html + + 2022-09-28T00:00:00Z + + SimpleX Chat v4.0 with encrypted database is released + <h1 id="simplex-chat-v4-with-encrypted-local-database-is-released" tabindex="-1">SimpleX Chat v4 with encrypted local database is released</h1> +<p><strong>Published:</strong> Sep 28, 2022</p> +<h2 id="whats-new-in-v4" tabindex="-1">What's new in v4</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#local-chat-database-encryption">encrypted local chat database</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#self-hosted-webrtc-ice-servers">support for self-hosted WebRTC ICE servers</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#improved-stability-of-creating-new-connections">improved stability of creating new connections: more reliable groups, files and contacts</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#deleting-files-and-media">deleting files and media</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#for-developers---typescript-sdk-for-integrating-with-simplex-chat">For developers - TypeScript SDK for integrating with SimpleX Chat</a> (e.g., chat bots or chat assistants).</li> +<li>animated images in Android app.</li> +<li>disable messages per contact / group in terminal app (it is already supported in mobile apps).</li> +</ul> +<p>Also, this version adds German language to mobile apps UI - huge thanks to <a href="https://github.com/mlanp">Michael</a> who contributed them!</p> +<p>Other new features since v3:</p> +<ul> +<li>secret chat groups (see details in <a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#secret-chat-groups">v3.1 announcement</a> - they are fully decentralized, only their members know these groups exist.</li> +<li>accessing messaging servers via Tor with support for .onion server addresses (see details in <a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#access-messaging-servers-via-tor">v3.1</a> and <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">v3.2</a> announcements) - to protect users anonymity on the TCP transport level.</li> +<li>Incognito mode - sharing a random profile name with each new contact, to completely eliminate any shared data between them (see details in <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">v3.2</a> announcement).</li> +<li>endless scrolling and search in chats.</li> +<li>reduced Android APK size for direct download and in F-Droid repo from 200 to 50Mb!</li> +</ul> +<p><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#we-ask-you-to-help-us-pay-for-3rd-party-security-audit">Implementation audit is arranged for October</a>!</p> +<h3 id="local-chat-database-encryption" tabindex="-1">Local chat database encryption</h3> +<img src="https://simplex.chat/blog/images/20220928-passphrase.png" width="330" /> +<p>SimpleX Chat focus has always been on protecting messages in delivery, not when they are stored on the device. This release changes it - now all messages that you receive and send are stored on the device encrypted with <a href="https://github.com/sqlcipher/sqlcipher">SQLCipher</a>.</p> +<p><strong>Please note</strong>: If you are already using SimpleX Chat, your database will remain unencrypted until you enter the passphrase via the app settings. You have to remember the passphrase you choose, as there is no way to recover it if it is lost.</p> +<p>By default your passphrase will be stored securely on the device (in KeyChain on iOS or encrypted with the key stored in TPM, if available, on Android) - it is only accessible to the app, and only on one device. Storing passphrase is required for instant notifications to work. In this case, if you lose the passphrase, the app will continue to work, but you will not be able to change the passphrase and to migrate your user profile to another device.</p> +<p>For additional security of your messages you also have the option to remove the passphrase from the device. In this case you will need to enter the passphrase every time you start the app. The notifications will continue to work only while the app is in the background. For iOS it means that periodic and local notifications will work, but instant notifications will only show that there is a message available, but not message content or who it is from - you will need to open the app and enter the passphrase to see the messages. In this case, if you lose the passphrase, you will not be able to open the app or decrypt the database - so make sure you store it safely.</p> +<h3 id="self-hosted-webrtc-ice-servers" tabindex="-1">Self-hosted WebRTC ICE servers</h3> +<img src="https://simplex.chat/blog/images/20220928-ice-servers.png" width="330" /> +<p>You could make audio and video calls via SimpleX Chat WebRTC servers since <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#end-to-end-encrypted-audiovideo-calls">v3</a> - that meant that our servers could observe your IP addresses. This release adds configuration to use your own STUN/TURN servers, helping you protect your privacy.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/WEBRTC.md">this guide</a> to learn how to deploy your own <code>coturn</code> server and to configure the mobile apps to use it.</p> +<h3 id="improved-stability-of-creating-new-connections" tabindex="-1">Improved stability of creating new connections</h3> +<p>Secret groups made SimpleX Chat much more useful, but because SimpleX groups are completely decentralized and for them to work each member should connect to all other members, sometimes these connections fail and the group becomes fragmented - some members do not receive all messages. That was more common for larger groups, as the number of required member connections is O(n^2) of the group size.</p> +<p>The reason for that problem was that some network operations required for group connections were not retried. This release improves stability of all network operations - receiving messages, making new contact connections, receiving files and connecting to members in the groups you join.</p> +<h3 id="deleting-files-and-media" tabindex="-1">Deleting files and media</h3> +<img src="https://simplex.chat/blog/images/20220928-files-media.png" width="330" /> +<p>While the database with messages and all contacts is now encrypted, the files you receive and send are not (we are planning to improve it later). To protect the security of the files we have added an option to delete all files from the app storage - just make sure not to do it before the files you send are delivered to the recipients, or they won't receive them.</p> +<h3 id="for-developers-typescript-sdk-for-integrating-with-simplex-chat" tabindex="-1">For developers - TypeScript SDK for integrating with SimpleX Chat</h3> +<p>It's been quite some time since it's been possible to create a chat-bot using SimpleX Chat as a library - but you had to either write Haskell code or use foreign function interface in any other language.</p> +<p>With v4 we are announcing <a href="https://github.com/simplex-chat/simplex-chat/tree/stable/packages/simplex-chat-client/typescript">TypeScript SimpleX Chat Client SDK</a> that you can use to create any integrations with SimpleX Chat CLI.</p> +<p>You can run SimpleX Chat CLI as a local WebSockets server on any port, we use 5225 here:</p> +<pre><code class="language-bash">simplex-chat -p 5225 +</code></pre> +<p>Then you can create a JavaScript or TypeScript application that would connect to it and control it via a simple WebSocket API. TypeScript SDK defines all necessary types and convenience functions to use in your applications. See this <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/packages/simplex-chat-client/typescript/examples/squaring-bot.js">sample bot</a> and README page.</p> +<p>SimpleX Chat API allows you to:</p> +<ul> +<li>create and change user profile (although in most cases you would do it manually, via SimpleX Chat terminal app).</li> +<li>create and accept invitations or connect with the contacts.</li> +<li>create and manage long-term user address, accepting connection requests from the code or automatically.</li> +<li>create, join and manage groups - this can be used, for example, to connect two different people who connected to chat-bot.</li> +<li>send and receive files.</li> +</ul> +<p>Some possible applications you can create:</p> +<ul> +<li>peer-to-peer trading bots, that would connect people with matching buy/sell orders,</li> +<li>bots to access information,</li> +<li>language translation bots,</li> +<li>etc.</li> +</ul> +<p>As SimpleX Chat protocols provide strong encryption and authorization of the connections, you could use it not only in various communication scenarios, but also to remotely control any equipment where high level of security is required, for example:</p> +<ul> +<li>smart home automation,</li> +<li>network services,</li> +<li>remote deletion of application data,</li> +<li>etc.</li> +</ul> +<p>We are really looking forward to seeing what applications you create - please submit your ideas and implementations, we will publish the links on a separate page on the website and GitHub repository.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>We have already signed the agreement and paid for the security audit!</p> +<p>It is planned for October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.</p> +<p>This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.</p> +<p>Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.</p> +<p>Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html + + 2022-11-08T00:00:00Z + + Security assessment by Trail of Bits, the new website and v4.2 released + <h1 id="security-assessment-by-trail-of-bits-the-new-website-and-v42-released" tabindex="-1">Security assessment by Trail of Bits, the new website and v4.2 released</h1> +<p><strong>Published:</strong> Nov 8, 2022</p> +<h2 id="security-assessment-by-trail-of-bits" tabindex="-1">Security assessment by Trail of Bits</h2> +<img src="https://simplex.chat/blog/images/20221108-trail-of-bits.jpg" width="240" /> +<p>When we first launched the app in March the response on Reddit was: <em>&quot;Have you been audited or should we just ignore you?&quot;</em>.</p> +<p>We have a growing number of enthusiasts using SimpleX Chat who can accept the security risks of unaudited system, but the users who depend on their security were patiently waiting until some independent experts review our codebase.</p> +<p><a href="https://www.trailofbits.com/about">Trail of Bits</a>, a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects, had 2 engineers reviewing SimpleX Chat for one calendar week, specifically <a href="https://github.com/simplex-chat/simplexmq">simplexmq library</a> that is responsible for all cryptography and networking of SimpleX platform.</p> +<p>2 medium and 2 low severity issues were identified, all of which require a high difficulty attack to exploit – the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. 3 of these issues are already fixed in v4.2.</p> +<p>In the course of the audit, Trail of Bits assessed the maturity of the <a href="https://github.com/simplex-chat/simplexmq">simplexmq library</a> across eight categories and found five of them to be strong or satisfactory.</p> +<p>Explained below is our understanding of the issues, as well as fixes implemented by the SimpleX Chat team after project completion. The full security review is available via <a href="https://github.com/trailofbits/publications/blob/master/reviews/SimpleXChat.pdf">Trail of Bits publications</a>.</p> +<p>We are hugely thankful to Trail of Bits and their engineers for the work they did, helping us identify these issues and supporting the ongoing efforts to make SimpleX Chat more secure.</p> +<h3 id="medium-severity-issues" tabindex="-1">Medium severity issues</h3> +<h4 id="x3dh-key-exchange-for-double-ratchet-protocol" tabindex="-1">X3DH key exchange for double ratchet protocol</h4> +<p>We made a mistake implementing X3DH key exchange - the key derivation function was not applied to the result of concatenation of three DH operations. The attack to exploit this mistake has high difficulty, as it would require compromising one of private keys generated by the clients, and also it would only affect forward secrecy until break-in recovery happens (after both sides sent some messages).</p> +<p>Please note that SimpleX does not perform X3DH with long-term identity keys, as the SimpleX protocol does not rely on long-term keys to identify client devices. Therefore, the impact of compromising a key will be less severe, as it will affect only the secrets of the connection where the key was compromised.</p> +<p>This issue is fixed in version 4.2 in <a href="https://github.com/simplex-chat/simplexmq/pull/548/files">this PR</a>, and if both clients are updated the key exchange will not have this vulnerability. Also, previously created connections should be secure as long as both sides sent the messages, but if you believe that your private key(s) could have been compromised (for example, if you used SimpleX Chat since before we added database encryption), we recommend that you create the new connections with your contacts, at least with the security-critical ones. Simply rotating the connection queue (manual queue rotation is added in version 4.2) will not be sufficient, as this rotation does not re-initialize the ratchets - this is something we will be adding in the future.</p> +<h4 id="keys-are-stored-in-unpinned-memory-and-not-cleared-after-their-lifetime" tabindex="-1">Keys are stored in unpinned memory and not cleared after their lifetime</h4> +<p>The problem here is that the memory with cryptographic keys can be swapped to the storage and potentially accessed by an attacker who has root-level access to the device (or the level of access required to access swap file of the application). So, if you are running SimpleX Chat on desktop you could improve its security by running it in an isolated container.</p> +<p>In our opinion, on mobile operating systems it is less severe as each application already runs in its own container, and applications do not share access to their swap areas (e.g., on Android swap is a <a href="https://developer.android.com/topic/performance/memory-management">compressed area in RAM</a> not accessible to other applications).</p> +<p>To exploit this issue an attacker needs to have a privileged system access to the device. Also, we believe <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/1993/01/gen-gc-for-haskell.pdf">Haskell generational garbage collection</a> makes the lifetime of unused memory lower than in other languages.</p> +<p>We will be addressing this issue in the near future, possibly by using library <a href="https://hackage.haskell.org/package/secure-memory-0.0.0.2">secure-memory</a> created by Kirill Elagin, an engineer at Serokell, or some other similar approach.</p> +<h3 id="low-severity-issues" tabindex="-1">Low severity issues</h3> +<h4 id="the-string-padding-function-is-incorrect-for-long-messages-and-the-string-unpadding-function-throws-exception-for-short-messages" tabindex="-1">The string padding function is incorrect for long messages, and the string unpadding function throws exception for short messages</h4> +<p>Both these issues are fixed in 4.2 in <a href="https://github.com/simplex-chat/simplexmq/pull/547/files">this PR</a>, with the additional unit tests, and we also validated that even before the fix the strings that would cause such exception were never passed to this function – The SimpleX Chat team could not find the possibility of the attack that would succeed because of this issue.</p> +<h3 id="whats-next" tabindex="-1">What's next</h3> +<p>There are areas of SimpleX Chat that were out of scope of this review, specifically:</p> +<ul> +<li>the chat protocol implementation and mobile UIs, as they includes no cryptography of networking (with the exception of Android app storing encrypted database passphrase and key exchange/encryption for WebRTC calls).</li> +<li>push notifications server that is used by iOS clients.</li> +</ul> +<p>We will be arranging to review these areas separately.</p> +<h2 id="the-new-website" tabindex="-1">The new website</h2> +<p>Our <a href="https://old-website.simplex.chat/">previous website</a> was created 2 years ago to present SimpleX idea, there was no SimpleX Chat at the time - we only had a prototype implementation of SimpleX Messaging Protocol server then.</p> +<p>A lot of people told us that our website didn't explain well enough who SimpleX Chat is for, what problems it solves, and how it is different from the alternatives. So, while we love to be focused on the chat application, we decided to make the new one.</p> +<p>We hope that our <a href="https://simplex.chat/">new website</a> better answers these questions. If you think something should be added/removed/changed - please let us know. Thank you!</p> +<h2 id="simplex-chat-v42-released" tabindex="-1">SimpleX Chat v4.2 released!</h2> +<p>New in this release:</p> +<ul> +<li>fixed 3 issues from the security audit!</li> +<li>group links - group admins can create the links for new members to join</li> +<li>auto-accept contact requests + configure whether to accept incognito and welcome message</li> +<li>small things: change group member role, mark chat as unread, send stickers and GIFs from Android keyboards.</li> +</ul> +<p>Beta features (enable Developer tools to try them):</p> +<ul> +<li>manually switch contact or member to another address / server (it has to be supported by both clients to work)</li> +<li>receive files faster (enable it in Privacy &amp; Security settings)</li> +</ul> +<h3 id="group-links" tabindex="-1">Group links</h3> +<p><img src="https://simplex.chat/blog/images/20221108-group1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221108-group2.png" width="288" /></p> +<p>It's been requested by many users - to be able to join a group via link. Because SimpleX Chat groups are fully decentralised, and there is no server-side state, joining via these links requires the participation of the link creator who has to be online to accept the group joining request.</p> +<p>The way it works under the hood is similar to how contact addresses work:</p> +<ol> +<li>Group admin or owner creates a long term address that is technically the same as a user address, but it is associated with a specific group.</li> +<li>The user that joins the group can identify that this link belongs to some group by an additional piece of data in the link - <code>{&quot;type&quot;: &quot;group&quot;, &quot;groupLinkId&quot;: &quot;some random string&quot;}</code>. The ID in this link does not represent a group identity, every time any user creates a new link for the same group, this ID will be different. This ID is used by the joining client to identify the group and automatically accept the invitation when it is received.</li> +<li>When admin receives a connection request, they automatically accept it and send invitation link to join the group.</li> +<li>The joining user compares the ID in the invitation with the ID in the link, and if they match – automatically accepts the invitation.</li> +</ol> +<p>After that it works as when joining via the manual invitation - the joining user will be establishing the connection with all existing members to be able to send messages to the group.</p> +<p>The link can be created via the group page, as shown on the picture.</p> +<p>We have several groups you can join to ask any questions or just to test the app:</p> +<ul> +<li> +<p><a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FWHV0YU1sYlU7NqiEHkHDB6gxO1ofTync%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAWbebOqVYuBXaiqHcXYjEHCpYi6VzDlu6CVaijDTmsQU%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22mL-7Divb94GGmGmRBef5Dg%3D%3D%22%7D">#SimpleX-Group</a>: a general group with more than a 100 members where you can ask any questions.</p> +</li> +<li> +<p>Several groups by countries/languages: <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FmIorjTDPG24jdLKXwutS6o9hdQQRZwfQ%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA9N0BZaECrAw3we3S1Wq4QO7NERBuPt9447immrB50wo%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22S8aISlOgkTMytSox9gAM2Q%3D%3D%22%7D">#SimpleX-DE</a> (German), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FlTWmQplLEaoJyHnEL1-B3f2PtDsikcTs%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA-hMBlsQjNxK2vaVhqW_UyAVtuoYqgYTigK4B9dJ9CGc%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22G0UtRHIn0TmPoo08h_cbTA%3D%3D%22%7D">#SimpleX-US</a> (US/English), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F11r6XyjwVMj0WDIUMbmNDXO996M_EN_1%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAXDmc2Lrj9WQOjEcWa0DeQHF3HcYOp9b68s8M_BJ7gEk%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22EZCeSYpeIBkaQwCcpcF00w%3D%3D%22%7D">#SimpleX-France</a>, <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FZSYM278L5WoZiApx3925EAjSXcsAVNVu%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA7RJ2wfT8zdfOLyE5OtWLEAPowj-q6F2HB0ExbATw8Gk%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22fsVoklNGptt7n-droqJYUQ%3D%3D%22%7D">#SimpleX-RU</a> (Russian), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FmP0LbswSbfxoVkkxiWE2NYnBCgZ9Snvj%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAVwZuSsw4Mf52EaBNdNI3RebsLm0jg65ZIkcmH9E5uy8%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22M9xIULUNZx51Wsa5Kdb0Sg%3D%3D%22%7D">#SimpleX-NL</a> (Netherlands/Dutch), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FaZ_wjh6QAYHB-LjyGtp8bllkzoq880u-%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA-_Wulzc3j16i7t77XJ5wgwxeW8_Ea8GxetMo7K4MgjI%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22QWmXdrFzIeMd2OoEPMFkBQ%3D%3D%22%7D">#SimpleX-IT</a> (Italian).</p> +</li> +</ul> +<p>You can join these groups either by opening these links in the app or by opening them in desktop browser and scanning QR code.</p> +<p>Let me know if you'd like to add some other countries to the list. Join via the apps to share what's going on and ask any questions!</p> +<h3 id="auto-accept-contact-requests" tabindex="-1">Auto-accept contact requests</h3> +<p><img src="https://simplex.chat/blog/images/20221108-address1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221108-address2.png" width="288" /></p> +<p>When somebody connects to you via your long-term address you have to manually accept a connection request (it shows in blue color in the list of chats). The feature that we added in this release allows to configure the app to accept contact requests automatically, and also choose whether this contact should receive your main profile or a random incognito profile (independent of the current app setting), and add an optional auto-reply message.</p> +<p>This feature is useful if you publish your address on your webpage or social profile, and do not want to screen people who want to connect to you. You may want to send a standard welcome message, for example, if it is an online store, and you need to share any information with everybody who contacts you.</p> +<p>Our @simplex account that you connect to when you choose &quot;Connect to developers&quot; in the app used this feature for a long time, and now it is available to mobile app users.</p> +<h3 id="some-small-things" tabindex="-1">Some small things</h3> +<ol> +<li> +<p>Changing group member role is a very basic feature, but it was only added in this release.</p> +</li> +<li> +<p>You can now mark a conversation as unread, for example if you accidentally marked all messages as read and you want to review it later.</p> +</li> +<li> +<p>Send stickers and GIFs from Android keyboards, and, finally, the bug with backspace button is resolved as well.</p> +</li> +</ol> +<h3 id="change-your-delivery-address-beta" tabindex="-1">Change your delivery address (BETA)</h3> +<img src="https://simplex.chat/blog/images/20221108-switch-address.png" width="288" /> +<p>To manually switch any of your contacts (or a group member to a new server address) enable Developer tools and choose &quot;Change receiving address&quot; on the contact page. As long as they run a new version of the app and online, the switch should only take a few seconds.</p> +<p>That is a major improvement of metadata privacy of SimpleX protocols, because previously, while we didn't have user identifiers, the pairwise identifiers of messaging queues used to deliver messages were used for as long as the contact existed. Now these identifiers are temporary, and in a near future we will be adding automatic rotation of these delivery addresses.</p> +<p>It is also useful when you want to migrate message delivery to another server, for example, if you used SimpleX Chat default servers and now want to self-host your own. Or, maybe, you need to change the address of your server. Previously it would require creating new contacts and losing conversation histories, and now all you have to do is to change server configuration in the app, and when the change of the address is triggered (currently, only manually, and in the near future - automatically), your contacts will be migrated to a new server, without you doing anything - it only requires each party sending 2 messages to negotiate the reconnection, and it would also rotate the encryption keys used for the outer layer of E2E encryption.</p> +<h3 id="receive-images-and-small-files-faster-beta" tabindex="-1">Receive images and small files faster (BETA)</h3> +<img src="https://simplex.chat/blog/images/20221108-faster-images.png" width="288" /> +<p>From version 4.2 all files smaller than ~92kb (equal to 6 message blocks) will be sent in the same connection where you have the chat, and files smaller than ~231kb (the limit for image size) can also be optionally received via the same connection – the latter requires enabling &quot;Transfer images faster&quot; in Privacy &amp; security settings (it will be available after you enable Developer tools). There are two reasons why it is not on by default yet: 1) we wanted to ensure it is stable; 2) there is a small effect on metadata privacy of having a burst of traffic in the same connection where you are having the main conversation.</p> +<p>This functionality was created for the future voice messages, as they need to be sent without acceptance, so that the recipients can listen to them even when the sender is offline.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see the information on our <a href="https://simplex.chat/">new website</a> - it also answers all these questions.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in many crypto-currencies.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html + + 2022-12-06T00:00:00Z + + SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. + <h1 id="simplex-chat-reviews-and-v43-released-with-instant-voice-messages-irreversible-deletion-of-sent-messages-and-improved-server-configuration" tabindex="-1">SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration.</h1> +<p><strong>Published:</strong> Dec 6, 2022</p> +<h2 id="simplex-chat-reviews" tabindex="-1">SimpleX Chat reviews</h2> +<p>Since we published <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the security assessment of SimpleX Chat</a> completed by Trail of Bits in November, several sites published the reviews and included it in their recommendations:</p> +<ul> +<li>Privacy Guides added SimpleX Chat to <a href="https://www.privacyguides.org/real-time-communication/#simplex-chat">the recommended private and secure messengers</a>.</li> +<li>Mike Kuketz – a well-known security expert – published <a href="https://www.kuketz-blog.de/simplex-eindruecke-vom-messenger-ohne-identifier/">the review of SimpleX Chat</a> and added it to <a href="https://www.messenger-matrix.de/">the messenger matrix</a>.</li> +<li>Supernova published <a href="https://supernovas.space/detailed_reviews.html#simplex">the review</a> and increased <a href="https://supernovas.space/messengers.html">SimpleX Chat recommendation ratings</a>.</li> +</ul> +<h2 id="whats-new-in-v43" tabindex="-1">What's new in v4.3</h2> +<ul> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#instant-voice-messages">instant voice messages!</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">irreversible deletion of sent messages for all recipients</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#smp-servers-configuration-and-password">improved SMP server configuration and support for server passwords</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#privacy-and-security-improvements">privacy and security improvements</a>: +<ul> +<li>protect app screen in recent apps and prevent screenshots</li> +<li>improved privacy and security of SimpleX invitation links in the app</li> +<li>optional Android app data backup</li> +<li>optionally allow direct messages between group members</li> +</ul> +</li> +</ul> +<h3 id="instant-voice-messages" tabindex="-1">Instant voice messages</h3> +<img src="https://simplex.chat/blog/images/20221206-voice.png" width="288" /> +<p>Voice messages, unlike normal files, are sent instantly, in the existing connection with your contact and without acceptance from the recipient. For this reason we limited the size of voice messages to ~92.5kb (an equivalent of 6 messages), that limits the duration to 30 seconds on iOS and to ~42 seconds on Android (the size is different because of different encoders), with an average sound quality. The voice messages are sent in MP4AAC format that is natively supported both on iOS and on Android, and you can play voice message files outside of SimpleX Chat app.</p> +<p>Users who do not want to receive voice messages can disable them, either globally, for all contacts, or for each contact independently. Please note that the global preference change will only affect the contacts where you shared your main profile (not incognito contacts) and where you didn't change the preference for the particular contact. Groups have a separate policy that allows disabling voice messages for all members (they are allowed by default). The owner can set this policy when creating a group or later, via Group preferences page.</p> +<h3 id="irreversible-message-deletion" tabindex="-1">Irreversible message deletion</h3> +<p><img src="https://simplex.chat/blog/images/20221206-deleted1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-deleted2.png" width="288" /></p> +<p>When you receive email, you have full confidence that the sender cannot delete their email from your mailbox after you received it. And it seems correct – in the end, this is your device, and nobody should be able to delete any data from it.</p> +<p>Most existing messengers made an opposite decision – the senders can irreversibly delete their messages from the recipients' devices after they were delivered, whether recipients agree to that or not. And it seems correct too - this is your message, you should be able to delete it, at least for a limited time; that the message is on the recipient device doesn't change your ownership of this message.</p> +<p>While both these statements appear correct, at least to some people, they simply cannot both be correct at the same time, as they contradict each other - either one or both of them must be wrong. This appears to be a very polarising subject, and <a href="https://mastodon.social/@simplex/109461879089268041">the polls</a> <a href="https://www.reddit.com/r/SimpleXChat/comments/zdam11/poll_irreversible_message_deletion_by_sender_what/">I made</a> <a href="https://twitter.com/epoberezkin/status/1599797374389727233">yesterday</a> <a href="https://www.linkedin.com/feed/update/urn:li:activity:7005564342502842368/">show it</a> - the votes are split evenly.</p> +<p>You may want to be able to delete your messages even after they are received to protect your privacy and security, and you want the communication product you use to enforce it. But you may also have many reason to disagree to the deletion of messages on your device for several different reasons:</p> +<ul> +<li>it may be a business context, and either your organisation policy or a compliance requirement is that every message you receive must be preserved for some time.</li> +<li>these messages may contain threat or abuse and you want to keep them as a proof.</li> +<li>you may have paid for the the message (e.g., it can be a consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation.</li> +</ul> +<p>Instead of taking any side in this choice, we decided to allow to change this behaviour either globally or separately for each contact or group. That makes SimpleX Chat unique, being suitable both for the communication contexts where email is traditionally used and in informal or privacy sensitive contexts, that would allow the senders to delete messages irreversibly, provided that the recipients agree to that.</p> +<p>In any case, the senders can never be 100% certain that the message is deleted from the recipient's device - recipient can be running a modified client that does not honour the conversation setting, and there is no way to ascertain which code your contact runs on their device.</p> +<p>If irreversible message deletion is not allowed in the conversation, the senders can still mark their messages as deleted, and it would show &quot;mark deleted&quot; placeholder in the conversation. The recipients can then both reveal the content of the original message and fully delete it on their devices.</p> +<h3 id="smp-servers-configuration-and-password" tabindex="-1">SMP servers configuration and password</h3> +<p><img src="https://simplex.chat/blog/images/20221206-server1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-server2.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-server3.png" width="288" /></p> +<p>When you self-host your own SMP server you may want to make it public so that anybody can use it to receive messages. But many users want to host their private servers, so that only they and their friends can use them to receive the messages.</p> +<p>v4.0 of SMP server and the new version of the apps adds support for server passwords. It is chosen randomly when you initialize the new server, and if you already have a server you can change it. Anybody can still message you, it doesn't require knowing the password, and the links you share do not include it, but to be able to receive the messages you need to know a server address that includes the password. In a way, it is similar to how basic authentication works in HTTP, and how browsers support the URIs with included credentials.</p> +<p>The new server configuration section now allows to test your servers before you start using them, and you can also share your server address via QR code, so that your friends or your team can use them too, without the need to copy paste the addresses.</p> +<p>You can read how to install and configure SMP servers in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md">this guide</a>.</p> +<h3 id="privacy-and-security-improvements" tabindex="-1">Privacy and security improvements</h3> +<h4 id="protect-app-screen" tabindex="-1">Protect app screen</h4> +<img src="https://simplex.chat/blog/images/20221206-protect.png" width="330" /> +<p>It is now enabled by default, but you can disable it via settings.</p> +<p>iOS app only hides the app screen in the recent apps, Android app in addition to that also prevents the screenshots.</p> +<p>This is not the security measure for the senders, and we made it optional, as the recipient could circumvent it anyway – this is for you to protect your app screen when you give your phone to somebody.</p> +<h4 id="privacy-and-security-of-simplex-invitation-links" tabindex="-1">Privacy and security of SimpleX invitation links</h4> +<p>Previously, when you sent somebody an invitation link, a contact address or a group link, they would take half a screen in the chat and they could open in the browser in some cases. Also, as these links are quire large, it is not easy to see if the page domain is maliciously replaced, what SMP server the connection would go through or what kind of link it is.</p> +<p>This version instead of showing the full link shows a short description, and it replaces a public web address with an internal URI scheme that the app uses (simplex:/) – such links open directly in the app. There is an option to show the full link, if you need it, and even to open it in the browser from the app, but in this case if this link is not using <a href="https://simplex.chat/">https://simplex.chat</a> website it will show as red to highlight it.</p> +<h3 id="optional-android-app-data-backup" tabindex="-1">Optional Android app data backup</h3> +<p>The previous version always backed up app data in the way it was configured by the system. Now you can override it from inside the app, preventing the backup even if it's enabled by the system settings. This version requires disabling it manually, we will make it disabled by default in the next release (v4.3.1).</p> +<h3 id="direct-messages-between-group-members" tabindex="-1">Direct messages between group members</h3> +<p>The new version does not allow them by default, but it can be enabled by group owners in the group settings when the group is created or at any later moment.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see the information on our <a href="https://simplex.chat/">new website</a> - it also answers all these questions.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in many crypto-currencies.</li> +<li>Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2</li> +<li>please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html + + 2023-01-03T00:00:00Z + + SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language! + <h1 id="simplex-chat-v44-released-with-disappearing-messages-live-messages-connection-security-verification-and-french-language" tabindex="-1">SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language!</h1> +<p><strong>Published:</strong> Jan 3, 2023</p> +<h2 id="whats-new-in-v44" tabindex="-1">What's new in v4.4</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">disappearing messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#live-messages">&quot;live&quot; messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#connection-security-verification">connection security verification</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#animated-images-and-stickers">animated images and stickers</a> – now on iOS too.</li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#french-language-interface">French language interface</a>, thanks to the users' community and Weblate!</p> +<h3 id="disappearing-messages" tabindex="-1">Disappearing messages</h3> +<p><img src="https://simplex.chat/blog/images/20230103-disappearing1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230103-disappearing2.png" width="288" /></p> +<p>It is now possible to send the messages that will be deleted from both sender and recipient device after set time – for the sender from the time they were sent, and for the recipient - from the time they were read.</p> +<p>Unlike in most other messengers, it requires agreement of both sides, not just the sender decision. I <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">wrote previously</a> why we believe it is wrong to allow the senders to delete their messages without recipient consent, and the same logic applies here – if you want to send the message that will disappear after some time, your contact should be ok with that too.</p> +<p>In group conversations disappearing messages can be enabled by the group owners, by default they are disabled.</p> +<h3 id="live-messages" tabindex="-1">&quot;Live&quot; messages</h3> +<img src="https://simplex.chat/blog/images/20230103-live.png" width="288" /> +<p>Pressing &quot;bolt&quot; button before you start typing the message will start a &quot;live&quot; message. Now, as you type it, it will be updated for all recipients every several seconds, including only complete words. To finish the message you need to press &quot;checkmark&quot; button.</p> +<p>You can also start a live message after you started typing or after you chose the image – long-press send button and then press &quot;Send live message&quot;.</p> +<h3 id="connection-security-verification" tabindex="-1">Connection security verification</h3> +<img src="https://simplex.chat/blog/images/20230103-verification.png" width="288" /> +<p>SimpleX Chat design prevents the possibility of messaging servers substituting the key during the initial connection (man-in-the-middle attack) by requiring that the invitation link is passed via another channel. I wrote more about how MITM attack works in <a href="https://www.poberezkin.com/posts/2022-12-07-why-privacy-needs-to-be-redefined.html">this post</a>. But this other channel, however unlikely, could still have been compromised by an attacker to replace the invitation link you sent. That is the reason why we recommend sharing QR code in a video call – this is very complex for an attacker to replace it in this case.</p> +<p>This new feature allows you to verify, via yet another channel, that the connection is secure and the keys were not replaced. You can either scan the security code from your contact's app, or compare codes visually, or even read it in a voice call – if your and your contact's app have the same security code for each other then the connection is secure.</p> +<p>If you are sending direct messages to some group members then it might also be important to verify security of these connections, as in this case the invitations were exchanged via the member who added you or another member, and if this member's client was modified, they could have replaced the keys and the addresses, and intercept the entire conversation.</p> +<p>Regardless how connection is established, verifying the connection proves its security. Technically, this security code is the hash of associated data used in the end-to-end encryption, which in turn is taken by combining public keys from the initial key exchange.</p> +<h3 id="animated-images-and-stickers" tabindex="-1">Animated images and stickers</h3> +<p><img src="https://simplex.chat/blog/images/20230103-stickers1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230103-stickers2.png" width="303" /></p> +<p>Android app supported GIFs and stickers for some time, now you can view and send them from iOS app as well, e.g. using GIPHY keyboard - you no longer need to choose between privacy and stickers. Just bear in mind, that third party keyboards can be insecure, so you should not be using them for typing sensitive information.</p> +<h3 id="french-language-interface" tabindex="-1">French language interface</h3> +<p>Thanks to our users' community and to <a href="https://weblate.org/en-gb/">Weblate</a> kindly providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds French.</p> +<p>Please get in touch if you want to translate the interface into your language!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in crypto-currencies.</li> +<li>Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt - Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>BCH address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2</li> +<li>please let us know, via GitHub issue or chat, if you want to create a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html + + 2023-02-04T00:00:00Z + + SimpleX Chat v4.5 released – with multiple chat profiles, message draft, transport isolation and Italian language! + <h1 id="simplex-chat-v45-released-with-multiple-user-profiles-message-draft-transport-isolation-and-italian-interface" tabindex="-1">SimpleX Chat v4.5 released – with multiple user profiles, message draft, transport isolation and Italian interface!</h1> +<p><strong>Published:</strong> Feb 4, 2023</p> +<h2 id="whats-new-in-v45" tabindex="-1">What's new in v4.5</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#multiple-chat-profiles">multiple chat profiles</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#message-draft">message draft</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation">transport isolation</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#reduced-battery-usage">reduced battery usage</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#private-filenames">private filenames</a>.</li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#italian-interface">Italian interface</a>, thanks to the users' community and Weblate!</p> +<h3 id="multiple-chat-profiles" tabindex="-1">Multiple chat profiles</h3> +<p><img src="https://simplex.chat/blog/images/20230204-profiles1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230204-profiles2.png" width="288" /></p> +<p>Incognito mode added in v3.2 allows to share a random profile name with your new contacts. It is quite popular - more than half of users connecting to our support profile use it. In case when you just want a throw-away profile name that doesn't share any information about you it is more convenient that creating a new profile for each contact manually.</p> +<p>But there are many cases when a disposable profile is not good enough enough, and you want to create separate profiles - one for your family, another for work, yet one more for your online contacts that only know your pseudonym rather than your real name.</p> +<p>Previously this was only possible by using separate chat databases. This version adds a chat profile manager that allows you to create unlimited number of profiles, and very quickly switch them. All these profiles are connected at the same time.</p> +<p>When you delete profile you no longer need you have two options - either delete both profile data on the device and any message queues that this profile created on SMP servers (e.g., when it is more important to leave as few meta-data on the servers), or delete only profile data without making any network requests (when it is more important to delete all data from the device quickly).</p> +<p>While most app settings apply to all profiles, several settings are profile-specific.</p> +<p>You can separately set which SMP servers are used to create the new contacts in each profile (via Network settings). Please note: changing SMP servers in one profile won't affect other profiles, and all new profiles are created with preset servers.</p> +<p>You can also separately set the retention time for messages in each profile (via Database settings).</p> +<p>Also, you have a different contact address in each profile, and different Chat preferences.</p> +<p>All other settings are used for all profiles. While you may want to have different settings for different security levels, it is much better to use different devices in this case.</p> +<h3 id="message-draft" tabindex="-1">Message draft</h3> +<p><img src="https://simplex.chat/blog/images/20230204-draft1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230204-draft2.png" width="288" /></p> +<p>Previously, if you've closed the conversation with unsent message, this message was disappearing. While it might be better for privacy, there are several scenarios when it is very inconvenient:</p> +<ul> +<li>you need to compose the message from several parts that you copy from other conversations.</li> +<li>some messages arrives that you need to answer urgently, so you can leave unfinished message to return to it later.</li> +</ul> +<p>Both are now possible - the message you wrote, together with any attachments, and even a voice message you recorded, will remain available as draft until you either close the app or leave another message unfinished - while you can send the message in another chat without losing the current draft, there can be only one draft at a time.</p> +<h3 id="transport-isolation" tabindex="-1">Transport isolation</h3> +<img src="https://simplex.chat/blog/images/20230204-transport.png" width="288" /> +<p>Even when you create different chat profiles you are still connecting to your contacts via the same device. Transport isolation, by default, makes connections belonging to the same profile use different TCP sessions, so while the server sees the same IP address, it doesn't see it as the same client connection. If you are connecting via Tor using SOCKS proxy (e.g. Orbot app on Android) not only the app will use different TCP sessions, it will also use separate Tor circuits for connections from different profiles, preventing the servers and network observers seeing this as traffic coming from the same device.</p> +<p>There is an additional BETA option to use a separate transport connection for each contact and group member connection you have – it is available in Network settings if you enable dev tools. In case you have a large number of contacts or participate in large groups across all profiles in the app, you should not use this option, as it may create a lot of traffic and also can exceed the quota for TCP sockets. Also creating a lot of separate Tor circuits can be slow. We will be testing at which number of connections this option starts failing and by the time it's available without dev tools we will add some limits.</p> +<h3 id="reduced-battery-usage" tabindex="-1">Reduced battery usage</h3> +<p>Battery usage is one of the biggest complaints of SimpleX Chat users. The main reason for excess traffic is inefficient retry strategies for Network operations in these cases:</p> +<ul> +<li>the message queue capacity is exceeded - the app will keep retrying to send the message until there will be capacity.</li> +<li>the server is not available, e.g. if you connect to somebody via their server, and they later disable it. This case creates much less extra traffic than the first.</li> +</ul> +<p>This version makes retries for exceeded queue capacity 10x less frequent and adds SMP protocol extension that will allow to reduce retries even further by the next version. It works in the following way:</p> +<ul> +<li>when the sender encounters &quot;queue quota exceeded&quot; error, the sender stops trying to send the message.</li> +<li>the server also takes note of that error.</li> +<li>once recipient receives all messages from this queue, the server will notify the recipient that the sender had &quot;queue quota exceeded&quot; error.</li> +<li>the recipient will then send a special message to the sender client to instruct it that it can resume delivery.</li> +<li>the sender can still occasionally try sending the message, e.g. once every hours, but it won't need to retry once every few minutes as it does now.</li> +</ul> +<p>Reducing battery usage is our big priority - we expect to reduce it by at least 2-3x in the next few months.</p> +<h3 id="private-filenames" tabindex="-1">Private filenames</h3> +<p>When you send an image or voice message they are sent as files with filenames including timestamp. We didn't see it as a problem, as files are sent together with the message, and messages have server-side timestamps anyway. But the users pointed out that the timestamp we used was in the local timezone, and therefore leaked the country (or continent) where the user is located. A simple workaround was to reset timezone to UTC, and that is what most users who need to protect their location do anyway. But this version resolves it - these filenames now include UTC timezones – no workarounds are needed.</p> +<h3 id="italian-interface" tabindex="-1">Italian interface</h3> +<p>Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Italian and many more is in progress - Chinese, Japanese, Czech, Dutch, etc.</p> +<p>You can <a href="https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps">contribute the translation</a> of the apps to your language too!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html + + 2023-03-01T00:00:00Z + + SimpleX File Transfer Protocol - a new protocol for sending large files efficiently, privately and securely. + <h1 id="simplex-file-transfer-protocol-a-new-protocol-for-sending-large-files-efficiently-privately-and-securely" tabindex="-1">SimpleX File Transfer Protocol – a new protocol for sending large files efficiently, privately and securely.</h1> +<p><strong>Published:</strong> Mar 1, 2023</p> +<ul> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#%E2%9A%A1%EF%B8%8F-quick-start-send-a-file-with-xftp-cli-in-3-simple-steps">Quick start: how to send a file using XFTP CLI</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#whats-the-problem">What's the problem</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#why-didnt-we-just-use-some-existing-solution">Why didn't we just use some existing solution?</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#what-is-xftp-and-how-does-it-work">What is XFTP and how does it work?</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#what-is-next">What is next?</a></li> +</ul> +<h2 id="quick-start-send-a-file-with-xftp-cli-in-3-simple-steps" tabindex="-1">⚡️ Quick start: send a file with XFTP CLI in 3 simple steps</h2> +<p>Download XFTP binary for Linux from <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v5.0.0-beta.3">the release</a> – you need the file <code>xftp-ubuntu-20_04-x86-64</code> - rename it as <code>xftp</code>.</p> +<p><strong>Step 1</strong>: To send the file:</p> +<pre><code class="language-bash">xftp send filename.ext +</code></pre> +<p>You can also send the file that can be received by multiple recipients using <code>-n</code> option:</p> +<pre><code class="language-bash">xftp send filename.ext -n 10 +</code></pre> +<p><strong>Step 2</strong>: Pass file description(s) (files <code>rcvN.xftp</code>) to the recipient(s) securely, e.g. send it as a file via SimpleX Chat.</p> +<p><strong>Step 3</strong>: To receive the file:</p> +<pre><code class="language-bash">xftp recv rcvN.xftp +</code></pre> +<p>The sender also delete all file chunks from the relays before they expire in 48 hours with this command:</p> +<pre><code class="language-bash">xftp del ./filename.ext/snd.xftp.private +</code></pre> +<br /> +<h2 id="whats-the-problem" tabindex="-1">What's the problem?</h2> +<p>If you are using SimpleX Chat apps you know that support of sending files and images is not very good, and sending videos and large files is simply impossible. There are currently these problems:</p> +<ul> +<li>the sender has to be online for file transfer to complete, once it was confirmed by the recipient.</li> +<li>when the file is sent to the group, the sender will have to transfer it separately to each member, creating a lot of traffic.</li> +<li>the file transfer is slow, as it is sent in small chunks - approximately 16kb per message.</li> +</ul> +<p>As a result, we limited the supported size of files in the app to 8mb. Even for supported files, it is quite inefficient for sending any files to large groups.</p> +<h2 id="why-didnt-we-just-use-some-existing-solution" tabindex="-1">Why didn't we just use some existing solution?</h2> +<p>We really hoped to find some existing open-source solution that we could integrate with SimpleX Chat.</p> +<p>We decided not to use torrent-like or any other P2P solutions because of their lack of privacy, challenging legality in some jurisdictions and, in many cases, because they are inefficient in groups.</p> +<p>We reviewed several S3-compatible solutions (e.g., <a href="https://github.com/minio/minio">minio</a>, <a href="https://git.deuxfleurs.fr/Deuxfleurs/garage">garage</a>, <a href="https://github.com/seaweedfs/seaweedfs">SeaweedFS</a>), but they all require the development of a separate service layer, making them unusable as standalone services and harder to deploy for the users who want to self-host the file transfer service. As a side note, the solution that we developed can still be composed with S3-compatible storage for higher capacity servers with some privacy/efficiency trade-offs.</p> +<p>We also looked at a few independent implementations of file sharing, with some ad-hoc protocols (e.g., <a href="https://github.com/ceph/ceph">ceph</a> and <a href="https://framagit.org/fiat-tux/hat-softwares/lufi">lufi</a>), but neither seemed sufficiently mature, and also not as private as we would like.</p> +<p>So after a lot of searching we decided to design and implement a new protocol for file transfers, that both solved the problems above, and provided a higher level of metadata privacy than any other file transfer solution has.</p> +<h2 id="what-is-xftp-and-how-does-it-work" tabindex="-1">What is XFTP and how does it work?</h2> +<pre><code> Sender Internet XFTP relays Internet Recipient +---------------------------- | ----------------- | ------------------- | ------------ | ---------- + | | | | + | | (can be self-hosted) | | + | | +---------+ | | + chunk 1 ----- HTTP2 over TLS ------ | XFTP | ---- HTTP2 / TLS ----- chunk 1 + |---&gt; SimpleX File Transfer Protocol (XFTP) --&gt; | Relay | ---&gt; XFTP -------------&gt;| + | --------------------------- +---------+ ---------------------- | + | | | | | | + | | | | | v + +----------+ | | +---------+ | | +-------------+ + | Sending | ch. 2 ------- HTTP2 / TLS ------- | XFTP | ---- HTTP2 / TLS ---- ch. 2 | Receiving | +file ---&gt; | XFTP | ------&gt; XFTP ----&gt; | Relay | ---&gt; XFTP ------&gt; | XFTP | ---&gt; file + | Client | --------------------------- +---------+ ---------------------- | Client | + +----------+ | | | | +-------------+ + | | | | | ^ + | | | +---------+ | | | + | ------- HTTP2 / TLS ------- | XFTP | ---- HTTP2 / TLS ---- | + |-------------&gt; XFTP ----&gt; | Relay | ---&gt; XFTP -------------&gt;| + chunk N --------------------------- +---------+ --------------------- chunk N + | | (store file chunks) | | + | | | | + | | | | +</code></pre> +<p>XFTP stands for SimpleX File Transfer Protocol. Its design is based on the same ideas and has some of the qualities of SimpleX Messaging Protocol, that is used in SimpleX Chat:</p> +<ul> +<li>recipient cannot see sender's IP address, as the file fragments (chunks) are temporarily stored on multiple XFTP relays.</li> +<li>file can be sent asynchronously, without requiring the sender to be online for file to be received.</li> +<li>there is no network of peers that can observe this transfer - sender chooses which XFTP relays to use, and can self-host their own.</li> +<li>XFTP relays do not have any file metadata - they only see individual chunks, with access to each chunk authorized with anonymous credentials (using Edwards curve cryptographic signature) that are random per chunk.</li> +<li>chunks have one of the sizes allowed by the servers - currently we allow 256kb, 1mb and 4mb chunks, so if you send, say 1gb file, to XFTP relays it will look indistinguishable from sending many small files, and they would only know that chunks are sent by the same user only via the transport information, but none of the relays will see all chunks. Also, once this feature is available in mobile apps you can use transport isolation per chunk, when each file fragment will be uploaded via a separate TCP connection (and Tor circuit, if you use Tor) – the CLI we released does not yet support per-chunk transport isolation.</li> +<li>each chunk can be downloaded by multiple recipients, but each recipient uses their own key and chunk ID to authorize access, and the chunk is encrypted by a different key agreed via ephemeral DH keys (NaCl crypto_box (SalsaX20Poly1305 authenticated encryption scheme ) with shared secret derived from Curve25519 key exchange) on the way from the server to each recipient. XFTP protocol as a result has the same quality as SMP protocol - there are no identifiers and ciphertext in common between sent and received traffic inside TLS connection, so even if TLS is compromised, it complicates traffic correlation attacks.</li> +<li>XFTP protocol also supports redundancy - each file chunk can be sent via multiple relays, and the recipient can choose the one that is available. The released CLI does not support redundancy though.</li> +<li>the file as a whole is encrypted with a random symmetric key using NaCl secret_box.</li> +</ul> +<p>So, how would any recipient know where to get all these file fragments from and how to put them back together into the original file? Normally, when you send a file via any file-sharing service it provides you a link that you can pass to the recipient. The link allows to download the original file, but it also provides the server a lot of file meta-data, that often includes file name and exact size, and in many cases the server also has access to a file content.</p> +<p>Instead of using a link, XFTP protocol includes a special format for a &quot;file description&quot; - it is a small text file containing the locations, access keys and digests for all file chunks, and also the encryption key and digest (SHA512) for the whole file. This file description does not contain the original file name or exact file size, so if it is used after the file fragments are expired or removed from XFTP relays, this information is not accessible.</p> +<p>CLI generates a separate file description for each intended recipient - you need to specify how many people you want to be able to receive this file. You can specify a larger number of recipients to avoid revealing the real number of recipients from XFTP relays. Mobile apps, when this protocol is integrated, will do it automatically, choosing some large random number of possible recipients, so while the relays will be able to observe how many people time the file was downloaded, they won't know how many intended recipients you had - sending to a group of 10 people and to 1 recipient can look the same to the relays.</p> +<p>File description is a security-sensitive file that contains private keys and chunk addresses necessary to receive the whole file, and also a symmetric key to decrypt the file. Therefore you must use a secure channel to send file description - e.g., it can be sent via SimpleX Chat. But once the recipient downloaded the file, CLI invalidates the file fragment addresses on relays and the same file description cannot be used again to download the file.</p> +<h2 id="what-is-next" tabindex="-1">What is next?</h2> +<p>We released and deployed several XFTP relays for you to experiment with (they are hardcoded in the XFTP CLI), and you can deploy your own relays either from <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v5.0.0-beta.3">downloadable binary</a> or by compiling <a href="https://github.com/simplex-chat/simplexmq">the source code</a>. We also released XFTP CLI - it is available in the same release.</p> +<p>We are currently integrating support for sending large files using XFTP protocol into SimpleX Chat clients. SimpleX Chat v5.0 will have support for receiving files sent via XFTP protocol (you will be able to send a file description via a SimpleX Chat CLI app, so that mobile apps will be able to receive them as normal files, only much faster), and v5.1 will fully support for sending large files (up to 1gb) in the mobile apps.</p> +<p>We will also publish a formal specification for XFTP protocol and overview of its security qualities and threat model. For now you can learn more about the protocol design and motivations from this internal <a href="https://github.com/simplex-chat/simplexmq/blob/stable/rfcs/2022-12-26-simplex-file-transfer.md">XFTP protocol RFC</a>.</p> +<p>Using and sending files with the available XFTP CLI will hugely help us stabilizing both the protocol and implementations. What we really like about this design is that it is completely independent from SimpleX Chat - you can use it on its own, sending files and passing file descriptions to your contacts via any other messenger - e.g. via Signal, – without this messenger being able to observe that you are in fact sending a large file.</p> +<p>We did not yet decide whether we will be making a separate security audit of XFTP implementation, or if we combine it with the next security audit of SimpleX Chat. The latter seems more likely, as XFTP uses the same cryptographic primitives that were reviewed during <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment by Trail of Bits</a> in November 2022.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html + + 2023-03-28T00:00:00Z + + SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. + <h1 id="simplex-chat-v46-with-hidden-profiles-community-moderation-improved-audiovideo-calls-and-reduced-battery-usage" tabindex="-1">SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage.</h1> +<p><strong>Published:</strong> Mar 28, 2023</p> +<h2 id="whats-new-in-v46" tabindex="-1">What's new in v4.6</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#armv7a-32-bit-and-android-8-support">ARMv7a and Android 8+ support</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">hidden chat profiles</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#group--community-moderation">group / community moderation</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#group-welcome-message">group welcome message</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#improved-audiovideo-calls">improved audio/video calls</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#reduced-battery-usage">reduced battery usage</a>.</li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#smp-server-monitoring">SMP server monitoring: status bot and page</a></li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#chinese-and-spanish-interface---you-can-choose-the-language-via-the-app">Chinese and Spanish interface languages</a>, thanks to the users' community and Weblate!</p> +<h3 id="armv7a-32-bit-and-android-8-support" tabindex="-1">ARMv7a (32 bit) and Android 8+ support!</h3> +<p>It increases the number of supported Android devices twice - now most of your friends should be able to install SimpleX Chat. SimpleX Chat still doesn't support Android 7 and erlier versions.</p> +<p>If you install the app from GitHub or F-Droid you need to choose the correct APK, Play Store will provide it automatically.</p> +<h3 id="hidden-chat-profiles" tabindex="-1">Hidden chat profiles</h3> +<p><img src="https://simplex.chat/blog/images/20230328-hidden-profiles1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230328-hidden-profiles2.png" width="288" />    <img src="https://simplex.chat/blog/images/20230328-hidden-profiles3.png" width="288" /></p> +<p>For a long time the main way to protect SimpleX Chat app from people who have access to your phone was device authentication - it is requested when you open the app (and some of its sensitive functions).</p> +<p>Many users asked to allow setting the app password or PIN independently from the device PIN, as some other apps do. But it did not seem a good enough solution - if somebody has your device PIN, then in most cases they can also ask you to provide the app PIN as well.</p> +<p>So instead of having an app password, that reduces convenience and doesn't improve security too much, we did what we think could be better. You can now create hidden chat profiles, that are not visible anywhere in the app, and do not show any notifications, until you enter a correct passphrase. If multiple profiles are hidden with the same passphrase they will all show in the list when you enter it.</p> +<p>It's important to remember that these hidden profiles are still stored locally on your device, so if somebody has access to your chat database (they need to know database passphrase, that is independent from device PIN or profile passphrases) or to chat console in the app, they will be able to access these profiles data and reset their passwords. We are considering how chat console can be better protected - e.g., by requiring a separate password or by providing an option to remove it from the UI permanently - tell us what you think.</p> +<h3 id="group-community-moderation" tabindex="-1">Group / Community moderation</h3> +<p>Initially we did not design SimpleX Chat to support communities - our focus has always been maximum privacy and security.</p> +<p>SimpleX Chat supports small and fully decentralized groups, that are not hosted anywhere. But many users want to participate in and to discover communities. Since we added support for group links, the groups we created to let users test the app started to grow, and many other communities of over 100 people emerged.</p> +<p>We are already observing some less-than-friendly messages and undesirable content that is not welcome in some communities. So this version adds features allowing to moderate groups.</p> +<p>Firstly, group admins and owners can revoke members rights to send messages to the group by assigning members an &quot;observer&quot; role, and also make this role default for users joining via a group link.</p> +<p>Secondly, group admins can now delete messages sent by other members (excluding the messages sent by the group owners). &quot;Moderate&quot; action in the message menu will either mark the message as deleted or delete it irreversibly for all members, as set in group preferences by the owners.</p> +<p>These features will allow group owners to decide their own rules. More robust moderation tools are coming later when we build support for large communities.</p> +<h3 id="group-welcome-message" tabindex="-1">Group welcome message</h3> +<p>Group owners can now set a welcome message that will be shown to new members when they join the group via a group link.</p> +<h3 id="improved-audiovideo-calls" tabindex="-1">Improved audio/video calls</h3> +<img src="https://simplex.chat/blog/images/20230328-call2.png" width="288" /> +<p>Prior to this version audio and video calls in iOS app were very limited – they only worked while the app was in foreground. This version fully re-implemented audio/video calls in iOS – it now uses native WebRTC library instead of web view. These calls are still end-to-end encrypted, and compatible with the calls in the previous versions of the app, both on iOS and on Android platforms.</p> +<p>Where allowed by App Store policy, the calls on iOS now use Apple's native interface for calls CallKit, that allows to accept calls from the lock screen, prevents call interruption by incoming phone calls and optionally allows to include calls in the phone call history - the last option needs to be enabled separately.</p> +<p>Calls on Android were also improved – they now support bluetooth headphones, allow changing volume in video calls and support proximity sensor during the audio call, to prevent accidental interruption when you hold the phone close to your ear.</p> +<h3 id="reduced-battery-usage" tabindex="-1">Reduced battery usage</h3> +<p>We know that battery usage of SimpleX Chat is suboptimal, and we are committed to reduce it. Unfortunately, there is no simple change that we could make to solve this problem, it requires many systematic improvements and fixes.</p> +<p>One of the big issues, particularly in large groups, was inefficient retry strategy for sending messages in cases when the receiving message queue (mailbox) was out of capacity.</p> +<p>This version increases the maximum retry period for &quot;out-of-capacity&quot; scenario to 1 hour, and also preserves this retry period in the database. So, if previously before the message expired in 48 hours there were up to ~2800 delivery attempts and up to ~45Mb wasted traffic per recipient (depending on how frequently the app was restarted), now there will be only ~50 retries, resulting in not more than 0.8Mb of traffic - up to 56x traffic reduction when sending messages to the large groups.</p> +<p>This issue might not have affected you at all, and also solving it won't reduce overall traffic/battery usage by that factor - there are other inefficiences we will be addressing. But if you actively sent messages to large groups you should observe a substantial reduction of battery and traffic consumption.</p> +<p>Please share your experience. If the battery usage is still suboptimal, please share your usage statistics - they can be requested in chat console with <code>/get stats</code> command - it will return the aggregated number of network operations, per server, since the app was started. Please note that these statistics include the addresses of the servers you connect to, so if you want to keep them private, please redact them. You can also reset usage statistics with <code>/reset stats</code> command.</p> +<h3 id="smp-server-monitoring" tabindex="-1">SMP server monitoring</h3> +<p>If you use preset servers in SimpleX Chat you can now see when we do any maintenance or when the server is down either by <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FShQuD-rPokbDvkyotKx5NwM8P3oUXHxA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA6fSx1k9zrOmF0BJpCaTarZvnZpMTAVQhd3RkDQ35KT0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">connecting to status bot via the app</a> or by visiting a <a href="https://status.simplex.chat/">status page</a>. Status bot always sends automatic messages before the server is restarted for maintenance, but in case of downtime if the same server is down that you use to receive the messages from the bot, you may miss them - check the status page in this case.</p> +<h3 id="chinese-and-spanish-interface-you-can-choose-the-language-via-the-app" tabindex="-1">Chinese and Spanish interface - you can choose the language via the app!</h3> +<p>Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Chinese and Spanish and more are in progress.</p> +<p>You can <a href="https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps">contribute the translation</a> of the apps to your language too!</p> +<p>The app now supports 8 languages in addition to English - Czech, German, Spanish, French, Italian, Dutch, Russian and Chinese. You can now choose the language via the app settings (Appearance page), independently from the system settings.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html + + 2023-04-22T00:00:00Z + + SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb + <h1 id="simplex-chat-vision-and-funding-v50-released-with-videos-and-files-up-to-1gb" tabindex="-1">SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb.</h1> +<p><strong>Published:</strong> Apr 22, 2023</p> +<p>SimpleX Chat vision and funding:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#why-is-it-a-commercial-company">why is it a commercial company?</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#how-is-it-funded-and-what-is-the-business-model">how is it funded and what is the business model?</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#what-is-next">what is next?</a></li> +</ul> +<p>What's new in v5.0:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#send-videos-and-files-up-to-1gb">send videos and files up to 1gb</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#app-passcode">app passcode independent from system authentication</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#networking-improvements">networking improvements</a></li> +</ul> +<p>Also, we added Polish interface language, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">the users' community and Weblate</a>.</p> +<p>SimpleX Chat apps are now available in 10 languages!</p> +<h2 id="simplex-chat-vision-and-funding" tabindex="-1">SimpleX Chat vision and funding</h2> +<h3 id="why-is-it-a-commercial-company" tabindex="-1">Why is it a commercial company?</h3> +<p>It was a big decision: whether SimpleX Chat should be a non-profit project or an open-source project led by a commercial company.</p> +<p>During the last 25 years of the Internet, commercial companies have shown a much higher ability to innovate than non-profit organizations. One of the most inspiring examples is NetScape that created the Web as we know it - not only as the destination to access information, but also as an application platform, inventing cookies, SSL and JavaScript, that to this day remain the main building blocks for all web applications.</p> +<p>While SimpleX Chat Ltd is a commercial company, SimpleX Chat software is and will remain open-source. We believe that this way we will create much more value both for the end users, and also for the shareholders and the employees of the company.</p> +<p>Many large tech companies prioritizing value extraction over value creation earned a bad reputation for all businesses, particularly in the communities that value decentralization and privacy. But commercial objectives do not have to result in exploitation. Our goal is to build a new kind of communication network, and also an application platform, that is private by design, fully decentralized and not owned by any single entity, where SimpleX Chat Ltd is one of many organizations that operate the network. I shared my thoughts about how the Internet and privacy might evolve in the interview in <a href="https://optoutpod.com/episodes/s3e02-simplexchat/">Opt Out Podcast</a>.</p> +<h3 id="how-is-it-funded-and-what-is-the-business-model" tabindex="-1">How is it funded and what is the business model?</h3> +<p>We started working full-time on the project in 2021 when <a href="https://www.linkedin.com/in/portmanwills/">Portman Wills</a> and <a href="https://www.linkedin.com/in/peterbriffett/">Peter Briffett</a> (the founders of <a href="https://wagestream.com/en/">Wagestream</a> where I led the engineering team) supported the company very early on, and several other angel investors joined later. In July 2022 SimpleX Chat raised a pre-seed funding from the VC fund <a href="https://www.villageglobal.vc/">Village Global</a> - its co-founder <a href="https://www.villageglobal.vc/team/ben-casnocha">Ben Casnocha</a> was very excited about our vision of privacy-first fully decentralized messaging and community platform, both for the individual users and for the companies, independent of any crypto-currencies, that might grow to replace large centralized platforms, such as WhatsApp, Telegram and Signal.</p> +<blockquote> +<p>Edit: please see the comment from Ben Casnocha about this investment in <a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html">our post from August 14, 2024</a>.</p> +</blockquote> +<p>Overall we raised from our investors approximately $370,000 for a small share of the company to allow the project team working full time for almost two years, funding product design and development, infrastructure, and also <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the security assessment by Trail of Bits</a>. A large part of this money is not spent yet.</p> +<p>The project was hugely supported by the users as well - collectively, <a href="https://github.com/simplex-chat/simplex-chat#help-us-with-donations">you donated</a> over $25,000. Without these donations the investment we raised would not be possible, because we believe that voluntary user donations can sustain the project in the long term – it already covers all infrastructure costs. There are only two ways an Internet service can exist - either users are paying for it, or the users data becomes the product for the real customers, as happened with many large Internet companies. In the latter case the users are losing much more money than they are saving by giving away their privacy and the rights to the content they create on the centralized platforms.</p> +<p>Going forward we plan to keep the basic usage of the platform free, and at the same time we will be providing the benefits to the project sponsors. For example, there will be additional app icons and user profile badges. There also will be higher file transfer limits – currently we don't limit it at all, only limiting the file size, but it's unlikely to be sustainable. In any case, the app will remain highly usable for everyone for free, and fully open-source. Several other apps are already being developed based on our app core, leading to a fully decentralized network.</p> +<h3 id="what-is-next" tabindex="-1">What is next?</h3> +<p>Our goals for the next 1-2 years are to make the messaging network:</p> +<ul> +<li>more reliable and resilient, by adding redundancy into the message delivery and delivery receipts,</li> +<li>more private, by automating rotation of the servers used to deliver messages and by adding delivery relays to better protect IP addresses of the users,</li> +<li>more usable by adding and improving the functions users are expecting in messengers, and also adding some unique functions, like we did with <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">incognito mode</a>, <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#live-messages">live messages</a> and <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">hidden profiles</a>.</li> +</ul> +<p>One major initiative we will kick-off this year is the support for large, fully decentralized and private communities and groups not hosted on any servers – something that no Internet platform achieved so far in as private and efficient way as we plan to build it.</p> +<p>To accelerate product development and growth we will be raising a seed funding this year, both from the VCs and angel investors, and we also might offer our users an opportunity to participate in the crowd funding round on the same terms as other investors, allowing to both support the project and to benefit from its future growth. <a href="https://simplex.chat/#join-simplex">Subscribe to our updates</a> not to miss it, connect to the team in SimpleX Chat and <a href="https://github.com/simplex-chat/simplex-chat#join-user-groups">join users' groups</a>.</p> +<h2 id="whats-new-in-v50" tabindex="-1">What's new in v5.0</h2> +<h3 id="send-videos-and-files-up-to-1gb" tabindex="-1">Send videos and files up to 1gb!</h3> +<img src="https://simplex.chat/blog/images/20230422-video.png" width="288" class="float-to-left" /> +<p>In the beginning of March <a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html">we released servers and command-line utility to send and receive files via XFTP protocol</a> - a very private and secure protocol that sends end-to-end encrypted files in chunks, protecting meta-data better than any alternatives we know of.</p> +<p>Now this protocol is fully integrated in SimpleX Chat, and all files except small voice messages are sent using this protocol (small voice messages are sent as usual messages). Not only it is much faster than before - with the fast Internet connection I can send 25Mb file in 3 seconds and 1gb file in 2 minutes (for most users it's capped at the available Internet bandwidth), it has two other major advantages making it more usable:</p> +<ul> +<li>the file sent to a group has to be uploaded only once, regardless of the group size.</li> +<li>once the file is uploaded (it will have the tick), you no longer need to be online for your contact (or group members) to be able to receive it.</li> +</ul> +<p>As for the metadata privacy, it has similar guarantee to SimpleX Messaging Protocol. The files are sent via TLS 1.2/1.3, with the same server identity verification, TLS channel binding and upload authorization as used with SMP servers. But the file metadata is protected even if TLS is compromised, as there are no identifiers and ciphertext in common in server received and sent traffic, allowing to correlate only by sending and receiving time. Correlating by time becomes less efficient as the server traffic grows.</p> +<p>We also added the ability to send videos in the chat, so they can be played right in the conversation or on full screen without leaving the app – thanks to the efficient and fast file transfer they are very usable.</p> +<p>We also plan to add support for longer and higher quality voice messages, and also for sending full resolution images in the next versions.</p> +<h3 id="app-passcode" tabindex="-1">App passcode</h3> +<p><img src="https://simplex.chat/blog/images/20230422-passcode1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230422-passcode2.png" width="288" /></p> +<p>While we do think that app passcode does not increase security too much, compared with device passcode or biometric protection, there are cases when it may be preferable, and also many users really wanted that it is added.</p> +<p>Now you can choose whether to use faster and more convenient system biometric authentication or to use a separate app passcode. You can choose which one to use when it is first offered, or switch later in the settings.</p> +<h3 id="networking-improvements" tabindex="-1">Networking improvements</h3> +<img src="https://simplex.chat/blog/images/20230422-socks.png" width="288" class="float-to-left" /> +<p>Two small improvements to the app networking capabilities were added in this version.</p> +<p>Firstly, you can now make your self-hosted servers available on IPv6 addresses, and the app supports them as well. Please bear in mind that older clients won't be able to connect to you if you use IPv6 address, and also that some ISPs do not provide IPv6 addresses to their users, in which case they would also not be able to connect if IPv6 address is used. To allow connections in these cases you should make your servers available on some domain name that resolves to both IPv4 and IPv6 addresses, and use this domain name in the server address.</p> +<p>Secondly, Android client now supports configuring host and port of the SOCKS proxy, allowing to use apps other than Orbot and also to run SOCKS proxy in the local network, to save mobile device battery.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html + + 2023-05-23T00:00:00Z + + SimpleX Chat v5.1 released: message reactions and self-destruct passcode + <h1 id="simplex-chat-v51-released-message-reactions-and-self-destruct-passcode" tabindex="-1">SimpleX Chat v5.1 released: message reactions and self-destruct passcode</h1> +<p><strong>Published:</strong> May 23, 2023</p> +<p>What's new in v5.1:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#message-reactions">message reactions</a> 🚀</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#improved-messages">improved messages</a>: +<ul> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#voice-messages-up-to-5-minutes-better-quality-playback-control">voice messages up to 5 minutes</a>.</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#disappearing-messages-choose-any-time">custom time to disappear</a>.</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#message-editing-history">message editing history</a>.</li> +</ul> +</li> +<li>new design and <a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#customize-and-share-color-themes">customizable themes</a> that you can share!<sup>*</sup></li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#self-destruct-passcode">self-destruct passcode</a></li> +</ul> +<p>There are lots of small improvements and fixes in this release:</p> +<ul> +<li>setting to disable audio/video calls per contact.</li> +<li>group welcome message visible in a group profile - add the link to join the group there.</li> +<li>fixes for sending files.</li> +<li>configurable SOCKS proxy host and port<sup>*</sup>.</li> +<li>improved calls on lock screen<sup>*</sup>.</li> +<li>locale-dependent formatting of time and date<sup>*</sup>.</li> +</ul> +<p>Also, we added Japanese and Portuguese (Brazil)<sup>*</sup> interface languages, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>* These features are available in the Android version only.</p> +<h2 id="message-reactions" tabindex="-1">Message reactions</h2> +<img src="https://simplex.chat/blog/images/20230523-reactions.png" width="288" class="float-to-left" /> +<p>No idea why it took us so long to add them – finally we have them, and they are great.</p> +<p>We didn't like the view of other messengers plagued by 40 different reactions on a message, and we were not quite sure what can be done about it, so we initially decided to limit available reactions to just 6: thumbs up 👍, down 👎, smile 😀, tear 😢, heart ❤️ and rocket 🚀. But unlike some other messengers, we don't limit the reactions to just one per message - you can put up to 3.</p> +<p>You can add them via the menu, or just by tapping the reaction already on the message.</p> +<p>The next app version will allow prohibiting the reactions per conversation, as you asked. Some groups work better with more substantive responses.</p> +<h2 id="improved-messages" tabindex="-1">Improved messages</h2> +<h3 id="voice-messages-up-to-5-minutes-better-quality-playback-control" tabindex="-1">Voice messages: up to 5 minutes, better quality, playback control</h3> +<img src="https://simplex.chat/blog/images/20230523-voice.png" width="288" class="float-to-left" /> +<p>Since <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#instant-voice-messages">v4.3</a> voice messages were sent in small 16kb chunks, so we had to limit them to 30-40 seconds for better user experience, as sending larger files would require the sender to be online.</p> +<p>With the new XFTP protocol that allows sending files up to 1gb it is now possible to increase the message size - we decided to limit it at 5 min, increasing their quality 2x (the bitrate is increased from 16 to 32kbps). We also added a slider to control the playback.</p> +<h3 id="disappearing-messages-choose-any-time" tabindex="-1">Disappearing messages: choose any time!</h3> +<p><img src="https://simplex.chat/blog/images/20230523-disappearing1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230523-disappearing2.png" width="288" /></p> +<p>Since <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">v4.4</a> disappearing messages were only configurable for the whole conversation, with a limited choice of allowed times between 30 seconds and 1 month.</p> +<p>This version allows to configure the time for messages to disappear more granularly, in the range from 1 second to 3 months. You can also set a different time to disappear when you send the message (hold the Send button), as long as disappearing messages are enabled in the conversation.</p> +<h3 id="message-editing-history" tabindex="-1">Message editing history</h3> +<img src="https://simplex.chat/blog/images/20230523-info.png" width="288" class="float-to-left" /> +<p>I <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">wrote previously</a> why we decided to require the recipient concent before the messages can be fully deleted by the sender - in short, it is to support recipient's data sovereignty and prevent the possibility of offensive messages being removed without any trace. By default, when the sender deletes the message it is marked as deleted, rather than fully deleted, and you can reveal the original message.</p> +<p>You've found the workaround for it of course - it's enough to simply edit the message to hide the original content. This version adds a visible message editing history, together with other detailed information about when the message was sent, received or deleted, that wasn't visible in the conversation.</p> +<h2 id="customize-and-share-color-themes" tabindex="-1">Customize and share color themes</h2> +<img src="https://simplex.chat/blog/images/20230523-theme.png" width="288" class="float-to-left" /> +<p>Android app now allows choosing between three color themes - Light, Dark and SimpleX (a dark blue theme). You can customize any theme by setting 9 different colors used in the app, including titles, menus, accent colors and colors for sent and received messages.</p> +<p>You can share your theme with other users by exporting it to a file and sending to them. You can also <a href="https://simplex.chat/docs/themes.html">contribute your favorite themes</a> to our GitHub repository.</p> +<h2 id="self-destruct-passcode" tabindex="-1">Self-destruct passcode</h2> +<img src="https://simplex.chat/blog/images/20230523-self-destruct.png" width="288" class="float-to-left" /> +<p>This is something many of you asked before - when asked to enter the app passcode under duress, to be able to enter a special self-destruct code that would remove the app data. This feature is offered in many security tools, and now you can configure it in SimpleX Chat as well.</p> +<p>To enable it:</p> +<ul> +<li>go to app Settings &gt; Privacy &amp; security &gt; SimpleX Lock.</li> +<li>switch lock mode to Passcode and, if necessary, enable lock – Self-destruct passcode will become available.</li> +<li>enable it, enter the main passcode and then enter and confirm self-destruct passcode.</li> +<li>optionally, you can set the new display name of the profile that will be created after the data was wiped. If it is left blank, a new empty profile will have a random name.</li> +</ul> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html + + 2023-07-22T00:00:00Z + + SimpleX Chat v5.2 released: message delivery receipts + <h1 id="simplex-chat-v52-released-message-delivery-receipts" tabindex="-1">SimpleX Chat v5.2 released: message delivery receipts</h1> +<p><strong>Published:</strong> July 22, 2023</p> +<p><strong>What's new in v5.2:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#message-delivery-receipts">message delivery receipts</a> – with opt-out per contact!</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#filter-favorite-and-unread-chats">filter favorite and unread chats</a>.</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#more-usable-groups">more usable groups</a>: +<ul> +<li>view full original replied message in info.</li> +<li>share your address with your contacts and group members via your chat profile.</li> +<li>search new and existing members.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#stability-improvements">stability improvements</a>: +<ul> +<li>keep your connections working after restoring from backup.</li> +<li>restart app (Android) or reconnect servers (iOS).</li> +<li>more reliable switching of the receiving address.</li> +<li>more stable message delivery.</li> +</ul> +</li> +<li>other improvements: +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#better-disappearing-messages">better disappearing messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#prohibit-message-reactions">prohibit message reactions</a>.</li> +</ul> +</li> +</ul> +<p><strong>Platform evolution:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#problems-of-public-groups">problems of public groups</a>: +<ul> +<li>why not all messages are received.</li> +<li>how to cope with these problems.</li> +<li>when will public groups be more usable.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#what-about-read-receipts">what about read receipts?</a></li> +</ul> +<h2 id="whats-new-in-v52" tabindex="-1">What's new in v5.2</h2> +<h3 id="message-delivery-receipts" tabindex="-1">Message delivery receipts</h3> +<img src="https://simplex.chat/blog/images/20230722-receipts.png" width="330" class="float-to-left" /> +<p>Most messaging apps add two ticks to sent messages – the first one to show that the message is accepted by the server, and the second – that it is delivered to the recipient's device. It confirms that the network is functioning, and that the message is not lost or delayed. SimpleX Chat now has this feature too!</p> +<p>In some cases it may compromise recipients' privacy, as they show that the recipient is online, so we made sending delivery receipts optional – it can be disabled separately for each chat profile or contact. For the new chat profiles this feature is enabled by default.</p> +<p>To avoid compromising your privacy, sending delivery receipts is disabled for all your existing chat profiles. The first time you start the app after the update, you will be offered to enable them for all <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">visible profiles</a>, and they can be enabled later via Privacy and Security settings.</p> +<h3 id="filter-favorite-and-unread-chats" tabindex="-1">Filter favorite and unread chats</h3> +<img src="https://simplex.chat/blog/images/20230722-filter.png" width="288" class="float-to-left" /> +<p>You can now mark your contacts and groups as <em>favorite</em>, to be able to find them faster. With filter enabled, you will only see favorite chats, chats that contain unread messages and also any unaccepted group invitations and contact requests.</p> +<h3 id="more-usable-groups" tabindex="-1">More usable groups</h3> +<p>Active SimpleX Chat users know how broken the current group experience is, and that we plan some major overhaul of the groups protocol – more on that below. In the meanwhile, we added some simple features that make groups in their current state a bit more usable.</p> +<h4 id="what-is-this-in-reply-to" tabindex="-1">What is this in reply to?</h4> +<img src="https://simplex.chat/blog/images/20230722-quoted.png" width="330" class="float-to-left" /> +<p>A major problem is that you can see replies to the messages you've not seen before - this would happen both when you just join the group, and didn't connect to most other members, and also when other new members join the group and they didn't yet connect to you – so literally all the time, and the bigger the group gets, the worse it becomes. While this problem cannot be solved without major group protocol changes, at least there is now ability to see the original message that was replied to via the message information.</p> +<h4 id="how-to-connect-to-this-member" tabindex="-1">How to connect to this member?</h4> +<img src="https://simplex.chat/blog/images/20230722-search.png" width="330" class="float-to-left" /> +<p>To simplify direct connections with other group members, you can now share your SimpleX address via your chat profile, and group members can send you a contact request even if the group does not allow direct messages.</p> +<h4 id="how-to-find-a-member-in-the-list" tabindex="-1">How to find a member in the list?</h4> +<p>Large member lists (and also the long lists of contacts, if you have many of them) become hard to scroll through, so now there is a search in both lists.</p> +<h3 id="stability-improvements" tabindex="-1">Stability improvements</h3> +<p>This version fixes many long-standing problems with the message delivery, failed connections with group members (that also contributed to group fragmentation), and reduces traffic in groups (beta users experienced a traffic spike because of this fix, but it doesn't affect the final v5.2 release). It's not the end of the road to making SimpleX Chat as stable as mainstream messengers, but it is a big improvement.</p> +<p>Please report the cases when messages are not delivered – delivery receipts should help with that.</p> +<h4 id="messages-failed-to-decrypt-problem-solved" tabindex="-1">Messages failed to decrypt? Problem solved!</h4> +<p>Previously, a growing number of users had the issue when after restoring the chat database from backup, messages from some contacts failed to decrypt and were showing an error in the app.</p> +<p>This happens due to double ratchet protocol protecting the integrity of end-to-end encryption after the compromise - <a href="https://simplex.chat/docs/glossary.html#post-compromise-security">post-compromise security</a>. The protocol logic does not allow to use the old version of the database to decrypt the message.</p> +<p>v5.2 added the extension to the messaging protocol allowing to negotiate the new ratchet keys in such cases - both with the contacts and the group members. This requires a user action, and it resets the security code verification status for this contact or member – you need to verify it again to have the additional protection from <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">man-in-the-middle attacks</a>.</p> +<p>The negotiation of the new ratchet keys still happens via the end-to-end encrypted messages, as the protocol has two layers of end-to-end encryption, so it cannot be compromised by the messaging relays.</p> +<p>You may still lose connection if you or your contact changed the receiving address after you made the backup, so make sure to make a new backup after any receiving address changes.</p> +<h4 id="reconnect-the-servers" tabindex="-1">Reconnect the servers</h4> +<p>While v5.2 solved many message delivery issues, there may be some others, but they are usually resolved with app restart. It was difficult to fully restart Android app, as there is a continuosly running background service for notifications that doesn't restart with the app. Now Android app has both Restart and Shutdown buttons that take background service into account.</p> +<p>On iOS you can now pull down the list of conversations to reconnect to all relays without restarting the app.</p> +<h3 id="better-disappearing-messages" tabindex="-1">Better disappearing messages</h3> +<p>You can now send a separate disappearing message if the chat preferences allow them, but do not have any time to disappear enabled – this applies both to groups and to contacts. You can also set the time to disappear up to 12 months.</p> +<h3 id="prohibit-message-reactions" tabindex="-1">Prohibit message reactions</h3> +<p>While most people like message reactions, some conversations make them inappropriate - you can disable them now.</p> +<h2 id="platform-evolution" tabindex="-1">Platform evolution</h2> +<h3 id="problems-of-public-groups" tabindex="-1">Problems of public groups</h3> +<p>As I wrote above, the major problem is that not all messages are received by all members, or, at least, they may be substantially delayed. Additional problems are various scenarios when the list of members gets out of sync for different members.</p> +<p>How to cope with these problems?</p> +<p>It really helps to only use one link shared with the members to join the group - the one created by the client that is most frequently online, ideally always online. This is sometimes confusing, as any group admin can create another group link, and share it with the members, and if this admin is not online, the new member won't be able to join.</p> +<p>We will add new group features to manage fragmentation - there will be an option to fix the connection with the member that you failed to connect to by passing the link out-of-band. This can be particularly helpful for stable groups of 20-50 people where it's important to see all messages.</p> +<p>In the long term, the only way to make groups usable is to move to a new design. We considered several options.</p> +<h4 id="why-not-hosted-groups-with-mls" tabindex="-1">Why not hosted groups with MLS?</h4> +<p>Initially, we considered the design with the dedicated servers, potentially self-hosted, that host groups. This design would require adopting MLS (or similar) protocol for group-wide key agreement. Unfortunately, this design is not sufficiently resilient and easier to censor than decentralized design. Also, MLS protocol is very complex to implement, requires a centralized component, and reduces forward secrecy. So we decided against this approach.</p> +<h4 id="why-not-fully-decentralized-groups" tabindex="-1">Why not fully decentralized groups?</h4> +<p>We also <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/docs/rfcs/2023-05-02-groups.md">considered</a> rumour-mongering protocol, where all members are equal and participate in message dissemination. The problem with this approach is that it adds a lot of traffic for all members, even those who mostly read messages. Also, it still requires establishing a fully connected graph, and with large groups it becomes prohibitively expensive and unreliable, given that many members join public groups for a limited time.</p> +<h4 id="members-host-the-groups" tabindex="-1">Members host the groups</h4> +<p>We are now considering a middle-ground - the design where the owners and admins host the group, synchronising the state between them, receiving and re-broadcasting the messages between all members. This puts a higher burden on these members, but these clients can be hosted in the cloud, and also group owners have a larger incentive to maintain group integrity. At the same time, this design is better for the rest of the group members, as they don't need to establish connections with all other members, only with a limited number of &quot;hosting&quot; members, and it also better protects their privacy, due to the lack of direct connections between most members.</p> +<p>This approach avoids the need for a group-wide key agreement protocol, as hosting members are expected to have access to all content anyway, so pair-wise ratchets are sufficient. At the same time the content remains end-to-end encrypted, and protected from the outsiders.</p> +<p>This approach also simplifies moderation - the message that needs to be removed simply won't reach the members before it is moderated (in case of automatic or policy-based moderation).</p> +<p>Discovery and content search in such groups will be provided via a dedicated discovery server that will participate in the group, provide an always-online client, and also automatic content moderation functionality - a possible approach to moderation is <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/docs/rfcs/2023-05-22-groups-moderation.md">described here</a>.</p> +<p>We really look forward to your feedback on this design.</p> +<h3 id="what-about-read-receipts" tabindex="-1">What about read receipts?</h3> +<p>We have an approximately equal number of users who ask us to add receipts, and those who ask not to add them, even as optional.</p> +<p>While read receipts provide some convenience to the message senders, they introduce a lot of stress for the recipients.</p> +<p>As one of the users in the group wrote it: &quot;The existence of read receipts in other platforms is exhausting and is often a source of undue stress. I have to make a decision to read something and let someone know that I have read something and decided not to respond or merely didn't have the time to respond. The outcome of that is a complex social negotiation with non-theoretical social fallout as a consequence. All in all, it's an invasion of privacy of being able to read things at the pace of the individual as opposed to the pace dictated by others... Most people don't need a read receipt, so leave it to a group of individuals to decide if having read receipts make sense to them for their workflow&quot;.</p> +<p>Also read <a href="https://neilalexander.dev/2021/04/09/read-receipts-typing-notifs">this post</a> about the damage from read receipts and other invasive features, like typing and presense notifications.</p> +<p>There is also no discounting that the presense of read receipts functionality, even as opt-in, creates a social pressure to enable them, with the same consequences – there are many scenarios when they become non-optional in some relationships. So many users belive, and we share this view, that it is better not to have these features at all. We will be re-assessing this view.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html + + 2023-09-25T00:00:00Z + + SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups with directory service + <h1 id="simplex-chat-v53-released-desktop-app-local-file-encryption-and-improved-groups" tabindex="-1">SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups</h1> +<p><strong>Published:</strong> September 25, 2023</p> +<p><strong>What's new in v5.3:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#multiplatform-desktop-app">new desktop app!</a>!</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#group-directory-service-and-other-group-improvements">directory service and other group improvements</a>.</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#encrypted-local-files-and-media-with-forward-secrecy">encrypted local files and media with forward secrecy</a>.</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#simplified-incognito-mode">simplified incognito mode</a>.</li> +</ul> +<p>There are a lot of other improvements and fixes in this release:</p> +<ul> +<li>improved app responsiveness and stability.</li> +<li>app memory usage is reduced by 40%.</li> +<li>new privacy settings: show last messages &amp; save draft.</li> +<li>fixes: +<ul> +<li>bug preventing group members connecting (it will only help the new connections).</li> +<li>playing videos on full screen<sup>**</sup>.</li> +<li>screen reader for messages<sup>**</sup>.</li> +<li>reduced background crashes<sup>**</sup>.</li> +</ul> +</li> +</ul> +<p>Also, we added 6 new interface languages: Arabic<sup><em></em></sup>, Bulgarian, Finnish, Hebrew<sup></sup>, Thai and Ukrainian - thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>* Android app.</p> +<p>** iOS app.</p> +<h2 id="multiplatform-desktop-app" tabindex="-1">Multiplatform desktop app</h2> +<img src="https://simplex.chat/blog/images/simplex-desktop-light.png" width="640" /> +<p>Thanks a lot to everybody who was testing the desktop app since July – it really helped to make it stable!</p> +<p>To use desktop app you need to <strong>create a new profile</strong>. As SimpleX platform has no user accounts, it's not as simple as for centralized apps to access the same profile from two devices.</p> +<p>The next app version will allow using your mobile profile from desktop app. For now, as a workaround, you can join groups from both mobile and desktop devices, and use small groups instead of direct conversations.</p> +<p>When you start the app first time, you will be offered to <strong>set database passphrase</strong> – you have to memorize it, as there is no way to recover it. If you skip it, a random passphrase will be generated and stored on your desktop device as plaintext (unencrypted) – you can change it later.</p> +<p>Other limitations of the desktop app:</p> +<ul> +<li>you cannot send voice messages.</li> +<li>there is no support for calls yet.</li> +</ul> +<p>You can download the desktop app for Linux and Mac via <a href="https://simplex.chat/downloads/index.html">downloads page</a>. Windows version will be available soon.</p> +<h2 id="group-directory-service-and-other-group-improvements" tabindex="-1">Group directory service and other group improvements</h2> +<img src="https://simplex.chat/blog/images/20230925-directory.png" width="330" class="float-to-left" /> +<p>Directory service provides a way to search for public groups submitted by the users. To use it, you need to connect to it via SimpleX Chat, as you would connect to any other contact, and type some words to search.</p> +<p>You can also create and register your group, with some limitations explained <a href="https://simplex.chat/docs/directory.html">here</a>.</p> +<p>Other group improvements in this release:</p> +<ul> +<li> +<p>you can send delivery receipts to the groups up to 20 members.</p> +</li> +<li> +<p>if the group settings allow it, you can send direct messages to group members even after you deleted the contact.</p> +</li> +<li> +<p>connections between members are made faster, and the bug that prevented the connections in some cases is fixed in this release.</p> +</li> +</ul> +<p>The next release will reduce the time it takes to send messages to the group, especially when there are many members or when you have a slow device storage.</p> +<h2 id="encrypted-local-files-and-media-with-forward-secrecy" tabindex="-1">Encrypted local files and media with forward secrecy</h2> +<img src="https://simplex.chat/blog/images/20230925-encrypted.png" width="330" class="float-to-left" /> +<p>All messages, files and media sent via SimpleX Chat were always end-to-end encrypted from the very beginning. SimpleX Chat uses double-ratchet algorithm with encrypted message headers, for the best possible meta-data protection.</p> +<p>You contacts, groups and messages are stored in the local database on your device, and this database was encrypted from <a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html">v4.0 released a year ago</a>.</p> +<p>But until this version all files and media in the app storage were not encrypted, and when you exported the chat archive, they were unencrypted there as well.</p> +<p>From v5.3 all files and media (except videos, for now) are encrypted with a random symmetric key - in many cases they are encrypted before they are written to the storage. Local file encryption can be disabled via Privacy &amp; Security settings, for example, if you need to access the files from the storage outside of the app.</p> +<p>In addition to the videos that are stored unencrypted, there are other rare scenarios when the received files may be unencrypted in this release. Files have an open or closed lock icons to indicate whether they were encrypted locally. These limitations will be addressed in the next release. In any case, all files and media are always sent end-to-end encrypted, without any exceptions.</p> +<p>The keys used to encrypt files locally are associated with the messages and stored in the encrypted database. If you delete a message with the attached file or media, the key will be irreversibly deleted as well. Even if an attacker gains access to your database passphrase later and to the copy of the encrypted file, they won't be able to decrypt the file.</p> +<p>This approach provides forward secrecy for locally stored files, unlike file encryption schemes used in some other apps when the same passphrase is used for all files.</p> +<h2 id="simplified-incognito-mode" tabindex="-1">Simplified incognito mode</h2> +<img src="https://simplex.chat/blog/images/20230925-incognito.png" width="330" class="float-to-left" /> +<p>Incognito mode was <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html">added a year ago</a> to improve anonymity of your profile, but it was confusing for some users - it was a global setting, but it only affected the new connections.</p> +<p>It is now simpler to use - you can decide whether to connect to a contact or join a group using your main profile at a point when you create an invitation link or connect via a link or QR code.</p> +<p>When you are connecting to people you know you usually want to share your main profile, and when connecting to public groups or strangers, you may prefer to use a random profile.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html + + 2023-11-25T00:00:00Z + + SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. + <h1 id="simplex-chat-v54-link-mobile-and-desktop-apps-via-quantum-resistant-protocol-and-much-better-groups" tabindex="-1">SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups.</h1> +<p><strong>Published:</strong> Nov 25, 2023</p> +<p><strong>What's new in v5.4:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol">Link mobile and desktop apps via secure quantum-resistant protocol</a>. +<ul> +<li>⚡️ Quick start - how to use it.</li> +<li>How does it work?</li> +<li>🤖 Connecting to remote CLI.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#better-groups">Better groups</a>. +<ul> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#faster-to-join-with-more-reliable-message-delivery">Faster to join and more reliable</a>.</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#new-group-features">New group features</a>: +<ul> +<li>create groups with incognito profile,</li> +<li>block group members to reduce noise,</li> +<li>prohibit files and media in a group.</li> +</ul> +</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#better-calls">Better calls</a>: faster to connect, with screen sharing on desktop.</li> +</ul> +<p>There are many <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#other-improvements">other improvements</a> and fixes in this release:</p> +<ul> +<li>profile names now allow spaces.</li> +<li>when you delete contacts, they are optionally notified.</li> +<li>previously used and your own SimpleX links are recognized by the app.</li> +<li>and more - see the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.4.0">release notes</a>.</li> +</ul> +<h2 id="link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol" tabindex="-1">Link mobile and desktop apps via secure quantum-resistant protocol</h2> +<p>This release allows to use chat profiles you have in mobile app from desktop app.</p> +<p>This is only possible when both devices are connected to the same local network. To send and receive messages mobile app has to be connected to the Internet.</p> +<h3 id="quick-start-how-to-use-it" tabindex="-1">⚡️ Quick start - how to use it</h3> +<p><strong>On desktop</strong></p> +<p>If you don't have desktop app installed yet, <a href="https://simplex.chat/downloads/index.html">download it</a> and create any chat profile - you don't need to use it, and when you create it there are no server requests sent and no accounts are created. Think about it as about user profile on your computer.</p> +<p>Then in desktop app settings choose <em>Link a mobile</em> - it will show a QR code.</p> +<p><img src="https://simplex.chat/blog/images/20231125-desktop1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop4.png" width="510" /></p> +<p><strong>On mobile</strong></p> +<p>In mobile app settings choose <em>Use from desktop</em>, scan the QR code and verify session code when it appears on both devices - it should be the same. Verifying session code confirms that the devices are connected directly via a secure encrypted connection. There is an option to verify this code on subsequent connections too, but by default it is only required once.</p> +<p><img src="https://simplex.chat/blog/images/20231125-mobile1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile1a.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile4.png" width="170" /></p> +<p>The devices are now paired, and you can continue using all mobile profiles from desktop.</p> +<p>If it is an Android app, you can move the app to background, but iOS app has to remain open. In both cases, while you are using mobile profiles from desktop, you won't be able to use mobile app.</p> +<p>The subsequent connections happen much faster - by default, the desktop app broadcasts its session address to the network, in encrypted form, and mobile app connects to it once you choose <em>Use from desktop</em> in mobile app settings.</p> +<h3 id="how-does-it-work" tabindex="-1">How does it work?</h3> +<p>The way we designed this solution avoided any security compromises, and the end-to-end encryption remained as secure as it was - it uses <a href="https://simplex.chat/docs/glossary.html#double-ratchet-algorithm">double-ratchet algorithm</a>, with <a href="https://simplex.chat/docs/glossary.html#forward-secrecy">perfect forward secrecy</a>, <a href="https://simplex.chat/docs/glossary.html#post-compromise-security">post-compromise security</a> and deniability.</p> +<p>This solution is similar to WhatsApp and WeChat. But unlike these apps, no server is involved in the connection between mobile and desktop. The connection itself uses a new SimpleX Remote Control Protocol (XRCP) based on secure TLS 1.3 and additional quantum-resistant encryption inside TLS. You can read XRCP protocol specification and threat model in <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2023-10-25-remote-control.md">this document</a>. We will soon be <a href="https://github.com/simplex-chat/simplex-chat/blob/master/docs/rfcs/2023-09-30-pq-double-ratchet.md">augmenting double ratchet</a> to be resistant to quantum computers as well.</p> +<p>The downside of this approach is that mobile device has to be connected to the same local network as desktop. But the upside is that the connection is secure, and you do not need to have a copy of all your data on desktop, which usually has lower security than mobile.</p> +<p>Please note, that the files you send, save or play from desktop app, and also images you view are automatically saved on your desktop device (encrypted by default except videos). To remove all these files you can unlink the paired mobile device from the desktop app settings – there will be an option soon allowing to remove the files without unlinking the mobile.</p> +<h3 id="connecting-to-remote-simplex-cli" tabindex="-1">🤖 Connecting to remote SimpleX CLI</h3> +<p><em>Warning</em>: this section is for technically advanced users!</p> +<p>If you run SimpleX CLI on a computer in another network - e.g., in the cloud VM or on a Raspberry Pi at home while you are at work, you can also use if from desktop via SSH tunnel. Below assumes that you have remote machine connected via SSH and CLI running there - you can use <code>tmux</code> for it to keep running when you are not connected via ssh.</p> +<p>Follow these steps to use remote CLI from desktop app:</p> +<ol> +<li>On the remote machine add the IP address of your desktop to the firewall rules, so that when CLI tries to connect to this address, it connects to <code>localhost</code> instead: <code>iptables -t nat -A OUTPUT -p all -d 192.168.1.100 -j DNAT --to-destination 127.0.0.1</code> (replace <code>192.168.1.100</code> with the actual address of your desktop, and make sure it is not needed for something else on your remote machine).</li> +<li>Also on the remote machine, run Simplex CLI with the option <code>--device-name 'SimpleX CLI'</code>, or any other name you like. You can also use the command <code>/set device name &lt;name&gt;</code> to set it for the CLI.</li> +<li>Choose <em>Link a mobile</em> in desktop app settings, note the port it shows under the QR code, and click &quot;Share link&quot;.</li> +<li>Run ssh port forwarding on desktop computer to let your remote machine connect to desktop app: <code>ssh -R 12345:127.0.0.1:12345 -N user@example.com</code> where <code>12345</code> is the port on which desktop app is listening for the connections from step 3, <code>example.com</code> is the hostname or IP address of your remote machine, and <code>user</code> is some username on remote machine. You can run port forwarding in the background by adding <code>-f</code> option.</li> +<li>On the remote machine, run CLI command <code>/connect remote ctrl &lt;link&gt;</code>, where <code>&lt;link&gt;</code> is the desktop session address copied in step 3. You should run this command within 1 minute from choosing <em>Link a mobile</em>.</li> +<li>If the connection is successful, the CLI will ask you to verify the session code (you need to copy and paste the command) with the one shown in desktop app. Once you use <code>/verify remote ctrl &lt;code&gt;</code> command, CLI can be used from desktop app.</li> +<li>To stop remote session use <code>/stop remote ctrl</code> command.</li> +</ol> +<h2 id="better-groups" tabindex="-1">Better groups</h2> +<h3 id="faster-to-join-with-more-reliable-message-delivery" tabindex="-1">Faster to join, with more reliable message delivery</h3> +<p>We improved the protocols for groups, by making joining groups much faster, and also by adding message forwarding. Previously, the problem was that until a new member connects directly with each existing group member, they did not see each other messages in the group. The problem is explained in detail in <a href="https://www.youtube.com/watch?v=7yjQFmhAftE&amp;t=1104s">this video</a> at 18:23.</p> +<p>With v5.4, the admin who added members to the group forwards messages to and from the new members until they connect to the existing members. So you should no longer miss any messages and be surprised with replies to messages you have never seen once you and new group members upgrade.</p> +<h3 id="new-group-features" tabindex="-1">New group features</h3> +<p><img src="https://simplex.chat/blog/images/20231125-group1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20231125-block.png" width="220" class="float-to-left" /></p> +<p><strong>Create groups with incognito profile</strong></p> +<p>Previously, you could only create groups with your main profile. This version allows creating groups with incognito profile directly. You will not be able to add your contacts, they can only join via group link.</p> +<p><strong>Block group members to reduce noise</strong></p> +<p>You now can block messages from group members that send too many messages, or the messages you don't won't to see. Blocked members won't know that you blocked their messages. When they send messages they will appear in the conversation as one line, showing how many messages were blocked. You can reveal them, or delete all sequential blocked messages at once.</p> +<p><strong>Prohibit files and media in a group</strong></p> +<p>Group owners now have an option to prohibit sending files and media. This can be useful if you don't won't any images shared, and only want to allow text messages.</p> +<h2 id="better-calls" tabindex="-1">Better calls</h2> +<p>Calls in SimpleX Chat still require a lot of work to become stable, but this version improved the speed of connecting calls, and they should work for more users.</p> +<p>We also added screen sharing in video calls to desktop app.</p> +<h2 id="other-improvements" tabindex="-1">Other improvements</h2> +<p>This version also has many small and large improvements to make the app more usable and reliable.</p> +<p>The new users and group profiles now allow spaces in the names, to make them more readable. To message these contacts in CLI you need to use quotes, for example, <code>@'John Doe' Hello!</code>.</p> +<p>When you delete contacts, you can notify them - to let them know they can't message you.</p> +<p>When you try to connect to the same contact or join the same group, or connect via your own link, the app will recognize it and warn you, or simply open the correct conversation.</p> +<p>You can find the full list of fixed bugs and small improvements in the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.4.0">release notes</a>.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html + + 2024-01-24T00:00:00Z + + SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. + <h1 id="simplex-chat-free-infrastructure-from-linode-v55-released-with-private-notes-group-history-and-a-simpler-ux-to-connect" tabindex="-1">SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.</h1> +<p><strong>Published:</strong> Jan 24, 2024</p> +<p><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#simplex-chat-infrastructure-on-linode">SimpleX Chat infrastructure on Linode</a>:</p> +<ul> +<li>Free infrastructure.</li> +<li>SimpleX servers in Linode Marketplace.</li> +<li>High capacity messaging servers.</li> +</ul> +<p>What's new in v5.5:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#private-notes">private notes</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#group-history">group history</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#simpler-ux-to-connect-to-other-users">simpler UX to connect to other users</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#message-delivery-stability-and-other-improvements">message delivery stability and other improvements</a></li> +</ul> +<p>Also, we added Hungarian (only Android) and Turkish interface languages, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>SimpleX Chat Android app is now available in 20 languages!</p> +<h2 id="simplex-chat-infrastructure-on-linode" tabindex="-1">SimpleX Chat infrastructure on Linode</h2> +<p>We chose Linode as our hosting provider as and they have been consistently reliable, cheaper than alternatives, with excellent support and great documentation.</p> +<p>When Linode was acquired by Akamai, we were a bit nervous about how it may affect service quality. So far it's been working out quite well.</p> +<p>As the usage of SimpleX network was growing, so did our hosting costs, and from being really small they started to become significant, particularly as we didn't yet manage to optimize the servers last year.</p> +<p>Linode helped - we're really excited to announce that Akamai decided to support SimpleX Chat growth by accepting it into their <a href="https://www.linode.com/linode-for-startups/">Linode Rise startup program</a>.</p> +<p>Thanks to this program:</p> +<ul> +<li> +<p>we received free infrastructure for the first year up to $10,000 per month, no strings attached. It already saved us some money, and gave us enough time to optimize the servers - the latest version of the servers are much less costly to operate with the current traffic, and can support a much larger traffic within this limit. In the year 2 of the program we will receive 50% discount with unlimited traffic, and in year 3 - 25% discount.</p> +</li> +<li> +<p>Linode Marketplace now includes <a href="https://www.linode.com/marketplace/apps/simplex-chat/simplex-chat/">SimpleX Chat messages and file servers</a> - you can get free $100 credits for the first 2 months and run your own servers in just a few clicks, and use them in SimpleX Chat apps. Anybody can submit their application to Linode marketplace, but dedicated support we have from Linode team via this program made it simpler.</p> +</li> +<li> +<p>Akamai solution engineers are helping us to design high capacity server solution, free of charge, so that a single host can provide horizontally scalable capacity for messaging, allowing for a much larger number of concurrent users on a single server address. Initially we considered using HAProxy, and the latest proof of concept uses OpenResty - a fork of Nginx with Lua script engine - to route requests from a single host to multiple SMP relays, reducing an overhead for the clients that would be configured with a smaller number of higher capacity servers. This project is still in progress, there will be more details as we roll it out.</p> +</li> +</ul> +<h2 id="whats-new-in-v55" tabindex="-1">What's new in v5.5</h2> +<h3 id="private-notes" tabindex="-1">Private notes</h3> +<p><img src="https://simplex.chat/blog/images/20240124-notes1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-notes2.png" width="220" class="float-to-left" /></p> +<p><em>&quot;Where do I put notes for myself?&quot;</em> was a very common support question. There was a workaround - you could create an empty group, just with yourself, and use it to save notes, but it was not very convenient, and you could accidentally add members there.</p> +<p>This version has a more convenient and private alternative - the Private notes. It looks like an ordinary conversation where you can put text messages, links with previews, and any media and files, but they are not sent anywhere - they are stored locally, only on your device, with encrypted files.</p> +<p>You can access the Private notes created in mobile app from desktop app too, by linking a mobile and desktop apps - the feature <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html">added in the previous version</a>. It allows to conveniently share files between the devices without sending them over the Internet.</p> +<h3 id="group-history" tabindex="-1">Group history</h3> +<p><img src="https://simplex.chat/blog/images/20240124-history1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-history2.png" width="220" class="float-to-left" /></p> +<p>In the previous version, when users joined groups, they only saw an empty conversation, and the notifications of being connected to other members. This version allows group admins sending recent group history to the new members - this option is enabled by default for new groups, and can be enabled for the existing groups in the preferences. So now new members can join the conversation as soon as they join.</p> +<p>This does not mean that these messages are stored on any servers - the admin member that adds a new member to the group sends these messages directly when a new member joins. Groups are still fully decentralized, do not have any identity on the network, and fully private - only their members know they exist.</p> +<p>That is, unless a group owner decides to make it public. Groups can be registered in <a href="https://simplex.chat/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">SimpleX groups directory</a> to be discovered by the new members - group directory is also improved.</p> +<h3 id="simpler-ux-to-connect-to-other-users" tabindex="-1">Simpler UX to connect to other users</h3> +<p><img src="https://simplex.chat/blog/images/20240124-connect1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-connect2.png" width="220" class="float-to-left" /></p> +<p>SimpleX platform has no user accounts or identities, and while it improves metadata privacy, it also makes it harder to understand how to connect to other people, particularly for the new users who are not invited by the existing users.</p> +<p>This version simplifies this interface by allowing to connect via the received link just by pasting the address into the search bar, as is common in many wallet apps and some other decentralized messengers. We also improved the interface of creating invitation links.</p> +<p>We will continue working on improving and simplifying user interface throughout the year. Please send us any feedback and suggestions to the team's address available in the app.</p> +<h3 id="message-delivery-stability-and-other-improvements" tabindex="-1">Message delivery stability and other improvements</h3> +<p>One of the long standing issues was that message reception could get stuck in some rare occasions, and only get resumed once the app is fully restarted. As Android app includes an always-on notification service that runs in background, full restart should be done via the app settings.</p> +<p>This version fixed many issues with message delivery stability and also added some diagnostics to identify any other cases when message delivery may stop. These fixes should also reduce battery usage, particularly on slow internet connections.</p> +<p>Other improvements in this version:</p> +<ul> +<li>you can now reveal secret messages by tapping. To send a secret message wrap in &quot;#&quot; characters, e.g. &quot;#password#&quot;.</li> +<li>you can delete the last user profile, simplifying account deletion. If you have <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html">hidden user profiles</a>, they won't be deleted in this case, and will be accessible again once you create a new profile.</li> +</ul> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html + + 2024-03-14T00:00:00Z + + SimpleX Chat v5.6 (beta): adding quantum resistance to Signal double ratchet algorithm + <h1 id="simplex-chat-v56-beta-adding-quantum-resistance-to-signal-double-ratchet-algorithm" tabindex="-1">SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm</h1> +<p><strong>Published:</strong> Mar 14, 2024</p> +<p>This is a major upgrade for SimpleX messaging protocols, we are really proud to present the results of the hard work of our whole team on the <a href="https://en.wikipedia.org/wiki/Pi_Day">Pi day</a>.</p> +<p>This post also covers various aspects of end-to-end encryption, compares different messengers, and explains why and how quantum-resistant encryption is added to SimpleX Chat:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#why-do-we-need-end-to-end-encryption">Why do we need end-to-end encryption?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#why-is-encryption-even-allowed">Why is encryption even allowed?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#end-to-end-encryption-security-attacks-and-defense">End-to-end encryption security: attacks and defense.</a> +<ol> +<li>Compromised message size - mitigated by padding messages to a fixed block size.</li> +<li>Compromised confidentiality - mitigated by repudiation (deniability).</li> +<li>Compromised message keys - mitigated by forward secrecy.</li> +<li>Compromised long-term or session - mitigated by break-in recovery.</li> +<li>Man-in-the-middle attack - mitigated by two-factor key exchange.</li> +<li>&quot;Record now, decrypt later&quot; attacks - mitigated by post-quantum cryptography.</li> +</ol> +</li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">How secure is encryption in different messengers?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#adding-quantum-resistance-to-signal-double-ratchet-algorithm">Adding quantum resistance to Signal double ratchet algorithm.</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#when-can-you-start-using-quantum-resistant-chats">When can you start using quantum resistant chats?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#next-for-post-quantum-crypto---all-direct-chats-small-groups-and-security-audit">Next for post-quantum crypto - all direct chats, small groups and security audit.</a></li> +</ul> +<h2 id="why-do-we-need-end-to-end-encryption" tabindex="-1">Why do we need end-to-end encryption?</h2> +<p>The objective of end-to-end encryption is to make any potential attackers, such as traffic observers or communication providers who pass the messages between senders and recipients, unable to recover <em>any</em> message content or meaningful information about the messages, even if these attackers possess very advanced computing and mathematical capabilities.</p> +<p>While human eyes are unable to see any difference between simply scrambled and encrypted messages, the difference between unreadable scrambling and unbreakable encryption can be as huge as just a few seconds to unscramble a message on an average laptop and more time than the Universe existed required to break the encryption on the most powerful computer in the world.</p> +<p>Achieving the latter requires a lot of mathematical precision in both the cryptographic algorithms and in how they are used, and effectively makes encrypted messages indistinguishable from random noise, without any discoverable patterns or statistical irregularities that a computer could use to break the message encryption any faster than it it would take to try every possible combination of bits in the key.</p> +<p>End-to-end encryption is an important component of our individual and business security, privacy and sovereignty. Having our private communications protected from any observers is both the natural condition and our inalienable human right.</p> +<p>It's very sad to see the same people who keep their financial affairs private to protect from financial crimes, lock their doors to protect from thieves, and curtain their windows to protect from the occasional prying eyes, when it comes to protecting their personal lives from the data criminals say &quot;we don't care about privacy, we have nothing to hide&quot;. Everybody's safety depends on keeping their affairs and relations private, not visible to a vast and ruthless data gathering machines, that abuse our data for commercial gain, without any regard to our interests or even <a href="https://nmdoj.gov/press-release/attorney-general-raul-torrez-files-lawsuit-against-meta-platforms-and-mark-zuckerberg-to-protect-children-from-sexual-abuse-and-human-trafficking/">the safety of our families and children</a>.</p> +<h2 id="why-is-encryption-even-allowed" tabindex="-1">Why is encryption even allowed?</h2> +<img src="https://simplex.chat/blog/images/20240314-djb.jpg" class="float-to-right" /> +<p>If encryption is such a powerful tool to protect our lives, it also can be used to conceal crimes, so why the governments don't consider it similar to arms, and don't heavily regulate its use?</p> +<p>Prior to 1996 the cryptography was considered munition, and its export from the United States was controlled under this category, <a href="https://cr.yp.to/export/1995/0303-eff.txt">alongside flamethrowers and B-1 bombers</a>. When <a href="https://en.wikipedia.org/wiki/Daniel_J._Bernstein">Daniel J. Bernstein</a> (DJB), then a student of Mathematics at University of California, Berkeley, wanted to publish the paper and the source code of his Snuffle encryption system, the Office of Defense Trade Controls of the Department of State (DOS) after more than a year of correspondence requested that DJB registers as the arms dealer.</p> +<p>In 1995 DJB represented by the Electronic Frontier Foundation brought a case against the DOS to overturn cryptography restrictions. The ruling in the case declared that the export control over cryptographic software and related technical data constitute <a href="https://cr.yp.to/export/1996/1206-order.txt">an impermissible infringement on speech in violation of the First Amendment</a>. This decision resulted in regulatory changes, reducing controls on encryption exports, particularly for open-source algorithms. The case continued until 2003, when it was put on hold after the commitment from the US government not to enforce any remaining regulations.</p> +<p>This case is very important for the whole industry, as to this day we can freely create and use open-source cryptography without export control restrictions. It also shows the importance of engaging with the system and challenging its views in an open dialogue, rather than either blindly complying or violating regulations.</p> +<p>DJB role for cryptography and open-source goes beyond this case – many cryptographic algorithms that are considered to be the most advanced, and many of which we use in SimpleX Chat, were designed and developed by him:</p> +<ul> +<li>Ed25519 cryptographic signature algorithm we use to authorize commands to the servers.</li> +<li>NaCL library with cryptobox and secretbox constructions that combine X25519 Diffie-Hellman key agreement with Salsa20 encryption and Poly1305 authentication. We use cryptobox to encrypt messages in two of three encryption layers and secretbox to encrypt files.</li> +<li>Streamlined NTRU Prime algorithm for quantum resistant key agreement that we used in the protocol for linking mobile app with desktop, and now added to Signal double ratchet algorithm, as explained below.</li> +</ul> +<p>Without DJB's work the world would have been in a much worse place privacy- and security-wise.</p> +<p>Daniel, we are really grateful for the work you did and continue doing. Thank you, and congratulations on the International Mathematics Day!</p> +<h2 id="end-to-end-encryption-security-attacks-and-defense" tabindex="-1">End-to-end encryption security: attacks and defense</h2> +<p>End-to-end encryption is offered by many messaging apps and protocols, but the security of different implementations are not the same. While many users know about the importance of forward secrecy - the quality of end-to-end encryption that preserves security of the encryption of the past messages, even if the keys used to encrypt some of the messages were compromised - there are many other qualities that protect from different attacks. Below there is the overview of these attacks and the properties of end-to-end encryption schemes that mitigate these attacks.</p> +<h3 id="1-compromised-message-size-mitigated-by-padding-messages-to-a-fixed-block-size" tabindex="-1">1. Compromised message size - mitigated by padding messages to a fixed block size</h3> +<p>While the content encryption is the most important, concealing the actual message size is almost as important for several reasons:</p> +<ul> +<li>attacker able to observe even approximate message sizes can use these sizes as an additional signal for machine learning to de-anonymise the users and to categorize the relationships between the users.</li> +<li>if a messenger conceals the routing of the messages to hide the transport identities (IP addresses) of senders and recipients, message sizes can be used by traffic observers to confirm the fact of communication with a much higher degree of certainty.</li> +</ul> +<p>The only effective mitigation to these attacks is to pad all messages to a fixed size. Using space-efficient schemes like Padme, or padding to encryption block size is ineffective for mitigating these attacks, as they still allow differentiating message sizes.</p> +<p>To the best of our knowledge, the only messengers other than SimpleX Chat that pad all messages to a fixed packet size are Cwtch and no longer developed <a href="https://github.com/agl/pond">Pond</a> - SimpleX design can be seen as an evolution of Pond design.</p> +<h3 id="2-compromised-confidential-messages-mitigated-by-repudiation-deniability" tabindex="-1">2. Compromised confidential messages - mitigated by repudiation (deniability)</h3> +<p>Many users are very interested in having ability to irreversibly delete sent messages from the recipients devices. But not only would this ability violate data sovereignty of device owners, it is also completely ineffective, as the recipients could simply put the device offline or use a modified client app to ignore message deletion requests. While SimpleX Chat provides such features as <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">disappearing messages</a> and the ability to <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">irreversibly delete sent messages</a> provided both parties agree to that, these are convenience features, and they cannot be considered security measures.</p> +<p>The solution to that is well known to cryptographers - it is the quality of the encryption algorithms called &quot;repudiation&quot;, sometimes also called &quot;deniability&quot;. This is the ability of the senders to plausibly deny having sent any messages, because cryptographic algorithms used to encrypt allow recipients forging these messages on their devices, so while the encryption proves authenticity of the message to the recipient, it cannot be used as a proof to any third party.</p> +<p>Putting it all in a simpler language - a sender can claim that the recipient forged messages on their device, and deny ever having sent them. The recipient will not be able to provide any cryptographic proof. This quality makes digital conversation having the same qualities as private off-the-record conversation - that's why the family of algorithms that provide these qualities are called off-the-record (OTR) encryption.</p> +<p>Repudiation is still a rather new concept - the first off-the-record algorithms were proposed in 2004 and were only offered to a wide range of users in Signal messenger. This concept is still quite badly understood by users and society, and yet to have been used as the defense in any public court cases, as legal systems evolve much slower than technology. In high profile cases repudiation can be used as an effective evidence for the defense.</p> +<p>Repudiation in messaging systems can be undermined by adding cryptographic signature to the protocol, and many messengers that use OTR encryption algorithms do exactly that, unfortunately. SimpleX Chat does not use signature in any part of client-client protocol, but the signature is currently used when authorizing sender's messages to the relays. v5.7 will improve deniability by enabling a different authorization scheme that will provide full-stack repudiation in all protocol layers.</p> +<h3 id="3-compromised-message-keys-mitigated-by-forward-secrecy" tabindex="-1">3. Compromised message keys - mitigated by forward secrecy</h3> +<p>The attacker who obtained or broke the keys used to encrypt individual messages, may try to use these keys to decrypt past or future messages. This attack is unlikely to succeed via message interception, and it is likely to require breaking into the device storage. But in any case, if the key was broken or obtained in some other way it's important that this key cannot be used to decrypt other messages - this is achieved by forward secrecy.</p> +<p>This property is well understood by the users, and most messengers that focus on privacy and security, with the exception of Session, provide forward secrecy as part of their encryption schemes design.</p> +<h3 id="4-compromised-long-term-or-session-mitigated-by-break-in-recovery" tabindex="-1">4. Compromised long-term or session - mitigated by break-in recovery</h3> +<p>This attack is much less understood by the users, and forward secrecy does not protect from it. Arguably, it's almost impossible to compromise individual message keys without compromising long-term or session keys. So the ability of the encryption to recover from break-in (attacker making a copy of the device data without retaining the ongoing access) is both very important and pragmatic - break-in attacks are simpler to execute on mobile devices during short-term device access than long-term ongoing compromise.</p> +<p>Out of all encryption algorithms known to us only <em>Signal double ratchet algorithm</em> (also referred to as <em>Signal algorithm</em> or <em>double ratchet algorithm</em>, which is not the same as Signal messaging platform and protocols) provides the ability for the encryption security to recover after break-ins attacks. This recovery happens automatically and transparently to the users, without them doing anything special or even knowing about break-in, by simply sending messages. Every time one of the communication parties replies to another party message, new random keys are generated and previously stolen keys become useless.</p> +<p>Double ratchet algorithm is used in Signal, Cwtch and SimpleX Chat. But Signal app by allowing to use the same profile on multiple devices compromises the break-in recovery function of Signal algorithm, as explained in <a href="https://eprint.iacr.org/2021/626.pdf">this paper</a>. Because of break-in recovery you cannot use SimpleX Chat profile on more than one device at the same time - the encryption scheme rotates the long term keys, randomly, and keys on another device become useless, as they would become useless for the attacker who stole them. Security always has some costs to the convenience.</p> +<h3 id="5-man-in-the-middle-attack-mitigated-by-two-factor-key-exchange" tabindex="-1">5. Man-in-the-middle attack - mitigated by two-factor key exchange</h3> +<p>Many people incorrectly believe that security of end-to-end encryption cannot be broken by communication provider. But end-to-end encryption is only as secure as key exchange. While any intermediary passing the keys between senders and recipients cannot recover the private keys from the public keys, they can simply replace the passed public keys with their own and then proxy all communication between the users having full access to the original messages. So instead of having an end-to-end encrypted channel, users would have two half-way encrypted channels - between users and their communication intermediary.</p> +<p>Pictures below illustrate how this attack works for RSA encryption.</p> +<h4 id="1-alice-sends-the-key-to-bob-eg-via-p2p-network-or-via-the-messaging-server" tabindex="-1">1) Alice sends the key to Bob (e.g. via p2p network or via the messaging server).</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm1.jpg" alt="Public key is shared" /></p> +<h4 id="2-now-bob-can-send-encrypted-messages-to-alice-he-believes-they-are-secure" tabindex="-1">2) Now Bob can send encrypted messages to Alice - he believes they are secure!</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm2.jpg" alt="Message is encrypted" /></p> +<h4 id="3-but-the-key-could-have-been-intercepted-and-substituted-by-tom-the-attacker-or-a-service-provider" tabindex="-1">3) But the key could have been intercepted and substituted by Tom (the attacker, or a service provider).</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm3.jpg" alt="Key is intercepted and replaced" /></p> +<h4 id="4-now-the-attacker-can-read-the-messages-without-alice-and-bob-knowing" tabindex="-1">4) Now the attacker can read the messages without Alice and Bob knowing.</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm4.jpg" alt="End-to-end encryption is compromised" /></p> +<p>The attack on Diffie-Hellman (or on quantum-resistant) key exchange, when both parties send their public keys (or public key and ciphertext), requires the attacker to intercept and replace both keys, but the outcome remains the same - if all communication is passed via a single channel, as it is usually the case with communication services, then any attacker that has inside access to the service can selectively compromise some of the conversations. Two years ago I wrote the post about this <a href="https://www.poberezkin.com/posts/2022-12-07-why-privacy-needs-to-be-redefined.html#e2e-encryption-is-not-bulletproof">vulnerability of end-to-end encryption to MITM attacks</a>.</p> +<p>All known mitigations of this attack require using the secondary communication channel to ensure that the keys have not been substituted. The most secure approach is to make user's key (or key fingerprint) a part of the user's address or connection link, thus making two-factor key exchange non-optional. This approach is used in Session, Cwtch and SimpleX Chat.</p> +<p>A less secure approach is to provide users an optional way to compare security codes - this is what is done by Signal, Element and many other messengers. The problem with this post-key-exchange verification is that it is optional, and is usually skipped by the majority of the users. Also, this security code can change because the user changed the device, or as a result of the attack via the service provider. When you see in the client app the notification that the security code changed, it's pointless to ask in the same messenger whether the device was changed, as if it were an attack, the attacker would simply confirm it. Instead, the security code needs to be re-validated again via another channel. A good security practice for the users would be to warn their communication partners about the intention to switch the device in advance, before the security code is changed.</p> +<h3 id="6-record-now-decrypt-later-attacks-mitigated-by-post-quantum-cryptography" tabindex="-1">6. &quot;Record now, decrypt later&quot; attacks - mitigated by post-quantum cryptography.</h3> +<p>This is the idea based on the assumption that commercially viable quantum computers will become available during the next 10 years, and then they can use time-efficient <a href="https://en.wikipedia.org/wiki/Shor%27s_algorithm">Shor's algorithm</a> developed in 1994 to break asymmetric encryption with quantum computer (symmetric encryption is not vulnerable to this algorithm).</p> +<p>Post-quantum cryptography, or encryption algorithms that are resistant to quantum computers, has been the area of ongoing research for several decades, and there are some algorithms that <em>might</em> protect from quantum computers. It's important to account for these limitations:</p> +<ul> +<li><em>none of the post-quantum algorithms are proven to be secure</em> against quantum or conventional computers. They are usually referred to as &quot;believed to be secure&quot; by the researchers and security experts. There is continuous research to break post-quantum algorithms, and to prove their security, and many of these algorithms are broken every year, often by conventional computers.</li> +<li>because of the lack of proofs or guarantees that post-quantum cryptography delivers on its promise, these algorithms can only be used in hybrid encryption schemes to augment conventional cryptography, and never to replace it, contrary to some expert recommendations, as DJB explains in this <a href="https://blog.cr.yp.to/20240102-hybrid.html">blog post</a>.</li> +<li>they are much more computationally expensive and less space efficient, and the encryption schemes have to balance their usability and security.</li> +<li>many of post-quantum algorithms have known patent claims, so any system deploying them accepts the risks of patent litigation.</li> +<li>the silver lining to these limitations is that the risk of appearance of commercially viable quantum computers in the next decade may be exaggerated.</li> +</ul> +<p>So, to say it provocatively, post-quantum cryptography can be compared with a remedy against the illness that nobody has, without any guarantee that it will work. While there is a reasonable hope that it <em>might</em> work, so it's not exactly a <em>snake oil</em>, these limitations and risks have to be much better communicated to the end users than they are.</p> +<img src="https://simplex.chat/blog/images/20240314-datacenter.jpg" width="400" class="float-to-right" /> +<p>Does it mean that post-quantum cryptography is useless and should be ignored? Absolutely not. The risks of &quot;record now, decrypt later&quot; attacks are real, particularly for high profile targets, including millions of people - journalists, whistle-blowers, freedom-fighters in oppressive regimes, and even some ordinary people who may become targets of information crimes. Large scale collection of encrypted communication data is ongoing, and this data may be used in the future. So having the solution that <em>may</em> protect you (post-quantum cryptography), as long as it doesn't replace the solution that is <em>proven</em> to protect you (conventional cryptography), is highly beneficial in any communication solution, and has already been deployed in many tools and in some messengers.</p> +<h2 id="how-secure-is-end-to-end-encryption-in-different-messengers" tabindex="-1">How secure is end-to-end encryption in different messengers?</h2> +<p>This comparison may be incorrect in some of the columns. We apologize if some of the points are incorrect, please let us know about any mistakes so we can amend them!</p> +<p>The main objective here is to establish the framework for comparing the security of end-to-end encryption schemes, and to highlight any areas for improvement, not to criticize any implementations.</p> +<p><img src="https://simplex.chat/blog/images/20240314-comparison.jpg" alt="Messengers comparison" /></p> +<p><sup>1</sup> Repudiation in SimpleX Chat will include client-server protocol from v5.7 or v5.8. Currently it is implemented but not enabled yet, as its support requires releasing the relay protocol that breaks backward compatibility.</p> +<p><sup>2</sup> Post-quantum cryptography is available in beta version, as opt-in only for direct conversations. See below how it will be rolled-out further.</p> +<p>Some columns are marked with a yellow checkmark:</p> +<ul> +<li>when messages are padded, but not to a fixed size (Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes).</li> +<li>when repudiation does not include client-server connection. In case of Cwtch it appears that the presence of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.</li> +<li>when 2-factor key exchange is optional (via security code verification).</li> +<li>when post-quantum cryptography is only added to the initial key agreement and does not protect break-in recovery.</li> +</ul> +<h2 id="adding-quantum-resistance-to-signal-double-ratchet-algorithm" tabindex="-1">Adding quantum resistance to Signal double ratchet algorithm</h2> +<p>We have been exploring post-quantum cryptography since early 2022, when SimpleX Chat was first released, and we did not want to be pioneers here - cryptography is critically important to make it right.</p> +<p>We hoped to adopt the algorithm that will be standardized by NIST, but the standardization process turned out to be hugely disappointing, and the ML-KEM (Kyber) algorithm that was accepted as a standard was modified to remove an important hashing step (see the lines 304-314 in <a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf">the published spec</a>)), that mitigates the attacks via a compromised random numbers generator, ignoring strong criticism from many expert cryptographers, including DJB (see <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/WFRDl8DqYQ4">this discussion</a> and <a href="https://csrc.nist.gov/files/pubs/fips/203/ipd/docs/fips-203-initial-public-comments-2023.pdf">the comments NIST received</a>). To make it even worse, the calculation of security levels of Kyber appears to have been done incorrectly, and overall, the chosen Kyber seems worse than rejected NTRU according to <a href="https://blog.cr.yp.to/20231003-countcorrectly.html">the analysis by DJB</a>.</p> +<p>We also analyzed the encryption schemes proposed in Tutanota in 2021, and another scheme adopted by Signal last year, and published the design of <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2023-09-30-pq-double-ratchet.md">quantum resistant double ratchet algorithm</a> that we believe provides better security than these schemes:</p> +<ul> +<li>unlike Tutanota design, it augments rather than replaces conventional cryptography, and also avoids using signatures when the new keys are agreed (ratchet steps).</li> +<li>unlike other messengers that adopted or plan to adopt ML-KEM, we used Streamlined NTRU Prime algorithm (specifically, strnup761) that has no problems of ML-KEM, no known patent claims, and seems less likely to be compromised than other algorithms - it is exactly the same algorithm that is used in SSH. You can review the comparison of <a href="https://ntruprime.cr.yp.to/warnings.html">the risks of various post-quantum algorithms</a>.</li> +<li>unlike Signal design that only added quantum resistance to the initial key exchange by replacing X3DH key agreement scheme with post-quantum <a href="https://signal.org/docs/specifications/pqxdh/">PQXDH</a>, but did not improve Signal algorithm itself, our design added quantum-resistant key agreements inside double algorithm, making its break-in recovery property also quantum resistant.</li> +</ul> +<p>The we could make break-in recovery property of Signal algorithm quantum-resistant, and why, probably, Signal didn't, is because irrespective of the message size SimpleX Chat uses a fixed block size of 16kb to provide security and privacy against any traffic observers and against messaging relays. So we had an extra space to accommodate additional ~2.2kb worth of keys in each message without any additional traffic costs.</p> +<p>In case when the message is larger than the remaining block size, e.g. when the message contains image or link preview, or a large text, we used <a href="https://en.wikipedia.org/wiki/Zstd">zstd compression</a> to provide additional space for the required keys without reducing image preview quality or creating additional traffic - our previously inefficient JSON encoding of chat messages was helpful in this case.</p> +<image src="./images/20240314-kem.jpg" alt="Double KEM agreement" width="500" class="float-to-right"> +<p>The additional challenge in adding sntrup761 was that unlike Diffie-Hellman key exchange, which is symmetric (that is, the parties can share their public keys in any order and the shared secret can be computed from two public keys), sntrup761 is interactive key-encapsulation mechanism (KEM) that requires that one party shares its public key, and another party uses it to encapsulate (which is a fancy term for &quot;encrypt&quot; - that is why it has asterisks in the image) a random shared secret, and sends it back - making it somewhat similar to RSA cryptography. But this asymmetric design does not fit the symmetric operation of Signal double ratchet algorithm, where both sides need to generate random public keys and to compute new shared secrets every time messaging direction changes for them. So to achieve that symmetry we had to use two KEM key agreements running in parallel, in a lock-step fashion, as shown on the diagram. In this case both parties generate random public keys and also use the public key of another party to encapsulate the random shared secret. Effectively, this design adds a double quantum-resistant key agreement to double ratchet algorithm steps that provide break-in recovery.</p> +<h2 id="when-can-you-start-using-quantum-resistant-chats" tabindex="-1">When can you start using quantum resistant chats?</h2> +<p><img src="https://simplex.chat/blog/images/20240314-pq1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq3.png" width="288" /></p> +<p>Quantum resistant double ratchet algorithm is already available in v5.6 (beta) of SimpleX Chat as an optional feature that can be enabled for the new and, separately, for the existing direct conversations.</p> +<p>The reason it is released as opt-in is because once the conversation is upgraded to be quantum resistant, it will no longer work in the previous version of the app, and we see this ability to downgrade the app if something is not working correctly as very important for the users who use the app for critical communications.</p> +<p><strong>To enable quantum resistance for the new conversations</strong>:</p> +<ul> +<li>open the app settings (tap user avatar in the top left corner).</li> +<li>scroll down to <em>Developer tools</em> and open them.</li> +<li>enable <em>Show developer options</em> toggle.</li> +<li>now you will see <em>Post-quantum E2EE</em> toggle - enable it as well.</li> +</ul> +<p>Now all new contacts you add to the app will use quantum resistant double ratchet algorithm.</p> +<p>Once you have enabled it for the new contacts, you can also <strong>enable it for some of the existing contacts</strong>:</p> +<ul> +<li>open the chat with the contact you want to upgrade to be quantum resistant.</li> +<li>tap contact name above the chat.</li> +<li>tap Allow PQ encryption.</li> +<li>exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.</li> +</ul> +<h2 id="next-for-post-quantum-crypto-all-direct-chats-small-groups-and-security-audit" tabindex="-1">Next for post-quantum crypto - all direct chats, small groups and security audit</h2> +<p>We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.</p> +<p>We will also be adding quantum resistance to small groups up to 10-20 members. Computing cryptographic keys is much slower, in comparison, and it would be very inefficient (and completely unnecessary) for large public groups.</p> +<p>We have also arranged a 3rd party cryptographic review of our protocol and encryption schemes design for June/July 2024 - it will cover the additions to SimpleX protocols since <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the previous security audit</a> in November 2022, including <a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html">XFTP protocol</a> we use for file transfers and quantum resistant Signal double ratchet algorithm we just released in this beta version.</p> +<p>In November 2024 we will be conducting further implementation audit, with double the scope of our 2022 audit.</p> +<p>Security audits are very expensive, as they require employing exceptionally competent engineers and cryptographers, and it does stretch our budgets - so any donations to help us cover the costs would be hugely helpful.</p> +<p>That's it for now!</p> +<p>Thank you for helping us improve the app, and look forward to your feedback.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +</image> + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html + + 2024-03-23T00:00:00Z + + SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration + <h1 id="simplex-network-real-privacy-and-stable-profits-non-profits-for-protocols-v56-released-with-quantum-resistant-e2e-encryption-and-simple-profile-migration" tabindex="-1">SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration</h1> +<p><strong>Published:</strong> Mar 23, 2024</p> +<p>SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#community-and-business-interests-are-aligned">community and business interests are aligned</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#the-journey-to-the-decentralized-non-profit-protocol-governance">the journey to the decentralized non-profit protocol governance</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#welcome-esraa">welcome, Esra’a</a>!</li> +</ul> +<p>What's new in v5.6:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#quantum-resistant-end-to-end-encryption-beta">quantum resistant end-to-end encryption</a> (BETA) – enable it for the new contacts.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#use-the-app-during-the-audio-and-video-calls">use the app during the audio and video calls</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#migrate-all-app-data-to-another-device-via-qr-code">migrate all app data to another device via QR code</a>.</li> +</ul> +<p>There are many other improvements and fixes in this release:</p> +<ul> +<li>group admins can block a member for all other members.</li> +<li>filtering chats no longer includes muted chats with unread messages.</li> +<li>and more - see the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.6.0">release notes</a>.</li> +</ul> +<h2 id="simplex-network-deliver-real-privacy-via-a-profitable-business-and-non-profit-protocol-governance" tabindex="-1">SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance</h2> +<h3 id="community-and-business-interests-are-aligned" tabindex="-1">Community and business interests are aligned</h3> +<p>Some people in our users' community believe that there is a conflict between the business and the community interests. This view fails to see a bigger picture of how these interests are aligned. I wrote a blog post about it <a href="https://www.poberezkin.com/posts/2023-10-31-why-privacy-impossible-without-venture-funding.html">here</a>. Our goal is to grow the network and the ecosystem while enriching all stakeholders involved, both the community and the business shareholders. This strategy relies on the strengths and opportunities of both the business and the decentralized network we build, with its vibrant community of individuals and organizations. It positions the business not as a controller but as a supporter of the community growth, resilience and sustainability.</p> +<p>By leveraging access to investment resources, its ability to provide stock-based incentives beyond salaries, operating as a business will satisfy users' and community needs more effectively, ensuring the long-term viability and growth of the network, while remaining true to the mission. A purely nonprofit model with no avenue to sustain this growth is simply not possible. Sustainability requires profits, that is simply spending less than earning, as every responsible individual and organization should aim for, and these profits must be based on users' payments, and not on some other sources of revenue or funds. And building the software product that customers are willing to pay for requires substantial business investments. We will accomplish it while maintaining transparency and the commitment to keep SimpleX network and its protocols open and free to use.</p> +<h3 id="the-journey-to-the-decentralized-non-profit-protocol-governance" tabindex="-1">The journey to the decentralized non-profit protocol governance</h3> +<p>At the current early stage of network growth the protocols will benefit most from the rapid evolution and centralized design. Many protocols that decentralized their evolution too early failed to evolve and to adapt to the product requirements of the majority of users, causing them to stall in growth. Even the open web became possible only thanks to Netscape, a venture funded company, that developed browsers and web server software taking it upon themselves to rapidly evolve web specification to make it into a robust application platform as we now know it. It is very unlikely that it would have happened if it was managed by a nonprofit or community, in a decentralized way.</p> +<p>Once SimpleX network protocols stabilize and reach the required maturity, we plan to transition its governance to several new nonprofit entities, ensuring its continued evolution aligns more closely with our vision of community-driven, independent and transparent governance. We and our investors believe that this is a win-win strategy. It both maximizes the business value, by creating a product built on protecting privacy and users' trust - a model that we see as the only viable path forward. It also maximizes the value created for the user community.</p> +<h3 id="welcome-esraa" tabindex="-1">Welcome, Esra’a!</h3> +<p>To help us deliver these goals, Esra’a Al Shafei joined SimpleX Chat team - we are excited to welcome her!</p> +<p>Esra'a is a longtime privacy and human rights advocate from Bahrain. She is the founder of <a href="http://majal.org/">Majal.org</a>, a network of platforms that amplify under-reported and marginalized voices in the Middle East and North Africa. She is also the co-founder of the <a href="https://numun.fund/">Numun Fund</a>, the first dedicated fund for women-led tech in the Global South. Esra’a is currently the Vice Chair of the Board at the <a href="https://wikimediafoundation.org/">Wikimedia Foundation</a>, the nonprofit which hosts Wikipedia. She is also on the Board of the <a href="https://www.torproject.org/">Tor Project</a>, developers of one of the world’s strongest tools for privacy and freedom online. Previously, she served on the Board of <a href="https://www.accessnow.org/">Access Now</a>, an international nonprofit dedicated to an open and free Internet.</p> +<p>In her own words: <em>&quot;Privacy and security have been the center of my work as a human rights advocate for the last 20 years in one of the most surveilled countries in the world where staying safe remains a burden. Our privacy is our dignity. It is something that belongs to us and something we should treasure - as people, as companies, as governments. Despite messaging being the most intimate aspect of our digital lives, the leading protocols in this space are centralized and we deserve a web that operates on the core principles of genuine privacy and security in a fully decentralized framework. SimpleX network will play a critical role towards that vision.&quot;</em></p> +<p>Executing the plan towards decentralized nonprofit protocol governance will be Esra’a’s primary responsibility. Our primary objective with this plan is to ensure that no single entity can control or have unrestricted ownership of the protocols, so it can maintain its integrity.</p> +<h2 id="whats-new-in-v56" tabindex="-1">What's new in v5.6</h2> +<h3 id="quantum-resistant-end-to-end-encryption-beta" tabindex="-1">Quantum resistant end-to-end encryption (BETA)</h3> +<p>Adding post-quantum resistance to the double ratchet end-to-end encryption algorithm in SimpleX Chat is a major upgrade to messaging protocols, and it creates the security against the future quantum computers.</p> +<p>I wrote in detail in the previous post about various properties of end-to-end encryption and how exactly quantum resistance is implemented in SimpleX Chat - currently SimpleX Chat has <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">the most secure end-to-end encryption design</a> against the present and future attacks.</p> +<p>We plan to perform a security audit of this design and implementation later this year.</p> +<p>Post-quantum encryption is currently added as opt-in and has to be separately enabled to be active for the new contacts, and, additionally, can be enabled for the existing contacts.</p> +<p><img src="https://simplex.chat/blog/images/20240314-pq1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq3.png" width="288" /></p> +<p><strong>To enable quantum resistance for the new conversations</strong>:</p> +<ul> +<li>open the app settings (tap user avatar in the top left corner).</li> +<li>scroll down to <em>Developer tools</em> and open them.</li> +<li>enable <em>Show developer options</em> toggle.</li> +<li>now you will see <em>Post-quantum E2EE</em> toggle - enable it as well.</li> +</ul> +<p>Now all new contacts you add to the app will use quantum resistant Signal double ratchet algorithm.</p> +<p>Once you have enabled it for the new contacts, you can also <strong>enable it for some of the existing contacts</strong>:</p> +<ul> +<li>open the chat with the contact you want to upgrade to be quantum resistant.</li> +<li>tap contact name above the chat.</li> +<li>tap Allow PQ encryption.</li> +<li>exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.</li> +</ul> +<p>We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.</p> +<h3 id="use-the-app-during-the-audio-and-video-calls" tabindex="-1">Use the app during the audio and video calls</h3> +<p><img src="https://simplex.chat/blog/images/20240323-call1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240323-call2.png" width="220" class="float-to-left" /></p> +<p>Since we added the audio and video calls in 2022 a lot of work was done to improve the stability of calls. One of the usability downsides until this release was that it was impossible to use the app during the call.</p> +<p>This version solved this problem - now you can return back to the app without interrupting the call and use any of the app functions - for example, you can send the messages or files to the person you are in the call with. If this is a video call, you will continue seeing your contact in a small picture-in-picture view.</p> +<h3 id="migrate-all-app-data-to-another-device-via-qr-code" tabindex="-1">Migrate all app data to another device via QR code</h3> +<p>We always believed that cross-platform data portability is very important for any software. Users own their data, and they should have a way to export it from any software they use. So from the version of SimpleX Chat <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#database-export-and-import">released in July 2022</a> it was possible to export the database as a self-contained file, including all contacts, messages and files, and import it on a new device.</p> +<p><em>&quot;How can I migrate my data to another device?&quot;</em> was one of the most frequent user questions, but until this release this process was <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html">quite complex</a>, requiring too many steps, and most non-technical users were not willing to try it, as even though it was reliable, it appeared risky.</p> +<p>This release made the app data migration very simple, see the steps below.</p> +<p><strong>Start the migration on the source device</strong></p> +<p><img src="https://simplex.chat/blog/images/20240323-migrate-from1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from4.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from5.png" width="170" /></p> +<p>On the device you migrate your app data from, follow these steps:</p> +<ul> +<li>choose <em>Migrate to another device</em>,</li> +<li>if necessary, set the database passphrase (initially, the database is encrypted with a random passphrase), or, if it's already set, verify it - for security and to ensure that the archive will be usable on the new device,</li> +<li>tap <em>Archive and upload</em> to and upload the app data in chunks to the XFTP servers configured in the app,</li> +<li>the app will show the QR code that should be scanned from the new device.</li> +</ul> +<p><strong>Migrate data to the target device</strong></p> +<p><img src="https://simplex.chat/blog/images/20240323-migrate-to1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to4.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to5.png" width="170" /></p> +<p>On the device you migrate your data to, follow these steps:</p> +<ul> +<li>on the first app page choose <em>Migrate from another device</em>,</li> +<li>scan the QR code shown on the source device,</li> +<li>once the archive downloads, enter the database passphrase and tap <em>Open chat</em>,</li> +</ul> +<p><strong>Finalize migration on the source device</strong></p> +<img src="https://simplex.chat/blog/images/20240323-migrate-from6.png" width="170" class="float-to-left" /> +<p>When the chat starts on the target device, make sure to tap <em>Finalize migration</em> and then <em>Delete database</em> on the source device.</p> +<p>The database cannot be used on two devices at the same time, doing so would make it impossible to decrypt the received messages. This is a security measure - the break-in recovery property of double ratchet algorithm.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html + + 2024-04-04T00:00:00Z + + Why I joined SimpleX Chat - by Esra'a al Shafei + <h1 id="why-i-joined-simplex-chat" tabindex="-1">Why I joined SimpleX Chat</h1> +<p><strong>Published:</strong> Apr 4, 2024</p> +<p><em>By <a href="https://mastodon.social/@alshafei">Esra'a al Shafei</a></em></p> +<p>Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, my decision to join SimpleX Chat may come as a surprise to some. But, as I step into this new chapter, I want to share the insights and convictions that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.</p> +<p>The nonprofit world has been my primary focus for decades. My team and I ran the platforms at <a href="http://majal.org/">Majal.org</a> with an extremely limited budget. We had to navigate many complexities and challenges that shadow the nonprofit model. And because we worked primarily in creating applications and tools, a recurring theme has been financial sustainability. Being a Bahrain-based entity for most of these years meant that the many communities we served were not in a position to provide contributions and we were not eligible for most foundation grants. This drastically limited our growth and the reliability of our apps. When we failed to raise sufficient funds or meet our target budgets, we often had to shutter certain applications, sometimes after spending more than 10 years building them.</p> +<p>With secure and private messaging, the stakes are even graver. Any failure to commit and resource/fund ongoing development, security patches, etc means lives can be at risk. I still believe in nonprofit models, and it’s why I continue to serve them through various volunteer roles. I do also believe that there is room for a mixture of models that, in the case of something as unique as SimpleX Chat, can serve as a fully open and transparent public interest technology while also having a profitable values-aligned company that can keep the lights on to continue developing, expanding, and improving the protocol, network and their reach.</p> +<p>I’m no stranger to writing about some VC models being <a href="https://mastodon.social/@alshafei/112125959080515656">corrupt</a>. Frankly, I also hold the view that some tech VCs are amongst the <a href="https://responsiblestatecraft.org/defense-tech/">most complicit</a> in egregious war crimes worldwide, or enabling the <a href="https://mastodon.social/@alshafei/112140566088322925">intrusive surveillance</a> we’re fighting against. So being part of a VC-funded venture is not a decision I take lightly. However, I have been following SimpleX Chat’s growth since early 2022 when I first met Evgeny at the Mozilla Festival. I appreciated the drive and Evgeny’s firm refusal to settle for the current models of private messaging. We share the belief that messaging is something we need to keep improving and that we must continue pushing its boundaries to make it even more private, secure, usable for groups, and, most importantly - fully decentralized. This is a major undertaking, and it requires funding to achieve. Candidly, I did worry about funding and sustainability because, at the time, SimpleX was still primarily funded by user contributions.</p> +<p>But even knowing this, I scrutinized SimpleX Chat for taking VC funding ($350K) from Village Global and questioned the individuals featured on its frontpage. I had to speak with Evgeny directly to learn who exactly from this fund was involved, how much power they wielded, if any, and if this changes the ethos of the company - all of which he is already making public. It was only after these discussions that I was comfortable to take a leap of faith and continue to use the app and vouch for its current and future offerings. It required me to question my own views on whether a VC-funded company can actually have major positive contributions to privacy as well as the open ecosystem.</p> +<img src="https://simplex.chat/blog/images/20240404-messsaging-apps.png" class="float-to-right" width="50%" /> +<p>The web has a long history of <a href="https://www.engadget.com/from-its-start-gmail-conditioned-us-to-trade-privacy-for-free-services-120009741.html">trading privacy</a> for “free” services. Traditionally, these services have also been centralized, closed-source, non-transparent, and profit-oriented. The companies behind these apps and services became prolific because of their disregard of privacy rights, which normalized lucrative surveillance capitalism. There is such an extensive global monopoly that in Africa, only 1 of the 5 biggest messaging apps in Africa isn't owned by Meta, notoriously known for spying not just through its own apps but even through <a href="https://qz.com/project-ghostbusters-facebook-meta-wiretap-snapchat-1851366814">its competitors</a>, – relentless, massive data harvesting that stretches far beyond its own walled gardens:</p> +<p>Some of the world’s top engineers often go to these companies because of the benefits and financial opportunities. We can question their ethics all day long, but we also need to question if the web would look significantly different if there were as many opportunities at privacy-first companies with purpose and strong, proven moral boundaries, set up in a way that can guarantee operational independence from any shareholders and VCs.</p> +<p>SimpleX could have taken the route of other companies in the privacy space, whether it’s Skiff which rushed to take a large amount of <a href="https://techcrunch.com/2022/03/30/skiff-series-a-encrypted-workspaces/">VC money</a> only to <a href="https://www.techradar.com/computing/cyber-security/skiff-gets-bought-by-notion-raising-privacy-concerns">shutter its doors</a> after an acquisition, leaving its users hanging with many unanswered questions, or giving up control of the company, which would puts its future solely in the hands of VCs with majority ownership. SimpleX aims to prevent this, and in fact has left money on the table to ensure that it does not occur. Had it not been for this information, I would not have joined, and I would have remained a user of the product, albeit a very cautious one, constantly wondering whether it will be sold or corrupted.</p> +<p>It’s worth noting that some private foundations operate on the VC model in supporting nonprofits, either by requiring Board seats or requesting that their funding be used towards very specific objectives not always in alignment with the organization’s values and mission. It’s also worth noting that <a href="https://www.engadget.com/2019-05-31-sex-lies-and-surveillance-fosta-privacy.html">some nonprofits</a> actually operate on the models of surveillance and censorship. Therefore, whether an organization or company is VC-backed or a nonprofit should not be the sole factor in deciding whether or not it is trustworthy. Actions are important, with full transparency being one of the most critical factors, and being fully open source being another to attract valid criticisms and audits to ensure any product or protocol lives up to its privacy and security promise. SimpleX Chat prides itself on being both transparent and open, on top of also being fully decentralized. If you’re new to it and eager to know more, you can start with <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md">this overview</a>.</p> +<p>Another important consideration is that the SimpleX network does have a plan that would rely on users' payments for specific or tailored services, and not on some other sources of revenue or funds (ads, etc.). Building anything that users would be willing to pay for requires substantially more time and resources, hence the VC route to establish a business model that doesn’t translate to the user being the product. But any business services need to be separate from SimpleX as a public interest technology. As outlined in this <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html">recent post</a>, I’ll be using my background in nonprofit governance structures to ensure that the SimpleX network protocols evolve under the stewardship of nonprofit entities in various jurisdictions, so that its continued evolution aligns more closely with the vision of community-driven, independent and decentralized governance. This would help create a necessary balance between different structures, in the same way many tech nonprofits also have for-profit subsidiaries to attract fee-for-service agreements to sustain their operations.</p> +<p>In summary: My decision to join Simplex Chat, despite my deep-rooted beliefs and skepticism towards VC funding, reflects a broader realization: that the fight for privacy, security, and decentralization in today’s web is multifaceted and sometimes requires us to depart from our comfort zones to explore sustainable paths for continuous growth and impact so that open source privacy tools and protocols are no longer “niche”, but universally accessible standards. As long as nothing in this journey compromises our moral principles and integrity, this will remain a very worthwhile goal to pursue.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html + + 2024-04-16T00:00:00Z + + The dangers of metadata in messengers + <h1 id="the-dangers-of-metadata-in-messengers" tabindex="-1">The dangers of metadata in messengers</h1> +<p><strong>Published:</strong> Apr 16, 2024</p> +<p><em>By <a href="https://mastodon.social/@alshafei">Esra'a al Shafei</a></em></p> +<p>In many countries around the world, phone numbers are attached to biometrics data and personal IDs. Telecommunications companies are either government owned or are heavily regulated, privately owned monopolies who comply with most government requests for backdoors or user data. The idea that today, we still need to give out our phone numbers as primary identifiers to be able to use the leading messaging apps should be frowned upon and actively challenged. It’s necessary to advocate for private alternatives in messaging that do not rely on user IDs of any kind - and yes, it’s possible.</p> +<p>Messaging is still not where it needs to be. Privacy is confused with security, when both are not synonymous, and there are major gaps in helping users understand the fundamental differences.</p> +<img src="https://simplex.chat/blog/images/20240416-whatsapp.jpg" class="float-to-right" width="38%" /> +<p>For example, while WhatsApp messages are <a href="https://faq.whatsapp.com/820124435853543">end-to-end encrypted</a>, let’s consider what you give up when you use it, per its own listings in app stores:</p> +<ul> +<li>App activity (app interactions, in-app search history, and other user-generated content)</li> +<li>Location</li> +<li>Financial information (user payment info and payment history)</li> +<li>Contacts and their phone numbers</li> +<li>Groups you’re a member of</li> +<li>When you use the app and how often you use it</li> +<li>Device and other IDs</li> +<li>Personal info (email address, user IDs, phone number)</li> +</ul> +<p>This is called <a href="https://en.wikipedia.org/wiki/Metadata">metadata</a>. It reveals a wealth of information about you and your connections, and in the hands of a centralized monopoly, this can and does get misused in incredibly dangerous ways. Once such metadata is logged, it can create very detailed profiles about who you are, everywhere you’ve been, and everyone you’ve ever spoken to. In settling for apps that normalize this while giving you the illusion of privacy in their marketing, we are doing ourselves a disservice by accepting this as the default. Collectively, we aren’t doing enough to protect ourselves and our social graph from this invasive overreach.</p> +<p>When stored, aggregated and analyzed, this metadata provides ample information that could potentially incriminate someone or be submitted to authorities. When WhatsApp and Facebook Messenger enabled end-to-end encryption for messages, of course it was a welcome and widely celebrated change. But it’s important to remember that not all end-to-end encryption utilizes the same standards, <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">some implementations are more secure</a> than others, so it’s something that shouldn’t necessarily be accepted at face value. More importantly: collecting and storing an obscene amount of metadata should invite global scrutiny, considering this data is often combined with whatever other information companies like Meta harvest about your identity (which is <a href="https://www.vox.com/recode/23172691/meta-tracking-privacy-hospitals">a lot</a>.)</p> +<img src="https://simplex.chat/blog/images/20240416-metadata.png" class="float-to-right" width="38%" /> +<p>This is one of the many reasons why we need to resist giving out our phone numbers just to access an app, especially to do something as personal and intimate as private messaging. Even though users can sometimes mask their numbers with a username, their identity on the app is still fundamentally tied to their phone number. App operators have access to this, as well as user contacts. Additionally, with a simple modification to the app's source code, the contacts may also gain access in some cases. This should raise more concerns about privacy, and it makes the need for anonymity difficult to achieve.</p> +<p>Everyone has a different threat model (and if you don’t yet, now is a good time to <a href="https://www.privacyguides.org/en/basics/threat-modeling/#creating-your-threat-model">create one</a>). For many users today, WhatsApp and other apps may be sufficient for their specific needs, especially in connecting with families and friends who are already on the app and unlikely to migrate elsewhere. If that suits your life and needs, and if you’re aware and consciously accept the risks, great.</p> +<p>But we also need to acknowledge that the world is becoming increasingly dangerous in the way AI is being used to <a href="https://www.forbes.com/sites/forbestechcouncil/2024/02/02/artificial-intelligence-the-new-eyes-of-surveillance/?sh=cd57bc214f27">supercharge surveillance</a>, and we need to be educated and aware of the risks this is already having on our lives and what it subjects others in your network to when you choose metadata-heavy apps as your primary form of communication. Having alternatives will always be important, even if it’s not what you default to for everyday messaging. Recognize who in your social circles might require the extra privacy, anonymity and security, so that you can play a role in protecting vulnerable individuals who need it most. The messaging app you choose implicates others as well, not just yourself, and while you personally may not require complete privacy, others might have their lives depend on it.</p> +<p>End-to-end encryption is a solid start, but it's just the beginning of our pursuit for true privacy and security. True privacy means that even when legal demands come knocking, there's no useful metadata to hand over. It's not enough to just protect the content of messages; we need consistent innovation in protecting metadata too.</p> +<p>Changing ingrained habits is tough, but your privacy is always worth the fight. Although giants like WhatsApp and Telegram may dominate global messaging for now, increasing concerns about data harvesting and AI-driven surveillance are fueling demand for alternatives. SimpleX Chat aims to be one of those strong alternatives, hence its radical focus on a decentralized framework with no user identifiers (in other words, nothing that uniquely identifies users on the protocol level to their contacts or to the relays) and extra optionality (self-hosting an <a href="https://simplex.chat/docs/server.html">SMP server</a> or <a href="https://simplex.chat/docs/xftp-server.html">XFTP server</a>, access via Tor, <a href="https://simplex.chat/docs/guide/chat-profiles.html">chat profiles</a> with incognito mode, etc.)</p> +<p>As of today, most messaging alternatives, including SimpleX, will have some limitations. But with the limited resources we have, we are committed to daily progress towards creating a truly private messenger that anyone can use while maintaining the features that users have come to know and love in messaging interfaces. We want to be the prime example of a messenger that achieves genuine privacy without compromising it for convenience. We need to be able to reliably move away from small and niche use cases to endorsing and enforcing global standards for privacy and making it accessible for all users regardless of their technical expertise.</p> +<p>We’re grateful for the users and <a href="https://github.com/simplex-chat/simplex-chat#help-us-with-donations">donors</a> who have been following along on this journey thus far and helping with feedback, anything from bug reports to identifying potential risks. Building in the open has always been a necessity for transparency and ongoing <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">auditability</a>, because we don’t want anyone to just take our word for it. <a href="https://github.com/simplex-chat">See for yourself</a> and engage in the discussions. We fully expect you to hold us accountable to our word.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html + + 2024-04-26T00:00:00Z + + SimpleX network: legally binding transparency, v5.7 released with better calls and messages + <h1 id="simplex-network-legally-binding-transparency-v57-released-with-better-calls-and-messages" tabindex="-1">SimpleX network: legally binding transparency, v5.7 released with better calls and messages</h1> +<p><strong>Published:</strong> Apr 26, 2024</p> +<p>What's new in v5.7:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#quantum-resistant-end-to-end-encryption">quantum resistant end-to-end encryption</a> with all contacts.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#forward-and-save-messages">forward and save messages</a> without revealing the source.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#in-call-sounds-and-switching-sound-sources">in-call sounds and switching sound sources</a>.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#network-management">better network connection management</a>.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#customizable-shape-of-profile-images">customizable profile images</a></li> +</ul> +<p>Also, we added Lithuanian interface language to the Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<h2 id="legally-binding-transparency" tabindex="-1">Legally binding transparency</h2> +<p>We are committed to open-source, privacy and security. Here are the recent changes we made:</p> +<ul> +<li>We now have a <a href="https://simplex.chat/transparency/index.html">Transparency Reports</a> page.</li> +<li>We updated our <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/PRIVACY.md">Privacy Policy</a> to remove undefined terms &quot;impermissible&quot; and &quot;acceptable&quot;, which would allow us to remove anything we don't like, without any clarity on what that is. You can see the edits <a href="https://github.com/simplex-chat/simplex-chat/pull/4076/files">here</a>.</li> +<li>We published a new page with <a href="https://simplex.chat/faq/index.html">Frequently Asked Questions</a>, thanks to the guidance from users.</li> +<li>We also have a new <a href="https://simplex.chat/security/index.html">Security Policy</a> – we welcome your feedback on it.</li> +</ul> +<p>What do we mean by “legally binding transparency?”. It includes these principles:</p> +<ul> +<li>Accountability: an empty promise or commitment to transparency that is not legally binding is just marketing, and can provide opportunities for the organizations to be misleading or not disclose important information that can affect their users privacy and security.</li> +<li>Consistency: often, there's a disconnect between marketing claims and legally binding policies. Our approach is to ensure that promises made in marketing materials or any external communications align with our legally binding documents, so that users can rely on our promises, and know exactly what to expect from us.</li> +</ul> +<p>For example:</p> +<ul> +<li>we use open-source code, and we made a legally binding commitment to use the published code in all released apps and deployed preset servers.</li> +<li>we use precise and technical language in the Privacy Policy defining what data and metadata can be accessed via the preset relays.</li> +</ul> +<p>If you see any inconsistency between technical parameters of SimpleX Network and what is promised in our Privacy Policy please raise it with us.</p> +<h2 id="whats-new-in-v57" tabindex="-1">What's new in v5.7</h2> +<p>This release focus is improving the app usability, and preparing the foundation for v5.8 that will provide an in-built protection of user IP addresses when connecting to unknown file and messaging servers, reducing the need to use Tor (which would still remain supported via SOCKS proxy, for additional privacy).</p> +<h3 id="quantum-resistant-end-to-end-encryption" tabindex="-1">Quantum resistant end-to-end encryption</h3> +<img src="https://simplex.chat/blog/images/20240426-pq.png" width="288" class="float-right" /> +<p>We <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html">wrote before</a> about how quantum resistant encryption was added to SimpleX Chat and also about other properties of end-to-end encryption, possible attacks on its security and known mitigations.</p> +<p>Quantum resistant encryption will now be enabled by default in all direct chats. For the new conversations it will be enabled from the beginning, and for the existing conversations it will be agreed after you exchange several messages with your contacts - you will see a notice in the conversation when it happens.</p> +<p>You can still safely downgrade the app to an earlier version if needed, as v5.6 already supports quantum resistant encryption.</p> +<p>With the users who have an earlier version, the app will work using the conventional encryption, which is still very secure. It's important that we augmented the conventional encryption with post-quantum cryptographic algorithm rather than replaced it, using a hybrid construction as recommended by the cryptography experts.</p> +<p>The groups currently do not support quantum resistant encryption yet - we plan to add it in the future to small groups.</p> +<h3 id="forward-and-save-messages" tabindex="-1">Forward and save messages</h3> +<p>You can now save received messages to private notes and forward them to your contacts and groups. This is both more convenient than copy-pasting the messages, and also more private - you can forward files and preserve a disappearing file in your private notes without saving them outside of the app.</p> +<p>You can see and navigate to the original source of the message via the message information, but the recipient of the message can only see that it was forwarded, but not from which conversation - in this way you can show that the message was quoted from another source without revealing the source (<a href="https://en.wikipedia.org/wiki/Chatham_House_rule">Chatham House Rule</a>).</p> +<p><img src="https://simplex.chat/blog/images/20240426-forward1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-forward2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-forward3.png" width="288" /></p> +<h3 id="in-call-sounds-and-switching-sound-sources" tabindex="-1">In-call sounds and switching sound sources</h3> +<p>This was the most frequent request of the users who use SimpleX Chat for audio and video calls - to add sound indication to the connection progress, as happens in all other apps. This release added these sounds and also vibration when call connects and disconnects.</p> +<p>You can also switch between bluetooth headphones, speakerphone and earpiece via the new button in the call.</p> +<h3 id="network-management" tabindex="-1">Network management</h3> +<p>To reduce traffic and battery usage, this release made connection timeouts dependent on which network your device uses - timeouts will be larger when you are on mobile connection and smaller when on WiFi. It also makes connection attempts very infrequent when the device is not connected to network.</p> +<h3 id="customizable-shape-of-profile-images" tabindex="-1">Customizable shape of profile images</h3> +<p>To customizable the interface, you can now change the shapes of profile images to anything from squares with sharp corners to circles, as before, via the Appearance menu in the app Settings. The default shape of profile images is changed to squares with rounded corners.</p> +<p><img src="https://simplex.chat/blog/images/20240426-profile1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-profile2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-profile3.png" width="288" /></p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240516-simplex-redefining-privacy-hard-choices.html + + 2024-05-16T00:00:00Z + + SimpleX: Redefining Privacy by Making Hard Choices + <h1 id="simplex-redefining-privacy-by-making-hard-choices" tabindex="-1">SimpleX: Redefining Privacy by Making Hard Choices</h1> +<p><strong>Published:</strong> May 16, 2024</p> +<p>When it comes to open source privacy tools, the status quo often dictates the limitations of existing protocols and structures. However, these norms need to be challenged to radically shift how we approach genuinely private communication. This requires doing some uncomfortable things, like making hard choices as it relates to funding, alternative decentralization models, doubling down on privacy over convenience, and more.</p> +<p>There will always be questions on why the SimpleX Chat and network makes the choices it makes, and that’s good! It’s important to question us and to understand the reasoning behind each decision, whether it’s technical, structural, financial or any other.</p> +<p>In this post we explain a bit more about why SimpleX operates and makes decisions the way it does.</p> +<h2 id="no-user-accounts" tabindex="-1">No user accounts</h2> +<p>Within SimpleX network there are no user accounts, and more importantly, no user profile identifiers whatsoever at the protocol level, not even random numbers or cryptographic keys used to identify the users. This means there is absolutely nothing that uniquely links users to their contacts or to the network relays. While it's accurate to say, &quot;You need an address to send something,&quot; it's crucial to understand that this &quot;address&quot; serves merely as a transient delivery destination, and not as a user profile identifier in any sense.</p> +<p>You can read more about how SimpleX works <a href="https://simplex.chat/#how-simplex-works">here</a>.</p> +<h2 id="privacy-over-convenience" tabindex="-1">Privacy over convenience</h2> +<p>One of the main considerations often ignored in security and privacy comparisons between messaging applications is multi-device access. For example, in Signal’s case, the Sesame protocol used to support multi-device access has the vulnerability that is <a href="https://eprint.iacr.org/2021/626.pdf">explained in detail here</a>:</p> +<p><em>&quot;We present an attack on the post-compromise security of the Signal messenger that allows to stealthily register a new device via the Sesame protocol. [...] This new device can send and receive messages without raising any ‘Bad encrypted message’ errors. Our attack thus shows that the Signal messenger does not guarantee post-compromise security at all in the multi-device setting&quot;</em>.</p> +<img src="https://simplex.chat/blog/images/20231125-mobile2.png" width="170" class="float-right" /> +<p>Solutions are possible, and even the quoted paper proposes improvements, but they are not implemented in any existing communication solutions. Unfortunately this results in most communication systems, even those in the privacy space, having compromised security in multi-device settings due to these limitations. That's the reason we are not rushing a full multi-device support, and currently only provide <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol">the ability to use mobile app profiles via the desktop app</a>, while they are on the same network.</p> +<p>Another choice that compromises privacy for convenience and usability is 3rd party push notifications. At SimpleX, we take a slow path of optimizing the network and battery consumption in the app, rather than simply hiding inefficiencies behind the quick fix solution of 3rd party push notifications that <a href="https://www.wired.com/story/apple-google-push-notification-surveillance/">increases vulnerability</a>, a path Signal and others chose. Like other choices, it has usability and optimization trade offs, but ultimately it’s the right thing to continue progressing towards a better solution as we explain <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html">here</a>.</p> +<p>Whenever possible, we strive to achieve significantly higher levels of privacy and security. For example, unlike most, if not all, applications (including Signal), <a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#encrypted-local-files-and-media-with-forward-secrecy">we encrypt application files with per-file unique key</a>. Consequently, once a message is deleted, there's no means to open a file that someone may have stolen in hopes of acquiring the key later. Similarly, apps like Session have done away with forward secrecy, a decision which caused them <a href="https://www.privacyguides.org/en/real-time-communication/#additional-options">not to be recommended</a> for &quot;long-term or sensitive communications&quot;. And <a href="https://simplifiedprivacy.com/spain-has-banned-telegram-defending-session/">misinformation</a> around this makes it dangerous and irresponsible to recommend without such necessary disclosures for people’s awareness.</p> +<p>Session’s decision was based on <a href="https://getsession.org/blog/session-protocol-explained">the incorrect statements</a> about double ratchet being impossible in decentralized networks, and underplayed importance of forward secrecy, break-in recovery and deniability - the absence of these crucial qualities makes Session a much weaker choice for private messaging. For transparency, this was something that was debated with their team <a href="https://twitter.com/SimpleXChat/status/1755216356159414602">here</a>. We also made <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#end-to-end-encryption-security-attacks-and-defense">a separate post</a> about these qualities of end-to-end encryption and their presence in different messengers, to show that not all end-to-end encrypted apps offer the same level of protections.</p> +<h2 id="network-decentralization" tabindex="-1">Network decentralization</h2> +<img src="https://simplex.chat/blog/images/simplex-explained.svg" width="40%" class="float-right" /> +<p>It's important to recognize that a model of decentralization where all servers are openly known and accessible to all clients, that some users ask for, actually results in a less decentralized network, and as the network grows it often requires an introduction of a central authority to protect from bad actors with malicious intent. Therefore, we've deliberately opted for a slower path towards achieving a higher degree of decentralization where there is no central server registry or network authority. For example, p2p designs may offer higher initial decentralization but often compromise on privacy and eventual decentralization. In essence, our approach prioritizes a balance between initial decentralization, privacy, and higher degree of decentralization down the line.</p> +<p>Additionally, while it's true that we haven't yet established a model to incentivize other network operators, it's certainly on the roadmap. We see the decentralization of network operators offered within the app as a top priority.</p> +<p>Where it stands today, users have the freedom to select their preferred servers within the SimpleX network by configuring the app, with thousands of self-hosted servers in operation. Moreover, numerous third-party applications rely on our code for their in-app communications, operating independently of our servers, many of which we may not even be aware of.</p> +<p>Decentralization is an ongoing journey, and we strive to proceed at a measured pace to ensure its proper implementation. While the immediate results may not always appear ideal, prioritizing a careful approach ensures that in the long run, the decisions made in this area align with our ultimate objectives of a private, efficient, reliable and fully decentralized network.</p> +<h2 id="funding-and-profitability" tabindex="-1">Funding and profitability</h2> +<p>We explain our rationale for funding <a href="https://simplex.chat/faq/index.html#funding-and-business-model">here</a>. Funding sources is always one of the most difficult choices to make, and it’s important to underline that VC models don’t necessarily translate to a quest for control, interference of any kind, or overall influence on product roadmap and strategy. The vast majority of investors seek profitability. Irrespective of the organization type profitability is essential for a sustainable operation, and it can and should be done while adhering to the highest possible standards for privacy. For-profit vs. nonprofit is also not an accurate metric to measure a commitment towards privacy and open standards, which is further explained <a href="https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html">here</a>.</p> +<p>To make a profit, satisfying customers is the key. Unlike the many companies that profit from selling customer data, we put user privacy first. Doing this at scale requires investments. If the investors don’t own or control a company, their participation becomes merely about profit for them, and not about how this profit is obtained. With the investors we have, we are completely aligned on this - they are betting on the future where privacy is the norm. They do not dictate on anything related to our model. We build SimpleX chat, protocols and network the way Internet should have been built if we as developers always put the privacy and empowerment of users first.</p> +<h2 id="company-jurisdiction" tabindex="-1">Company jurisdiction</h2> +<img src="https://simplex.chat/blog/images/20240516-parliament.jpg" width="40%" class="float-right" /> +<p>With regards to jurisdictions, nowhere is perfect. For that reason we plan to establish the foundations for protocol governance in <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#the-journey-to-the-decentralized-non-profit-protocol-governance">various jurisdictions</a>.</p> +<p>But we’d like to clarify some misconceptions about the UK, where SimpleX Chat Ltd. is registered, and the UK legislation.</p> +<p>For example, the Online Safety Act (OSA). Some people believe that it applies only to UK companies. But the OSA applicability isn’t determined by the company’s jurisdiction - it applies based on the nature and characteristics of the business and its services, as well as the number of its users in the UK. In case of SimpleX network, the OSA doesn’t apply for both of these reasons.</p> +<p>The UK’s position on communication encryption, and more specifically, on end-to-end encrypted messaging, remains the subject of political debates. But with the OSA, the legislative intent was to propose technical measures to block CSAM, and it was trying to explore ways to do this via client-side scanning, which of course would undermine the encryption. However, and thanks to the hard work of privacy experts, researchers, academics and rights organizations throughout the UK and the rest of the world, the Online Safety Bill did not prohibit end-to-end encrypted apps without such scanners. It is an open question whether such technology will ever be possible, and the UK government made a public commitment that client-side scanning won't be required until it is.</p> +<p>For now, strong end-to-end encryption remains permissible and protected, and we hope to also add to the privacy advocacy and debates as a UK-based company to keep it legally protected.</p> +<p>Overall, we view the UK as being better jurisdiction for privacy than many alternatives - there are some trade-offs everywhere.</p> +<h2 id="looking-ahead" tabindex="-1">Looking ahead</h2> +<p>The future of the Internet should be based on decentralized infrastructure operated by commercially viable organizations. These operators need to possess minimal user data, so that users have genuine control over their identities, and free from lock-in by the operators, to support fair competition. This requires a drastic re-imagining of the current norms and newer, more privacy-minded protocols. All in all, private messaging is surrounded by very difficult challenges but it’s worth it to keep pushing the industry forward and not settle for the status quo and current trade offs, protocol limitations and vulnerabilities. The Internet deserves better standards, and so do users.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html + + 2024-06-01T00:00:00Z + + Protecting Children's Safety Requires End-to-End Encryption + <h1 id="protecting-childrens-safety-requires-end-to-end-encryption" tabindex="-1">Protecting Children's Safety Requires End-to-End Encryption</h1> +<p>As lawmakers grapple with the serious issue of child exploitation online, some proposed solutions would fuel the very problem they aim to solve. Despite expert warnings, the Belgian Presidency persists in pushing for the implementation of client-side scanning on encrypted messaging services, rebranding the effort as &quot;upload moderation&quot;. Their <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=COM%3A2022%3A209%3AFIN&amp;qid=1652451192472">latest proposal</a> mandates that providers of private communication services obtain user consent for AI-based scanning of their private chats. If users do not consent, they will be prohibited from sharing images, videos, and URLs.</p> +<p>Privacy critics have long pushed for measures like centralized scanning of private photos and messaging data, arguing it could detect illicit content. However, invasive monitoring of private communications would create detrimental risks that far outweigh any perceived benefits.</p> +<h2 id="why-were-taking-action" tabindex="-1">Why we’re taking action</h2> +<p>SimpleX Chat signed a <a href="https://www.globalencryption.org/2024/05/joint-statement-on-the-dangers-of-the-may-2024-council-of-the-eu-compromise-proposal-on-eu-csam/">joint statement</a> about the dangers of the EU compromise proposal on EU CSAM because maintaining end-to-end encryption is crucial for protecting privacy and security for everyone, including and especially children.</p> +<p>We urge the Ministers in the Council of the EU to stand firm against any scanning proposals that undermine end-to-end encryption, which would enable mass surveillance and misuse by bad actors, whether framed as client-side scanning, upload moderation, or any other terminology. Compromising this basic principle opens the door to devastating privacy violations. We also urge any organizations or individuals reading this to write to their representatives and voice their concerns. European Digital Rights has <a href="https://edri.org/our-work/be-scanned-or-get-banned/">outlined these issues</a> in greater detail for anyone seeking more information.</p> +<h2 id="why-compromising-privacy-endangers-children" tabindex="-1">Why compromising privacy endangers children</h2> +<p>The core issue is that compromising encryption and privacy makes innocent people vulnerable to malicious hackers and criminals seeking to exploit users data. Centralized scanning systems become a tempting target, potentially exposing millions of private family photos when breached. This would easily open up avenues for blackmail, abuse, and victimization of children. A case in point is the recent <a href="https://techcrunch.com/2024/01/17/unredacted-meta-documents-reveal-historical-reluctance-to-protect-children-new-mexico-lawsuit/">criminal charges</a> against Meta in New Mexico, which highlights how the tech giant's algorithms enabled child exploitation by encouraging connections between minors and sexual predators. Privacy-eroding initiatives like client-side scanning would play into the hands of malicious actors by making more sensitive information accessible and weaponized in the same way that it has been on Meta platforms.</p> +<h2 id="what-should-be-done" tabindex="-1">What should be done</h2> +<p>Rather than undermining privacy, to achieve child safety online users should be empowered with high standards for encryption and data control. For example, adopting a model where children (and users in general) cannot be discovered or approached on networks unless they or their parents permit it, similar to the SimpleX network privacy model. Intelligent multi-device synchronization could enable this oversight without compromising end-to-end encryption overall. It’s always possible to protect children without opening everyone, especially children themselves, to greater vulnerabilities due to such proposals.</p> +<p>However, some recent legislative efforts have bizarrely moved in the opposite direction by seeking to limit parental access. The chilling truth is that the least private platforms have been major enablers of child exploitation. Eroding privacy protections on other services will only aid criminals further, not protect children. Preserving strong encryption and user privacy must be the foundation for any credible effort to combat online child exploitation. Initiatives trading privacy for supposed safety are not just technically flawed, but would achieve the exact opposite of their stated intent. We must avoid being gaslighted by narratives that defy logic, and instead provide users with the highest possible standards for privacy protections as a core principle.</p> +<p>Protecting end-to-end encryption without carving out backdoors or vulnerabilities should be non-negotiable for children's and everyone’s safety. It is critical to redirect the discourse to focus on taking genuine privacy further by protecting against <a href="https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html">metadata hoarding</a> and other means by which people’s data can be abused or subjected to surveillance.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html + + 2024-06-04T00:00:00Z + + SimpleX network: private message routing, v5.8 released with IP address protection and chat themes + <h1 id="simplex-network-private-message-routing-v58-released-with-ip-address-protection-and-chat-themes" tabindex="-1">SimpleX network: private message routing, v5.8 released with IP address protection and chat themes</h1> +<p><strong>Published:</strong> June 4, 2024</p> +<p>What's new in v5.8:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#private-message-routing">private message routing</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#server-transparency">server transparency</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#protect-ip-address-when-downloading-files--media">protect IP address when downloading files &amp; media</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#chat-themes">chat themes</a> for better conversation privacy - in Android and desktop apps.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#group-improvements">group improvements</a> - reduced traffic and additional preferences.</li> +<li>improved networking, message and file delivery.</li> +</ul> +<p>Also, we added Persian interface language to the Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<h2 id="private-message-routing" tabindex="-1">Private message routing</h2> +<h3 id="whats-the-problem" tabindex="-1">What's the problem?</h3> +<img src="https://simplex.chat/blog/images/simplex-explained.svg" width="37%" class="float-right" /> +<p>SimpleX network design has always been focussed on protecting user identity on the messaging protocol level - there is no user profile identifiers of any kind in the protocol design, not even random numbers or cryptographic keys.</p> +<p>Until this release though, SimpleX network had no built-in protection of user transport identities - IP addresses. As previously the users could only choose which messaging relays to use to receive messages, these relays could observe the IP addresses of the senders, and if these relays were controlled by the recipients, the recipients themselves could observe them too - either by modifying server code or simply by tracking all connecting IP addresses.</p> +<p>To work around this limitation, many users connected to SimpleX network relays via Tor or VPN - so that the recipients' relays could not observe IP addresses of the users when they send messages. Still, it was the most important and the most criticized limitation of SimpleX network for the users.</p> +<h3 id="why-didnt-we-just-embed-tor-in-the-app" tabindex="-1">Why didn't we just embed Tor in the app?</h3> +<p>Tor is the best transport overlay network in existence, and it provides network anonymity for millions of Internet users.</p> +<p>SimpleX Chat has many integration points with Tor:</p> +<ul> +<li>it allows <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">dual server addresses</a>, when the same messaging relay can be reached both via Tor and via clearnet.</li> +<li>it utilises Tor's SOCKS proxy &quot;isolate-by-auth&quot; feature to create a new Tor circuit for each user profile, and with an additional option - for each contact. Per-contact <a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation">transport isolation</a> is still experimental, as it doesn't work if you connect to groups with many members, and it's only available if you enable developer tools.</li> +</ul> +<p>Many SimpleX network design ideas are borrowed from Tor network design:</p> +<ul> +<li>mitigation of <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">MITM attack</a> on client-server connection is done in the same way as Tor relays do it - the fingerprint of offline certificate is included in server address and validated by the client.</li> +<li>the private routing itself uses the approach similar to onion routing, by adding encryption layers on each hop.</li> +<li>we are also considering to implement Tor's <a href="https://blog.torproject.org/introducing-proof-of-work-defense-for-onion-services/">Proof-of-work DoS defence</a> mechanism.</li> +</ul> +<p>So why didn't we just embed Tor into the messaging clients to provide IP address protection?</p> +<p>We believe that Tor may be the wrong solution for some users for one of the reasons:</p> +<ul> +<li>much higher latency, error rate and resource usage.</li> +<li>people who want to use Tor are better served by specialized apps, such as <a href="https://guardianproject.info/apps/org.torproject.android/">Orbot</a>.</li> +<li>Tor usage is restricted in some networks, so it would require complex configuration in the app UI.</li> +<li>some countries have legislative restrictions on Tor usage, so embedding Tor would require supporting multiple app versions, and it would leave the original problem unsolved in these countries.</li> +</ul> +<p>Also, while Tor solves the problem of IP address protection, it doesn't solve the problem of meta-data correlation by user's transport session. When the client connects to the messaging relays via Tor, the relays can still observe which messaging queues a user sends messages to via a single TCP connection. The client can mitigate it with per-contact transport isolation, but it uses too much traffic and battery for most users.</p> +<p>So we believed we would create more value to the users of SimpleX network with private message routing. This new message routing protocol provides IP address and transport session protection out of the box, once released. It can also be extended to support delayed delivery and other functions, improving both usability and transport privacy in the future.</p> +<p>At the same time, we plan to continue supporting Tor and other overlay networks. Any overlay network that supports SOCKS proxy with &quot;isolate-by-auth&quot; feature will work with SimpleX Chat app.</p> +<h3 id="what-is-private-message-routing-and-how-does-it-work" tabindex="-1">What is private message routing and how does it work?</h3> +<p>Private message routing is a major milestone for SimpleX network evolution. It is a new message routing protocol that protects both users' IP addresses and transport sessions from the messaging relays chosen by their contacts. Private message routing is, effectively, a 2-hop onion routing protocol inspired by Tor design, but with one important difference - the first (forwarding) relay is always chosen by message sender and the second (destination) - by the message recipient. In this way, neither side of the conversation can observe IP address or transport session of another.</p> +<p>At the same time, the relays chosen by the sending clients to forward the messages cannot observe to which connections (messaging queues) the messages are sent, because of the additional layer of end-to-end encryption between the sender and the destination relay, similar to how onion routing works in Tor network, and also thanks to the protocol design that avoids any repeated or non-random identifiers associated with the messages, that would otherwise allow correlating the messages sent to different connections as sent by the same user. Each message forwarded to the destination relay is additionally encrypted with one-time ephemeral key, to be independent of messages sent to different connections.</p> +<p>The routing protocol also prevents the possibility of MITM attack by the forwarding relay, which provides the certificate the session keys of the destination server to the sending client that are cryptographically signed by the same certificate that is included in destination server address, so the client can verify that the messages are sent to the intended destination, and not intercepted.</p> +<p>The diagram below shows all the encryption layers used in private message routing:</p> +<pre><code>----------------- ----------------- -- TLS -- ----------------- ----------------- +| | -- TLS -- | | -- f2d -- | | -- TLS -- | | +| | -- s2d -- | | -- s2d -- | | -- d2r -- | | +| Sending | -- e2e -- | sender's | -- e2e -- | recipient's | -- e2e -- | Receiving | +| client | message -&gt; | Forwarding | message -&gt; | Destination | message -&gt; | client | +| | -- e2e -- | relay | -- e2e -- | relay | -- e2e -- | | +| | -- s2d -- | | -- s2d -- | | -- d2r -- | | +| | -- TLS -- | | -- f2d -- | | -- TLS -- | | +----------------- ----------------- -- TLS -- ----------------- ----------------- +</code></pre> +<p><strong>e2e</strong> - two end-to-end encryption layers between <strong>sending</strong> and <strong>receiving</strong> clients, one of which uses double ratchet algorithm. These encryption layers are present in the previous version of message routing protocol too.</p> +<p><strong>s2d</strong> - encryption between the <strong>sending</strong> client and recipient's <strong>destination</strong> relay. This new encryption layer hides the message metadata (destination connection address and message notification flag) from the forwarding relay.</p> +<p><strong>f2d</strong> - additional new encryption layer between <strong>forwarding</strong> and <strong>destination</strong> relays, protecting from traffic correlation in case TLS is compromised - there are no identifiers or cyphertext in common between incoming and outgoing traffic of both relays inside TLS connection.</p> +<p><strong>d2r</strong> - additional encryption layer between destination relay and the recipient, also protecting from traffic correlation in case TLS is compromised.</p> +<p><strong>TLS</strong> - TLS 1.3 transport encryption.</p> +<p>For private routing to work, both the forwardig and the destination relays should support the updated messaging protocol - it is supported from v5.8 of the messaging relays. It is already released to all relays preset in the app, and available as a self-hosted server. We updated <a href="https://simplex.chat/docs/server.html">the guide</a> about how to host your own messaging relays.</p> +<p>Because many self-hosted relays did not upgrade yet, private routing is not enabled by default. To enable it, you can open <em>Network &amp; servers</em> settings in the app and change the settings in <em>Private message routing</em> section. We recommend setting <em>Private routing</em> option to <em>Unprotected</em> (to use it only with unknown relays and when not connecting via Tor) and <em>Allow downgrade</em> to <em>Yes</em> (so messages can still be delivered to the messaging relays that didn't upgrade yet) or to <em>When IP hidden</em> (in which case the messages will fail to deliver to unknown relays that didn't upgrade yet unless you connect to them via Tor).<br /> +See <a href="https://simplex.chat/faq/index.html#does-simplex-protect-my-ip-address">F.A.Q. section</a> for answers about private message routing.</p> +<p>Read more about the technical design of the private message routing in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/rfcs/done/2023-09-12-second-relays.md">this document</a> and in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/simplex-messaging.md#proxying-sender-commands">the messaging protocol specification</a>.</p> +<h2 id="server-transparency" tabindex="-1">Server transparency</h2> +<img src="https://simplex.chat/blog/images/20240604-server.png" width="40%" class="float-to-right" /> +<p>Even with very limited information available to the messaging relays, there are <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md#simplex-messaging-protocol-server">several things</a> that would reduce users' privacy that a compromised relay can do.</p> +<p>We <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2024-03-20-server-metadata.md">wrote previously</a> that it is important that server operators commit to running unmodified server code or disclose any code modifications, and also disclose server ownership and any other relevant information.</p> +<p>While we cannot require the operators of self-hosted and private servers to disclose any information about them (apart from which server code they use - this is the requirement of the AGPLv3 license to share this information with users connecting to the server), as we add other server operators to the app, it is important for the users to have all important information about these operators and servers location.</p> +<p>This server release adds server information page where all this information can be made available to the users. For example, this is <a href="https://smp8.simplex.im/" target="_blank">the information</a> about one of the servers preset in the app.</p> +<p>The updated server guide also includes <a href="https://simplex.chat/docs/server.html#">the instruction</a> about how to host this page for your server. It is generated as a static page when the server starts. We recommend using Caddy webserver to serve it.</p> +<h2 id="more-new-things-in-v58" tabindex="-1">More new things in v5.8</h2> +<h3 id="protect-ip-address-when-downloading-files-and-media" tabindex="-1">Protect IP address when downloading files &amp; media</h3> +<p>This version added the protection of your IP address when receiving files from unknown file servers without Tor. Images and voice messages won't automatically download from unknown servers too until you tap them, and confirm that you trust the file server where they were uploaded.</p> +<h3 id="chat-themes" tabindex="-1">Chat themes</h3> +<p><img src="https://simplex.chat/blog/images/20240604-theme1.png" width="244" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20240604-theme2.png" width="244" class="float-to-right" /></p> +<p>In Android and desktop app you can now customize how the app looks by choosing wallpapers with one of the preset themes or choose your own image as a wallpaper.</p> +<p>But this feature is not only about customization - it allows to set different colors and wallpaper for different user profiles and even specific conversations. You can also choose different themes for different chat profiles.</p> +<p>In case you use different identities for different conversations, it helps avoiding mistakes.</p> +<h3 id="group-improvements" tabindex="-1">Group improvements</h3> +<p>This version adds additional group configuration options to allow sending images, files and media, and also SimpleX links only to group administrators and owners. So with this release group owners can have more control over content shared in the groups.</p> +<p>We also stopped unnecessary traffic caused by the members who became inactive without leaving the groups - it should substantially reduce traffic and battery consumption to the users who send messages in large groups.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html + + 2024-07-04T00:00:00Z + + The Future of Privacy: Enforcing Privacy Standards + <h1 id="the-future-of-privacy-enforcing-privacy-standards" tabindex="-1">The Future of Privacy: Enforcing Privacy Standards</h1> +<p><strong>Published:</strong> Jul 4, 2024</p> +<p>Recent anti-privacy legislations and proposals in <a href="https://www.theverge.com/2024/6/19/24181214/eu-chat-control-law-propose-scanning-encrypted-messages-csam">Europe</a>, <a href="https://theconversation.com/section-702-foreign-surveillance-law-lives-on-but-privacy-fight-continues-229253">the US</a> and <a href="https://www.theguardian.com/technology/article/2024/jun/20/meredith-walker-signal-boss-government-encryption-laws">Australia</a> threaten to infringe our fundamental right to privacy and to create grave risks to the <a href="https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html">safety</a> of children and vulnerable people. It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a right users must constantly fight to protect, and not something that users can be asked to consent away as a condition of access to a service.</p> +<p>Tech giants are trying to normalize surveillance capitalism, often with little to no consequences globally. These companies are contributing to a growing ecosystem where opting out of invasive data hoarding practices is becoming increasingly challenging, if not outright impossible. We are being gaslit by the technology executives who try to justify profiteering from AI theft, from <a href="https://www.computing.co.uk/news/4330395/microsoft-ai-chief-makes-questionable-claims-about-copyright-online-content">Microsoft</a> claiming all our content is fair game for their exploitation to unethical startups like <a href="https://www.theverge.com/2024/6/27/24187405/perplexity-ai-twitter-lie-plagiarism">Perplexity</a> turning the word “<a href="https://x.com/perplexity_ai/status/1789007907092066559">privacy</a>” into a marketable farce.</p> +<h2 id="the-ai-hypes-impact-on-privacy" tabindex="-1">The AI Hype’s Impact on Privacy</h2> +<p>The exaggeration of AI’s actual capabilities and the continuous promotion of its “intelligence” is creating a rat race where tech companies and well-funded startups are evading accountability, as they eagerly collect and exploit more data than ever.</p> +<p>They're prioritizing AI development over user privacy and rights, setting a dangerous precedent for current and future online engagements. They've already normalized the use of AI to scan and analyze supposedly private communications - from emails to instant messages - repackaging this intrusion as &quot;productivity tools”. Meanwhile, most consumers actually want <a href="https://iapp.org/news/a/most-consumers-want-data-privacy-and-will-act-to-defend-it">more data privacy</a>, not less, and are increasingly concerned by the lack of it.</p> +<p>The legal push towards “client-side scanning”, attacks on end-to-end encryption and the support for pro-surveillance legislation gives credibility to these highly intrusive practices that literally endanger lives. And we know that moral obligations mean nothing to corporations benefiting from these exploitative models, so we have to ensure that our demands for privacy are legally enforceable and non-negotiable.</p> +<h2 id="legal-action" tabindex="-1">Legal Action</h2> +<p>We are encouraged to see more legal pressure on companies that exploit user data on a daily basis. For example, the European Center for Digital Rights’ (Noyb) <a href="https://noyb.eu/en/noyb-urges-11-dpas-immediately-stop-metas-abuse-personal-data-ai">complaints</a> against Meta’s abuse of personal data to train their AI and, and the demands from the Norwegian Consumer Council to data protection authority to ensure that applicable laws are enforced against Meta considering there is “<a href="https://www.forbrukerradet.no/side/legal-complaint-against-metas-use-of-personal-content-for-ai-training/">no way to remove personal data from AI models once Meta has begun the training</a>”.</p> +<p>Noyb is taking a strong stance against <a href="https://noyb.eu/en/project/cases">other companies</a> with similar exploitative models, including facial recognition surveillance tools often misused by law enforcement agencies. Consider <a href="https://noyb.eu/en/support">supporting</a> their ongoing efforts — we strongly believe legal action is one of the most effective means to hold these companies accountable for their persistent abuses, which are otherwise shielded by heavily funded self-serving lobby groups.</p> +<h2 id="privacy-as-a-legal-obligation" tabindex="-1">Privacy as a Legal Obligation</h2> +<p>We must shift from a defensive stance to a proactive one by proposing privacy legislation that puts users in direct control of their private data.</p> +<p>This legislation should:</p> +<ol> +<li>Establish non-negotiable provider duties for protecting user privacy, with hefty fines and consequences for service operators who do not comply.</li> +<li>Prevent providers from circumventing these duties through user consent clauses — it should be legally prohibited to ask for a consent to share user data or to use it for anything other than providing a service.</li> +<li>Prevent providers from asking for any more personal information from the users than technically necessary and legally required. For example, asking for a phone number as a condition of access to a service should be made illegal in most cases — it does not provide a sufficient security, exposes users' private information and allows simple aggregation of users' data across multiple services.</li> +<li>Create a strong legal framework that cannot be resisted or modified</li> +</ol> +<p>By codifying these principles into law, we can establish a strong technological framework that is built to create more value for end users, while protecting their privacy against data exploitation, criminal use and identity theft. We will continue the fight against illogical legislative proposals designed to normalize mass surveillance, but our efforts should equally gear towards creating and supporting new models and technological foundations that bring us far closer to the reality we urgently need.</p> +<h2 id="collective-action" tabindex="-1">Collective Action</h2> +<p>There is great work being done by advocacy organizations, and service providers need to contribute to this fight as well by shifting the narrative and reclaiming the term “privacy” from the tech giants who co-opted and corrupted it. We must play a bigger role in supporting users in setting stronger boundaries, making demands, and refusing anything less than genuine privacy and data ownership, while getting comfortable with holding providers accountable for any violations.</p> +<p>Privacy should be seen as a fundamental obligation of technology providers, and legislators must actively enforce this expectation. The more consumers make this demand, the more pressure we put on anti-privacy lobbyists with rogue motives, the easier it will be to hold abusers accountable, and the more likely we can collectively ensure that a privacy-first web becomes a reality.</p> +<p>You can support privacy today by signing <a href="https://www.globalencryption.org/2024/05/joint-statement-on-the-dangers-of-the-may-2024-council-of-the-eu-compromise-proposal-on-eu-csam/">the petition</a> prepared by Global Encryption Coalition in support of communication privacy. You can also write to your elected representatives, explaining them how data privacy and encrypted communications protect children safety and reduce crime.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html + + 2024-08-14T00:00:00Z + + SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. + <h1 id="simplex-network-the-investment-from-jack-dorsey-and-asymmetric-v60-released-with-the-new-user-experience-and-private-message-routing" tabindex="-1">SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing.</h1> +<p><strong>Published:</strong> Aug 14, 2024</p> +<p><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#simplex-chat-vision-and-funding-20">SimpleX Chat: vision and funding 2.0</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-past-investment-from-village-global">The past</a>: investment from Village Global.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-present-announcing-the-investment-from-jack-dorsey-and-asymmetric">The present</a>: announcing the investment from Jack Dorsey and Asymmetric Capital Partners.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-future-faster-development-and-transition-to-non-profit-governance">The future</a>: faster development and the path to non-profit governance.</li> +</ul> +<p><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#whats-new-in-v60">What's new in v6.0</a>:</p> +<ul> +<li>Private message routing — now enabled by default.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-chat-experience">New chat experience</a>: +<ul> +<li>connect to your friends faster.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-reachable-interface">new reachable interface</a>.</li> +<li>archive contacts to chat later.</li> +<li>new way to start chat.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#moderate-like-a-pro">moderate like a pro</a>: delete many messages at once.</li> +<li>new chat themes<sup>*</sup></li> +<li>increase font size<sup>**</sup>.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-media-options">New media options</a>: +<ul> +<li>play from the chat list.</li> +<li>blur for better privacy.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#share-from-other-apps">share from other apps</a><sup>*</sup>.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#improved-networking-and-reduced-battery-usage">Improved networking and reduced battery usage</a></li> +</ul> +<p>* New for iOS app.</p> +<p>** Android and desktop apps.</p> +<h2 id="simplex-chat-vision-and-funding-20" tabindex="-1">SimpleX Chat: vision and funding 2.0</h2> +<h3 id="the-past-investment-from-village-global" tabindex="-1">The past: investment from Village Global</h3> +<p>Last year <a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#how-is-it-funded-and-what-is-the-business-model">we announced</a> pre-seed funding from several angel investors and Village Global. Some of our users were very excited that we have funds to continue developing SimpleX network. But as some of Village Global LPs (Limited Partners) are <a href="https://www.villageglobal.vc/">the founders of very large technology companies</a>, some of our users were worried about any negative influence this investment might have on the project.</p> +<p><a href="https://www.villageglobal.vc/team/ben-casnocha">Ben Casnocha</a>, the founder and general partner of Village Global, commented on their investment:</p> +<blockquote> +<p>I believe in SimpleX Chat vision and team’s ability to execute it. The growing number of Internet users who demand privacy of their data and contacts will make SimpleX Chat profitable, which is critically important for any sustainable organization.</p> +<p>We are fortunate to have LPs who founded many iconic Internet ventures. But they don’t have any influence on the 400+ companies we invested in. They are financial investors in our fund and exert no control or influence on any of the underlying portfolio companies.</p> +<p>What's more, we believe that founders should lead their ventures, as it yields better results – our investment in SimpleX Chat has no control provisions. We are happy to help, but we don’t control any decisions nor have a board seat. Evgeny runs the company independently.</p> +</blockquote> +<p>Ben, thank you for believing in our vision – without it SimpleX Chat would simply not exist, as most other investors at the time did not believe that privacy could ever escape the niche of privacy enthusiasts – and we already see the first signs of it happening.</p> +<h3 id="the-present-announcing-the-investment-from-jack-dorsey-and-asymmetric" tabindex="-1">The present: announcing the investment from Jack Dorsey and Asymmetric</h3> +<p>The Android app recently hit <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">100,000 downloads on Google Play Store</a>, and our users naturally ask for improved reliability, privacy, security, better user experience and design – all at the same time, and as soon as possible. This requires more funding.</p> +<p>We are very happy to announce that we now have funds to move faster – we raised a $1.3 million pre-seed round led by <a href="https://en.wikipedia.org/wiki/Jack_Dorsey">Jack Dorsey</a>, with participation of <a href="https://www.acp.vc/">Asymmetric Capital Partners</a> (ACP) VC fund.</p> +<p>When Jack discovered SimpleX Chat last year, he <a href="https://x.com/jack/status/1661681076983529479">posted on Twitter</a>:</p> +<blockquote> +<p>Better than Signal? Looks promising.<br /> +A few bugs and UX issues but great foundation. Love that it’s public domain.</p> +</blockquote> +<p>And <a href="https://primal.net/e/note1txz9xmmc456kwcg7zrsrtqrhn7as29ptuz0qulu452k8n85hsshqq6uh6q">on Nostr</a>:</p> +<blockquote> +<p>A full day with @SimpleX Chat. Solid overall. TestFlight is not recommended. There are some scaling issues today. And not the most intuitive onboarding for everyone. Name still reminds everyone of herpes. All fixable. It’s fast and doesn’t require a phone number or email and I do believe people will eventually see the value of that. Finally, some competition for Signal, and in a permissionless way. And def a solid path so apps don’t have to build their own DM experiences.</p> +</blockquote> +<p>Jack, we are super lucky to have your support and investment – thank you for believing in our ability to build a better messaging network! It is a hard work, and we’ve made a lot of progress since your note was written, and a lot of work is ongoing!</p> +<p>The ACP investment is strategically important – it is a fund that only invests in B2B startups, and SimpleX Chat currently is mostly used by individual users. Making a private communication network sustainable requires its adoption by businesses, and we already see a growing usage by the small teams.</p> +<p><a href="https://www.acp.vc/team/rob-biederman">Rob Biederman</a> and <a href="https://www.acp.vc/team/sam">Sam Clayman</a>, the partners of ACP, commented:</p> +<blockquote> +<p>We believe that SimpleX Chat network can grow into a de facto Internet standard for private and secure communications for both businesses and individual users, unifying instant and email-like messaging into a single product.</p> +<p>Emails no longer provide privacy and security that businesses require, particularly given the emerging threat of AI-led phishing and social engineering attacks. We look forward to SimpleX network providing a secure alternative.</p> +</blockquote> +<p>I was lucky to have met Rob, Sam and the ACP team when I was presenting SimpleX Chat in London – thank you all for your support and believing that the future of communication requires a single product, both for businesses and individual users.</p> +<h3 id="the-future-faster-development-and-the-path-to-non-profit-governance" tabindex="-1">The future: faster development and the path to non-profit governance</h3> +<p>Jack Dorsey and ACP support enable us to make huge product improvements, thanks to a bigger team, and provide us with medium-term funding to get to the next stage of product and business evolution. Like with Village Global, this is a financial investment, without control or board seat provisions – so the users can be certain that SimpleX remains true to our vision of privacy first communication network.</p> +<p>We already added two great engineers to the team and are about to hire a UX/UI designer.</p> +<p><a href="https://www.trailofbits.com/about/">Trail of Bits</a> has just completed the protocols design security review and will be doing implementation security review in the end of the year. We will publish the first report soon.</p> +<p>This year we will launch group improvements that we presented in the <a href="https://www.youtube.com/watch?v=7yjQFmhAftE">live-stream last year</a>. While the main problem explained in this video was solved with the current design, the issue of group scalability remains – to send a message to a group your client needs to send it to each member, creating substantial traffic.</p> +<p>We will also launch long-form email-like messaging over SimpleX network this year, together with optional short public addresses that show profile you are connecting to before the connection – this is important for any public users and businesses.</p> +<p>The last but not the least, we started the work with <a href="https://www.techlawpartners.com/heather">Heather Meeker</a>, a great legal expert on intellectual property matters and one of the earliest advocates of the open-source software development in businesses, to setup open-source governance model, to some extent similar to how Matrix did it. We believe, and our investors agree, that it would both increase the company value and also create more value for the users community.</p> +<h2 id="whats-new-in-v60" tabindex="-1">What's new in v6.0</h2> +<p>v6.0 is one of our biggest releases ever, with a lot of focus on UX and stability improvements, and the new features the users asked for.</p> +<p>The private message routing <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">we announced before</a> is now enabled for all users by default – it protects users IP addresses and sessions from the destination servers.</p> +<h3 id="new-chat-experience" tabindex="-1">New chat experience</h3> +<h4 id="connect-to-your-friends-faster" tabindex="-1">Connect to your friends faster</h4> +<p>This version includes messaging protocol improvements that reduce twice the number of messages required for two users to connect. Not only it means connecting faster and using less traffic, this change allows to start sending messages sooner, so you would see &quot;connecting&quot; in the list of the chats for a much shorter time than before.</p> +<p>It will be improved further in the next version: you will be able to send messages straight after using the invitation link, without waiting for your contact to be online.</p> +<h4 id="new-reachable-interface" tabindex="-1">New reachable interface</h4> +<img src="https://simplex.chat/blog/images/20240814-reachable.png" width="288" class="float-to-right" /> +<p>Like with the most innovative mobile browsers (e.g., Safari and Firefox), SimpleX Chat users now can use the app with one hand by moving the toolbar and search bar to the bottom of the screen, and ordering the chats with the most recent conversations in the bottom too, where they can be more easily reached on a mobile screen.</p> +<p>This layout is enabled by default, and you can disable it right from the list of chats when you install the new version if you prefer to use conventional UI.</p> +<p>Give it a try – our experience is that that after less than a day of using it, it starts feeling as the only right way. You can always toggle it in the Appearance settings.</p> +<h4 id="archive-contacts-to-chat-later" tabindex="-1">Archive contacts to chat later</h4> +<p><img src="https://simplex.chat/blog/images/20240814-delete-contact-2.png" width="288" class="float-to-right" />   <img src="https://simplex.chat/blog/images/20240814-delete-contact-1.png" width="288" class="float-to-right" /></p> +<p>Now you have two new options when deleting a conversation:</p> +<ul> +<li>only delete conversation, and archive contact. We will add archiving conversation without clearing it in the next version, as some users of our beta version asked.</li> +<li>delete contact but keep the conversation.</li> +</ul> +<p>Also, deleting a contact now requires double confirmation, so you are less likely to delete the contact accidentally. This deletion is irreversible, and the only way to re-connect would be using a new link.</p> +<h4 id="new-way-to-start-chat" tabindex="-1">New way to start chat</h4> +<img src="https://simplex.chat/blog/images/20240814-new-message.png" width="288" class="float-to-right" /> +<p>When you tap pencil button, you will see a large <em>New message</em> sheet, that adds new functions to the options you had before.</p> +<p>Old options:</p> +<ul> +<li><em>Add contact</em> to create a new 1-time invitation link,</li> +<li><em>Scan / paste link</em>: to use the link you received. It can be 1-time invitation, a public SimpleX address, or a link to join the group.</li> +<li><em>Create group</em></li> +</ul> +<p>New options:</p> +<ul> +<li>Open archived chats.</li> +<li>Accept pending contact requests.</li> +<li>Connect to preset public addresses (we will add an option to add your own addresses here too).</li> +<li>Search for your contacts.</li> +</ul> +<h4 id="new-chat-themes" tabindex="-1">New chat themes</h4> +<p>We released the new themes <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">for Android and desktop apps</a> in the previous version, and now they are available for iOS too.</p> +<p>You can set different themes for different chat profiles you have, and for different conversations – it can help avoid mistakes about which conversation you are in.</p> +<p>Also, these themes are compatible between platforms, so you can import the theme created on Android into iOS app and vice versa.</p> +<h4 id="moderate-like-a-pro" tabindex="-1">Moderate like a pro</h4> +<img src="https://simplex.chat/blog/images/20240814-delete-messages.png" width="288" class="float-to-right" /> +<p>As much as we disagree with the attacks on the freedom of speech on the society level – all people must be able to express their opinions – we also believe that the small community owners should have full control over which content is allowed and which is not. But as communities grow, bad actors begin to join in order to disrupt, subvert and troll the conversations. So, the moderation tools are critical for small public communities to thrive.</p> +<p>SimpleX Chat already has several moderation tools available for community owners:</p> +<ul> +<li>Moderate individual messages.</li> +<li>Set the default role of the new members to &quot;observer&quot; — they won't be able to send messages until you allow it. In addition to that, by enabling default messages for admins and owners only you can reach out to the new members and ask some questions before allowing to send messages.</li> +<li>Block messages of a member for yourself only.</li> +<li>Block a member for all other members — only admins and group owners can do that.</li> +</ul> +<p>With this version you can now select multiple messages at once and delete or moderate them, depending on your role in the community. The current version limits the number of messages that can be deleted to 20 — this limit will be increased to 200 messages in the next version.</p> +<p>Also, this version makes profile images of the blocked members blurred, to prevent the abuse via inappropriate profile images.</p> +<h4 id="increase-font-size" tabindex="-1">Increase font size</h4> +<p>Android and desktop apps now allow to increase font size inside the app, without changing the system settings. Desktop app also allows to zoom the whole screen — it can be helpful on some systems with a limited support of high density displays.</p> +<p>These settings can be changed via Appearance settings.</p> +<h3 id="new-media-options" tabindex="-1">New media options</h3> +<h4 id="play-from-the-chat-list" tabindex="-1">Play from the chat list</h4> +<img src="https://simplex.chat/blog/images/20240814-play.png" width="288" class="float-to-right" /> +<p>Now you can interact with the media directly from the list of the chats.</p> +<p>This is very convenient – when somebody sends you a voice message or a video, they can be played directly from the list of chats, without opening a conversation. Similarly, an image can be opened, a file can be saved, and the link with preview can be opened in the browser.</p> +<p>And, in some circumstances, this is also more private, as you can interact with the media, without opening the whole conversation.</p> +<p>We will add the option to return missed calls from the chat list in the next version.</p> +<h4 id="blur-for-better-privacy" tabindex="-1">Blur for better privacy</h4> +<p>You can set all images and videos to blur in your app, and unblur them on tap (or on hover in desktop app). The blur level can be set in Privacy and security settings.</p> +<h4 id="share-from-other-apps" tabindex="-1">Share from other apps</h4> +<img src="https://simplex.chat/blog/images/20240814-share.png" width="288" class="float-to-right" /> +<p>Not much to brag about, as most iOS messaging apps allow it, and users expected it to be possible since the beginning.</p> +<p>But iOS makes it much harder to develop the capability to share into the app than Android, so it's only in this version you can share images, videos, files and links into SimpleX Chat from other apps.</p> +<h3 id="improved-networking-and-reduced-battery-usage" tabindex="-1">Improved networking and reduced battery usage</h3> +<p>This version includes the statistics of how your app communicates with all servers when sending and receiving messages and files. This information also includes the status of connection to all servers from which you receive messages — whether the connection is authorized to push messages from server to your device, and the share of these active connections.</p> +<p>Please note, that when you send a message to a group, your app has to send it to each member separately, so sent message statistics account for that — it may seem to be quite a large number if you actively participate in some large groups. Also, message counts not only include visible messages you receive and send, but also any service messages, reactions, message updates, message deletions, etc. — this is the correct reflection of how much traffic your app uses.</p> +<p>This information is only available to your device, we do NOT collect this information, even in the aggregate form.</p> +<p>While the main reason we added this information is to reduce traffic and battery usage, to be able to identify any cases of high traffic, this version already reduced a lot battery and traffic usage, as reported by several beta-version users.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>You might ask: <em>Why do you need donations if you've just raised the investment?</em></p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html + + 2024-10-14T00:00:00Z + + SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. + <h1 id="simplex-network-security-review-of-protocols-design-by-trail-of-bits-v61-released-with-better-calls-and-user-experience" tabindex="-1">SimpleX network: security review of protocols design by Trail of Bits, v6.1 released with better calls and user experience.</h1> +<p><strong>Published:</strong> Oct 14, 2024</p> +<p><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#simplex-cryptographic-design-review-by-trail-of-bits">New security audit</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#review-findings-our-comments-and-improvements">review findings</a>, our comments and improvements.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#next-security-audit-in-2025">next</a>: security audit in early 2025.</li> +</ul> +<p><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#whats-new-in-v61">What's new in v6.1</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-calls">better calls</a>.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-ios-notifications">better iOS notifications</a>.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-user-experience">better user experience</a>.</li> +</ul> +<h2 id="simplex-cryptographic-design-review-by-trail-of-bits" tabindex="-1">SimpleX cryptographic design review by Trail of Bits</h2> +<img src="https://simplex.chat/blog/images/20221108-trail-of-bits.jpg" width="240" class="float-to-right" /> +<p>It's been almost two years since Trail of Bits did the first security assessment of SimpleX Chat.</p> +<p>Since then SimpleX Chat grew a lot, both in the number of users and in its functionality. We added XFTP — a protocol for sending files, — and XRCP — the protocol for using a mobile app profile from a desktop app. Messaging protocols also evolved a lot, adding private message routing and quantum resistant encryption.</p> +<p>Trail of Bits reviewed the design of protocols used in SimpleX network and applications in July 2024. Even though there are no critical issues, we made some security improvements based on this report.</p> +<p><a href="https://www.trailofbits.com/about">Trail of Bits</a> is a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects. Its engineers reviewed the cryptographic design of the protocols used in SimpleX network and applications over a week:</p> +<ul> +<li>SimpleX Messaging Protocol (SMP), including a formal verification of currently used message queue negotiation protocol,</li> +<li>the SMP agent protocol,</li> +<li>the push notification system,</li> +<li>the file transfer protocol (XFTP),</li> +<li>the remote control protocol (XRCP),</li> +<li>and the chat protocol.</li> +</ul> +<p>There are 3 medium and 1 low severity findings, all of which require a high difficulty attack to exploit — the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. Additionally, there are 3 informational findings.</p> +<p>3 of these issues are improved in v6.1, and the remaining issues are accepted. Below we are commenting on these findings in detail, and also on the released improvements.</p> +<p>The full cryptographic design review is available <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SimpleX_Design_Review_2024_Summary_Report_12_08_2024.pdf">here</a>.</p> +<p>We are very thankful to Trail of Bits and their engineers for their work identifying these issues and helping us make SimpleX Chat more secure.</p> +<h3 id="review-findings-our-comments-and-improvements" tabindex="-1">Review findings, our comments and improvements</h3> +<h4 id="protocols-specifications-informational" tabindex="-1">Protocols specifications (informational)</h4> +<p>The review finding #1 is that the protocols specification is informal. We addressed <a href="https://github.com/simplex-chat/simplexmq/commit/7b6c86c6c1093cdae5ad2ee566655828076bc25c">reported</a> <a href="https://github.com/simplex-chat/simplex-chat/commit/1cb3c25478db0f2a42c943f7469f5f9f75752a27">inconsistencies</a>, and we accept that we need to improve specification beyond verbose descriptions and ABNF syntax specification, and add algebraic notations and sequence diagrams. Having said that, the current specification correctly describes the implemented protocol, without any contradictions.</p> +<h4 id="user-correlating-attacks-via-introduced-latency-or-via-get-command-of-messaging-protocol-medium-and-low-severity" tabindex="-1">User-correlating attacks via introduced latency or via GET command of messaging protocol (medium and low severity)</h4> +<p>These two findings #7 and #2 of the report relate to the attacks confirming that two known users communicate via observing their internet traffic.</p> +<p>The first attack is possible for a party that can introduce the latency in the network traffic. This attacker has to control some network node that passes the traffic of the sender — for example, it could be the sender's ISP, VPN provider, Tor entry node operator, the operator of the forwarding SMP server or a server hosting provider, etc. Such attacker can correlate delays in sender's traffic and the suspected recipient's traffic to confirm that they communicate.</p> +<p>The second attack relates to GET command used by iOS clients receiving notifications — depending on whether the server has the message, there will be a different number of packets sent, allowing the observer to determine if there was the message. While this comment is correct, in practice iOS clients only send GET commands when they receive notification, which also happens only when there is a message on the server, so in absolute majority of cases the number of packets will be the same.</p> +<p>These are not new findings — this type of attacks is covered in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md#a-passive-adversary-able-to-monitor-a-set-of-senders-and-recipients">threat model</a>: <em>a passive adversary able to monitor a set of senders and recipients <strong>can</strong> perform traffic correlation attacks against senders and recipients and correlate senders and recipients within the monitored set, frustrated by the number of users on the servers</em>.</p> +<p>As threat model states, this attack is more likely to be successful with the less busy servers, and also for the users with few connections.</p> +<p>The recommendation of the review is to add optional randomized latency to message delivery that would reduce the opportunities for traffic correlation attacks — we consider adding it in the future.</p> +<h4 id="a-compromised-transport-protocol-allows-more-efficient-correlation-attacks-medium-severity" tabindex="-1">A compromised transport protocol allows more efficient correlation attacks (medium severity)</h4> +<p>The finding #3 is about the incorrect statement in threat model for SMP and XFTP protocols: <em>a passive adversary, able to monitor a set of senders and recipients, <strong>cannot</strong>, even in case of a compromised transport protocol perform traffic correlation attacks with any increase in efficiency over a non-compromised transport protocol</em>.</p> +<p>For protocols prior to v6.1 it is only partially correct, as responses to the commands that create a messaging queue or a file chunk include the identifiers both for senders and for the recipients, so if any observers were to compromise transport protocol (TLS) and record these identifiers, then they were able to correlate message senders with the recipients (and file recipients with the file senders).</p> +<p>The solution to make this correlation impossible even in case of compromised TLS is to encrypt these identifiers, as proposed in the review, or, better, encrypt the whole transmission inside TLS.</p> +<p>However unlikely is TLS being compromised, we added additional <a href="https://github.com/simplex-chat/simplexmq/pull/1317/files">transport encryption layer in SMP protocol</a>, where it can be more important, and we are going to add the same layer of encryption in XFTP protocol later, where we <a href="https://github.com/simplex-chat/simplexmq/commit/7b6c86c6c1093cdae5ad2ee566655828076bc25c">amended the threat model</a>.</p> +<h4 id="xrcp-protocol-recommendations-informational" tabindex="-1">XRCP protocol recommendations (informational)</h4> +<p>XRCP protocol is used for connecting desktop and mobile. There are two findings in the review:</p> +<ul> +<li>SHA256 was used as a KDF in XRCP (#4).</li> +<li>there was no forward secrecy or break-in recovery between sessions (#5).</li> +</ul> +<p>SHA256 is now <a href="https://github.com/simplex-chat/simplexmq/pull/1302/files">replaced with SHA3-256</a>, as was <a href="https://www.ietf.org/archive/id/draft-josefsson-ntruprime-hybrid-01.html">recommended</a> by the internet draft about hybrid key agreement that XRCP uses.</p> +<p>Even though XRCP sessions are short lived, and usually the connection happens over local network, we added forward secrecy to XRCP sessions <a href="https://github.com/simplex-chat/simplexmq/pull/1328/files">here</a> and <a href="https://github.com/simplex-chat/simplex-chat/pull/4926/files">here</a> — each request from desktop app to mobile app is now encrypted with a new key derived from chain ratchets. This improves security of this connection.</p> +<p>We believe that it is unnecessary to have in-session break-in recovery in XRCP protocol, as there is break-in recovery between the sessions.</p> +<h4 id="device-compromise-can-be-hidden-in-some-scenarios-medium" tabindex="-1">Device compromise can be hidden in some scenarios (medium)</h4> +<p>The finding #6 in the report is about an attacker who was not only able to break into the device and get a copy of the database, which would be mitigated by break-in recovery in <a href="https://simplex.chat/docs/glossary.html#double-ratchet-algorithm">double ratchet protocol</a>, but also was able to modify the state of the app database and to substitute the addresses and cryptographic keys of the messaging queues used with some contact with other message queues that the attacker controls.</p> +<p>Even though this is a very hard attack, if successful, it would allow the attacker intercepting all messages with this contact.</p> +<p>Effectively, it is a <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">man-in-the-middle attack</a>, where an intermediary is inserted via the app database modification. Such attack can be mitigated by periodic verification of security codes. Although, the attacker who was able to modify the state of the device, could have also modified the app itself, making it show the same security code as the compromised contact has, thus avoiding detection.</p> +<p>We accept that such an attack is possible, and we don't believe there is any viable defense against the attacker who can modify the device state. We may consider adding the measures to validate the database integrity, but they may be ineffective in case the app and/or operating system are compromised.</p> +<h3 id="next-security-audit-in-2025" tabindex="-1">Next: security audit in 2025</h3> +<p>We are planning the implementation security assessment with Trail of Bits in the beginning of 2025. It will be a twice bigger assessment than we did in 2022 — it will cover both the core of the app and the handling of cryptographic secrets in the mobile applications.</p> +<h2 id="whats-new-in-v61" tabindex="-1">What's new in v6.1</h2> +<p>This release has many user experience and stability improvements.</p> +<h3 id="better-calls" tabindex="-1">Better calls</h3> +<img src="https://simplex.chat/blog/images/20241014-calls.png" width="288" class="float-to-right" /> +<p>This release improves reliability and usability of the calls. Now you can enable the camera and share the screen from the desktop app even if the call started as a voice call. We've also fixed several issues that prevented calls from connecting.</p> +<p>This is a substantial change, and some issues may have been introduced - please report them.</p> +<p>We will be further improving the calls interface in the app in the next versions.</p> +<h3 id="better-ios-notifications" tabindex="-1">Better iOS notifications</h3> +<p>iOS notifications were added <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html">more than 2 years ago</a>, based on this <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html">system design</a>. Until recently we made almost no improvements to them. As the number of iOS users is growing, their reliability is insufficient. In addition to that, once we started the work on improving them, we have found several important issues, one of which was introduced recently, when we improved the speed of creating new connections.</p> +<p>This release fixes many important issues with iOS notifications delivery in iOS app, improves app performance and reduces traffic required to manage notifications.</p> +<p>We also fixed several notification server issues, made change that almost completely prevents losing notifications when notification servers are restarted, and added real-time monitoring to diagnose any issues with iOS notifications delivery.</p> +<p>This work is not over – iOS notifications in a decentralized network are complex and require more work. We will be further improving both client apps and servers to make their delivery stable.</p> +<h3 id="better-user-experience" tabindex="-1">Better user experience</h3> +<h4 id="new-conversation-layout-and-customizable-messages" tabindex="-1">New conversation layout and customizable messages</h4> +<img src="https://simplex.chat/blog/images/20241014-messages.png" width="288" class="float-to-right" /> +<p>Messages are now grouped when they are sent sequentially, with less than 60 seconds between them. We also made message shapes configurable, and separated the messages in different days. When you scroll conversation quickly, there will be a floating date indication, allowing to find messages faster.</p> +<h4 id="improved-switching-between-user-profiles" tabindex="-1">Improved switching between user profiles</h4> +<p><img src="https://simplex.chat/blog/images/20241014-profiles2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20241014-profiles1.png" width="288" class="float-to-right" /></p> +<p>Another improvement relates to switching between chat profiles. Previously, when you added multiple chat profiles to the app, there were two problems:</p> +<ul> +<li>you had to tap twice to get to some important functions in the app,</li> +<li>anybody who could see your screen, could also see all your chat profiles.</li> +</ul> +<p>We changed this design by making important functions available after tapping profile image once, and by only showing the previously used profile image to switch to it quickly, while switching to other profiles now requires scrolling to them or opening <em>Your chat profiles</em> screen.</p> +<p>You also can switch chat profile when creating a one-time invitation link.</p> +<h4 id="faster-deletion-moderation-and-forwarding-of-messages" tabindex="-1">Faster deletion, moderation and forwarding of messages</h4> +<img src="https://simplex.chat/blog/images/20241014-forward.png" width="288" class="float-to-right" /> +<p>You now can forward multiple messages at once - up to 20. If you are forwarding messages with files or media, and they were not received, the app will offer you to download them, and it will also allow forwarding messages without files. These messages will be &quot;packed&quot; into the smallest number of sent messages as possible. If there are no images and messages are not too large, it will be just one sent message containing all forwarded messages.</p> +<p>The previous version allowed deleting and moderating multiple messages. As most users now upgraded the app, we increased the maximum number of messages that can be deleted or moderated to 200 messages - in most cases all these deletions will be packed into one sent message.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20241016-wired-attack-on-privacy.html + + 2024-10-16T00:00:00Z + + Wired’s Attack on Privacy + <h1 id="wireds-attack-on-privacy" tabindex="-1">Wired’s Attack on Privacy</h1> +<p><strong>Published:</strong> Oct 16, 2024</p> +<img src="https://simplex.chat/blog/images/20241016-wired-privacy.jpg" width="330" class="float-to-right" /> +<p>The <a href="https://www.wired.com/story/neo-nazis-flee-telegram-encrypted-app-simplex/">Wired article</a> by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in privacy policy is biased and misleading. By cherry-picking information from <a href="https://www.isdglobal.org/digital_dispatches/neo-nazi-accelerationists-seek-new-digital-refuge-amid-looming-telegram-crackdown/">the report</a> by the Institute for Strategic Dialogue (ISD), Wired fails to mention that SimpleX network design prioritizes privacy in order to protect human rights defenders, journalists, and everyday users who value their privacy — many people feel safer using SimpleX than non-private apps, being protected from strangers contacting them.</p> +<p>Yes, privacy-focused SimpleX network offers encryption and anonymity — that’s the point. To paint this as problematic solely because of who may use such apps misses the broader, critical context.</p> +<p>SimpleX’s true strength lies in protection of <a href="https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html">users' metadata</a>, which can reveal sensitive information about who is communicating, when, and how often. SimpleX protocols are designed to minimize metadata collection. For countless people, especially vulnerable groups, these features can be life-saving. Wired article ignores these essential protections, and overlooks the positive aspects of having such a unique design, as noted in the publication which <a href="https://www.maargentino.com/is-telegrams-privacy-shift-driving-extremists-toward-simplex/">they link to</a>:</p> +<blockquote> +<p><em>“SimpleX also has a significant advantage when it comes to protecting metadata — the information that can reveal who you’re talking to, when, and how often. SimpleX is designed with privacy at its core, minimizing the amount of metadata collected and ensuring that any temporary data necessary for functionality is not retained or linked to identifiable users.”</em></p> +</blockquote> +<p>Both publications referenced by Wired also explore how SimpleX design actually hinders extremist groups from spreading propaganda or building large networks. SimpleX design restricts message visibility and file retention, making it far from ideal for those looking to coordinate large networks. Yet these important qualities are ignored by Wired in favor of fear-mongering about encryption — an argument we've seen before when apps like Signal <a href="https://foreignpolicy.com/2021/03/13/telegram-signal-apps-right-wing-extremism-islamic-state-terrorism-violence-europol-encrypted/">faced similar treatment</a>. Ironically, Wired just a month earlier encouraged its readers to <a href="https://www.wired.com/story/gadget-lab-podcast-657/">adopt encrypted messaging apps</a>, making its current stance even more contradictory.</p> +<p>The vilification of apps that offer critically important privacy, anonymity, and encryption must stop. That a small share of users may abuse these tools doesn’t justify broad criticism. Additionally, the lobbying for client-side scanning, which Wired’s article seems to indirectly endorse, is not only dangerous but goes against fundamental principles of free speech and personal security. We strongly oppose the use of private communications for any kind of monitoring, including AI training, which would undermine the very trust encryption is designed to build.</p> +<p>It’s alarming to see Wired not only criticize SimpleX for its strong privacy protections but also subtly blame the European Court of Human Rights for <a href="https://www.theregister.com/2024/02/15/echr_backdoor_encryption/">upholding basic human rights</a> by rejecting laws that would force encrypted apps to scan and hand over private messages before encryption. Wired writes:</p> +<blockquote> +<p><em>…European Court of Human Rights decision in February of this year ruled that forcing encrypted messaging apps to provide a backdoor to law enforcement was illegal. This decision undermined the EU’s controversial proposal that would potentially force encrypted messaging apps to scan all user content for identifiers of child sexual abuse material.</em></p> +</blockquote> +<p>This commentary is both inappropriate and misguided — it plays into the hands of anti-privacy lobbyists attempting to criminalize access to private communications. Framing privacy and anonymity as tools for criminals ignores the reality that these protections are essential for millions of legitimate users, from activists to journalists, to ordinary citizens. Client-side scanning can't have any meaningful effect on reducing CSAM distribution, instead resulting in increase of crime and abuse when criminals get access to this data.</p> +<p>We need to correct this narrative. The real danger lies not in protecting communication, but in failing to do so. Privacy apps like SimpleX are crucial, not just for those resisting mass surveillance, but for everyone who values the right to communicate without fear of their conversations being monitored or misused. This is a right we must defend and incorporate into law, <a href="https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html">as we wrote before</a>.</p> +<p>Wired could have stood on the right side of this battle and helped normalize the demand for privacy, genuinely protecting people from criminals and from the exploitation of the increasingly AI-enabled mass surveillance. Instead they chose the path of spreading fear and uncertainty of encrypted messaging and tools that enable privacy and anonymity.</p> +<p>Spreading misinformation about privacy and security undermines trust in the tools that protect us, making it easier to justify more invasive surveillance measures that chip away at our civil liberties.</p> +<p>Wired did not respond to our request for comment.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html + + 2024-11-25T00:00:00Z + + Servers operated by Flux - true privacy and decentralization for all users + <h1 id="servers-operated-by-flux-true-privacy-and-decentralization-for-all-users" tabindex="-1">Servers operated by Flux — true privacy and decentralization for all users</h1> +<p><strong>Published:</strong> Nov 25, 2024</p> +<ul> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#welcome-flux--the-new-servers-in-v62-beta1">Welcome, Flux</a> — the new servers in v6.2-beta.1!</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#whats-the-problem">What's the problem</a>?</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#using-two-operators-improves-connection-privacy">Using two operators improves connection privacy</a>.</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#simplex-decentralization-compared-with-matrix-session-and-tor">SimpleX decentralization</a> compared with Matrix, Session and Tor.</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#whats-next-for-simplex-network-decentralization">What's next</a> for SimpleX network decentralization?</li> +</ul> +<h2 id="welcome-flux-the-new-servers-in-v62-beta1" tabindex="-1">Welcome, Flux – the new servers in v6.2-beta.1!</h2> +<img src="https://simplex.chat/blog/images/20241125-operators-1.png" width="288" class="float-to-right" /> +<p><a href="https://runonflux.com/">Flux</a> is a decentralized cloud infrastructure that consists of user-operated nodes [1]. With this beta release all SimpleX Chat users can use pre-configured Flux servers to improve metadata privacy and decentralization.</p> +<p>We are very grateful to <a href="https://x.com/dak_flux">Daniel Keller</a>, CEO and co-founder of Flux, for supporting SimpleX network, and betting on our vision of extreme decentralization of communication. Flux investing their infrastructure in our vision is a game changer for us and our users.</p> +<p>Download new mobile and desktop SimpleX apps from <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight</a> (iOS), <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a>, our <a href="https://simplex.chat/fdroid/">F-Droid repo</a> or <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.2.0-beta.1">GitHub</a>.</p> +<p>Read on to learn why it is important and how using several operators improves metadata privacy.</p> +<h2 id="whats-the-problem" tabindex="-1">What's the problem?</h2> +<p>SimpleX network is fully decentralized, without any central component or bootstrap nodes — you could use your own servers from day one. While there is no full list of SimpleX network servers, we see many hundreds of servers in public groups.</p> +<p>But a large number of SimpleX app users use the servers pre-configured in the app. Even though the app randomly chooses 4 servers in each connection to improve privacy and security, prior to v6.2 for these users the servers were operated by the same company — ourselves.</p> +<p>Our open-source code that we are <a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#legally-binding-transparency">legally bound to use</a> doesn't provide any metadata that could be used to learn who connects to whom. But the privacy of users' connections still depends on us honouring our promises and <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/PRIVACY.md">privacy policy</a>. Flux servers in the app improve that.</p> +<h2 id="using-two-operators-improves-connection-privacy" tabindex="-1">Using two operators improves connection privacy</h2> +<img src="https://simplex.chat/blog/images/20241125-operators-2.png" width="288" class="float-to-right" /> +<p>To ensure that the users' metadata from different servers cannot be combined to discover who talks to whom, the servers in each connection have to be operated by different independent organizations.</p> +<p>Before this version the app was choosing servers randomly. Now, when both SimpleX Chat and Flux servers are enabled it will always choose servers of different operators in each connection to receive messages and for <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a>, increasing metadata privacy for all users.</p> +<p>Flux servers are configured as opt-in, and the privacy policy and conditions of use that apply to Flux servers are the same as for SimpleX Chat servers, to make it simple for the users.</p> +<p>To improve connection privacy by using Flux servers all you have to do is to enable Flux once the app offers it, or later, via Network &amp; servers settings, and accept that the same conditions apply.</p> +<img src="https://simplex.chat/blog/images/20241125-operators-3.png" width="330" class="float-to-left" /> +<p>By default, if both Flux and SimpleX servers are enabled in this version, you will be using SimpleX Chat servers to receive messages, Flux servers to forward messages to SimpleX Chat servers, and the servers of both to forward messages to unknown servers. We will enable Flux to receive messages by default a bit later, or you can change it now via settings.</p> +<p>Any additional servers you add to app configuration are treated as belonging to another operator, so they will also be used to improve connection privacy, together with pre-configured servers, unless you disable them.</p> +<h2 id="simplex-decentralization-compared-with-matrix-session-and-tor" tabindex="-1">SimpleX decentralization compared with Matrix, Session and Tor</h2> +<p>SimpleX network decentralization model is different from other decentralized networks in several important aspects.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Communication network</th> +<th style="text-align:center">SimpleX</th> +<th style="text-align:center">Matrix</th> +<th style="text-align:center">Session</th> +<th style="text-align:center">Tor-based</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">Full decentralization</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +<tr> +<td style="text-align:left">No user profile identity</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +<tr> +<td style="text-align:left">Connection privacy</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">✅</td> +</tr> +<tr> +<td style="text-align:left">Server operator transparency</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +</tbody> +</table> +<p><strong>Full decentralization</strong></p> +<p>Fully decentralized networks do not have a central component, bootstrap nodes or any global shared state, like in cryptocurrency/blockchain-based communication networks. The presence of any central component or shared state introduces an attack vector that undermines privacy and security of the network.</p> +<p><strong>No user profile identity</strong></p> +<p>User profile identities, even if it is only a random number or a long-term key, undermine privacy of users connections, because in some cases they may allow network operators, observers and users to find out who talks to whom.</p> +<p>Most communication networks rely on fixed user profile identities. It includes Matrix and communication networks with onion routing.</p> +<p>SimpleX network design avoids the need for profile identities or keys, while still allowing optional long-term addresses for users and groups for convenience. It protects users from being discovered and approached by malicious parties, and many family users chose to use SimpleX with children because of it.</p> +<p><strong>Connection privacy</strong></p> +<p>SimpleX network has <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a> (2-hop onion routing) — it prevents server operators from discovering who connects to whom via network traffic metadata. Onion routing used in Tor-based messengers and in Session also hides it. But because neither Tor nor Session users have knowledge about who operates servers, in some cases the clients may connect via the servers controlled by one entity, that may learn the IP addresses of both parties.</p> +<p>Statistically, if traffic metadata from 2% of onion network servers is available to an attacker, and the client chooses servers randomly, after about 1750 of such choices the probability of choosing attacker's servers as both entry and exit nodes, and connection privacy being compromised becomes over 50% [2].</p> +<p>Matrix network does not provide connection privacy, as not only user identity exists, it is tied to a specific server that knows all user connections and a part of user's contacts connections. What is worse, Element — the most widely used Matrix app — offers the servers of only one organization to create an account, resulting in some degree of network centralization.</p> +<p><strong>Server operator transparency</strong></p> +<p>Operator transparency means that network users know who operates the servers they use.</p> +<p>You may argue that when the operators are known, the servers data can be requested by the authorities. But such requests, in particular when multiple operators are used by all users, will follow a due legal process, and will not result in compromising the privacy of all users.</p> +<p>With Tor and Session networks such legal process becomes impossible, and some users may see it as advantage. But nothing prevents the attackers, both criminal and corporate- or state-funded, to compromise the privacy of Tor or Session users by running many servers, or by purchasing traffic metadata from the existing server owners — there are no legal conditions that prohibit server owners of these networks to share or sell traffic data.</p> +<p>Because of that, we see operator transparency in SimpleX network as a better trade-off for privacy of most users than operator anonymity provided by Session and Tor. You can see privacy of network participants as a zero sum game — for the end users to have it, server operators should be known.</p> +<h2 id="whats-next-for-simplex-network-decentralization" tabindex="-1">What's next for SimpleX network decentralization</h2> +<p>SimpleX network is designed for extreme decentralization — not only users are distributed across network operators, as happens with federated networks, but each conversation will be relying on servers of 4-6 independent operators, and these operators will be regularly and automatically changed in the near future.</p> +<p>We believe that the only viable commercial model is freemium — a small share of paying users, who have better service quality and additional features, sponsors free users. This model doesn't have downsides of exploitative &quot;provide service, sell data&quot; approaches, that technology monopolies practice, and it also doesn't have problems of cryptocurrency blockchains, that have shared and immutable state, and also have regulatory problems.</p> +<p>To provide this extreme decentralization with freemium model we will create the system of payments allowing server operators to receive money for infrastructure certificates that will be used with any other participating network operators without compromising privacy of the paying users. You can read about this model <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-04-26-commercial-model.md">here</a>. We will be writing more about it as this development progresses.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +<p>[1]: You can also to self-host your own SimpleX servers on <a href="https://home.runonflux.io/apps/marketplace?q=simplex">Flux decentralized cloud</a>.</p> +<p>[2]: The probability of connection being de-anonymized and the number of random server choices follow this equation: <code>(1 - s ^ 2) ^ n = 1 - p</code>, where <code>s</code> is the share of attacker-controlled servers in the network, <code>n</code> is the number of random choices of entry and exit nodes for the circuit, and <code>p</code> is the probability of both entry and exit nodes, and the connection privacy being compromised. Substituting <code>0.02</code> (2%) for <code>s</code>, <code>0.5</code> (50%) for <code>p</code>, and solving this equation for <code>n</code> we obtain that <code>1733</code> random circuits have 50% probability of privacy being compromised.</p> +<p>Also see <a href="https://ritter.vg/p/tor-v1.6.pdf">this presentation about Tor</a>, specifically the approximate calculations on page 76, and also <a href="https://blog.torproject.org/announcing-vanguards-add-onion-services/">Tor project post</a> about the changes that made attack on hidden service anonymity harder, but still viable in case the it is used for a long time.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html + + 2024-12-10T00:00:00Z + + SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps + <h1 id="simplex-network-preset-servers-operated-by-flux-business-chats-and-more-with-v62-of-the-apps" tabindex="-1">SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps</h1> +<p><strong>Published:</strong> Dec 10, 2024</p> +<p>What's new in v6.2:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#simplex-chat-and-flux-improve-metadata-privacy-in-simplex-network">SimpleX Chat and Flux</a> improve metadata privacy in SimpleX network.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#business-chats">Business chats</a> to provide support from your business to users of SimpleX network.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#better-user-experience">Better user experience</a>: open on the first unread, jump to quoted messages, see who reacted.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#improving-notifications-in-ios-app">Improving notifications in iOS app</a>.</li> +</ul> +<h2 id="whats-new-in-v62" tabindex="-1">What's new in v6.2</h2> +<h3 id="simplex-chat-and-flux-improve-metadata-privacy-in-simplex-network" tabindex="-1">SimpleX Chat and Flux improve metadata privacy in SimpleX network</h3> +<p><img src="https://simplex.chat/blog/images/20241210-operators-1.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20241210-operators-2.png" width="288" class="float-to-right" /></p> +<p>SimpleX Chat and <a href="https://runonflux.com/">Flux</a> (Influx Technology Limited) made an agreement to include messaging and file servers operated by Flux into the app.</p> +<p>SimpleX network is decentralized by design, but in the users of the previous app versions had to find other servers online or host servers themselves to use any other servers than operated by us.</p> +<p>Now all users can choose between servers of two companies, use both of them, and continue using any other servers they host or available online.</p> +<p>To use Flux servers enable them when the app offers it, or at any point later via Network &amp; servers settings in the app.</p> +<p>When both SimpleX Chat and Flux servers are enabled, the app will use servers of both operators in each connection to receive messages and for <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a>, increasing metadata privacy for all users.</p> +<p>Read more about why SimpleX network benefits from multiple operators in <a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html">our previous post</a>.</p> +<p>You can also read about our plan <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-04-26-commercial-model.md">how network operators will make money</a>, while continuing to protect users privacy, based on network design rather than on trust to operators, and without any cryptocurrency emission.</p> +<h3 id="business-chats" tabindex="-1">Business chats</h3> +<img src="https://simplex.chat/blog/images/20241210-business.png" width="288" class="float-to-right" /> +<p>We use SimpleX Chat to provide support to SimpleX Chat users, and we also see some other companies offering SimpleX Chat as a support channel.</p> +<p>One of the problem of providing support via general purpose messengers is that the customers don't see who they talk to, as they can in all dedicated support systems.</p> +<p>It is not possible in most messengers, including SimpleX Chat prior to v6.2 - every new customer joins a one-to-one conversation, where the customers see that they talk to a company, not knowing who they talk to, and if it's a bot or a human.</p> +<p>The new business chats in SimpleX Chat solve this problem: to use them enable the toggle under the contact address in your chat profile. It is safe to do, and you can always toggle it off, if needed - the address itself does not change.</p> +<p>Once you do it, the app will be creating a new business chat with each connecting customer where multiple people can participate. Business chat is a hybrid of one-to-one and group conversation. In the list of chats you will see customer names and avatars, and the customer will see your business name and avatar, like with one-to-one conversations. But inside it works as a group, allowing customer to see who sent the message, and allowing you to add other participants from the business side, for delegation and escalation of customer questions.</p> +<p>This can be done manually, or you can automate these conversations using bots that can answer some customer questions and then add a human to the conversation when appropriate or requested by the customer. We will be offering more bot-related features to the app and a simpler way to program bots very soon - watch our announcements.</p> +<h3 id="better-user-experience" tabindex="-1">Better user experience</h3> +<img src="https://simplex.chat/blog/images/20241210-reactions.png" width="288" class="float-to-right" /> +<p><strong>Chat navigation</strong></p> +<p>This has been a long-standing complaint from the users: <em>why does the app opens conversations on the last message, and not on the first unread message</em>?</p> +<p>Android and desktop apps now open the chat on the first unread message. It will soon be done in the iOS app too.</p> +<p>Also, the app can scroll to the replied message anywhere in the conversation (when you tap it), even if it was sent a very long time ago.</p> +<p><strong>See who reacted!</strong></p> +<p>This is a small but important change - you can now see who reacted to your messages!</p> +<h3 id="improving-notifications-in-ios-app" tabindex="-1">Improving notifications in iOS app</h3> +<p>iOS notifications in a decentralized network is a complex problem. We <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html#ios-notifications-require-a-server">support iOS notifications</a> from early versions of the app, focussing on preserving privacy as much as possible. But the reliability of notifications was not good enough.</p> +<p>We solved several problems of notification delivery in this release:</p> +<ul> +<li>messaging servers no longer lose notifications while notification servers are restarted.</li> +<li>Apple can drop notifications while your device is offline - about 15-20% of notifications are dropped because of it. The servers and the new version of the app work around this problem by delivering several last notifications, to show notifications correctly even when Apple drops them.</li> +</ul> +<p>With these changes the iOS notifications remained as private and secure as before. The notifications only contain metadata, without the actual messages, and even the metadata is end-to-end encrypted between SimpleX notification servers and the client device, inaccessible to Apple push notification servers.</p> +<p>There are two remaining problems we will solve soon:</p> +<ul> +<li>iOS only allows to use 25mb of device memory when processing notifications in the background. This limit didn't change for many years, and it is challenging for decentralized design. If the app uses more memory, iOS kills it and the notification is not shown – approximately 10% of notifications can be lost because of that.</li> +<li>for notifications to work, the app communicates with the notification server. If the user puts the app in background too quickly, the app may fail to enable notification for the new contacts. We plan to change clients and servers to delegate this task to messaging servers, to remove the need for this additional communication entirely, without any impact on privacy and security. This will happen early next year.</li> +</ul> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html + + 2024-12-18T00:00:00Z + + Oppose digital IDs – they break the law and lead to mass scale surveillance + <h1 id="oppose-digital-ids-they-break-the-law-and-lead-to-mass-scale-surveillance" tabindex="-1">Oppose digital IDs – they break the law and lead to mass scale surveillance</h1> +<p><strong>Published:</strong> Dec 18, 2024</p> +<img src="https://simplex.chat/blog/images/20241218-pub.jpg" width="330" class="float-to-right" /> +<p>Starting next year, the UK government plans to introduce <a href="https://www.telegraph.co.uk/politics/2024/12/08/digital-id-to-be-introduced-for-pubs-and-clubs/">digital ID cards</a> for the young people to prove their age when visiting pubs. While officials claim this system will remain optional, it's part of a broader government initiative to move more state functions online so that people can prove their identity for everything from paying taxes to opening a bank account using the government-backed app. This will be a step toward a society where every pub visit, purchase, and social interaction becomes a permanent digital record linked to a government-issued ID – a step to normalizing mass surveillance at scale.</p> +<p>Digital IDs are promoted as a way to fight law violations, and some politicians support them as <a href="https://www.telegraph.co.uk/politics/2024/07/10/id-cards-inevitable-tackle-immigration-lord-blunkett-labour/">a way to tackle illegal immigration</a>. But digital IDs themselves break the law. Article 8 of the European Convention of Human Rights says: “Everyone has the right to respect for his private and family life”. It means that not only our right to privacy is enshrined in the law, but the right to have our privacy respected is also part of the law. Asking to present a digital ID when visiting a pub, even if it is optional, disrespects our privacy, and is therefore illegal.</p> +<p>Digital IDs would not stop people who decide to break laws. Pubs already can refuse to serve alcohol to young people and require the ID in case the age is in doubt. And illegal immigration can also be reduced without any digital IDs. But introducing digital IDs and collecting our actions, names and locations in one government-controlled database will result in making this information easier to access for criminals, and being exploited for financial and identity crimes.</p> +<p>What starts as a &quot;convenient option&quot; is likely to end as a mandatory requirement. The digital ID systems being pushed by governments and corporations aren't about making our lives easier. They're about tracking, monitoring, and controlling every move we make. And we can see <a href="https://www.wired.com/story/china-social-credit-system-explained/">where this road leads in China</a>, when IDs and social scores created for convenience are used to prevent access to basic services and bank accounts as a punishment for legal social media posts that the government disagrees with. What started as a convenience, is now trialed <a href="https://www.thesun.ie/news/13154812/china-installs-toilet-timers-to-broadcast-time-spent/">to track the duration of public toilet visits</a>.</p> +<p>The United Kingdom is a democratic country, and the law protects our right to privacy and freedom of speech. If we accept digital IDs as something required for simple things, like buying a drink, it leaves the door wide open to a range of privacy violations.</p> +<p>We call on everyone to oppose the digital ID systems. Do not use them. Do not install these systems in your pub, for as long as it is not legally required. Support local businesses that don’t use them. Protect your privacy and freedom by using software that respects them. Demand that your privacy is respected, as required by law.</p> +<p>To make your voice heard, email your MP expressing your rejection of digital IDs as a violation of European Convention of Human Rights in three simple steps:</p> +<ol> +<li><strong>Copy the text below</strong> or <a href="mailto:?subject=Please%20oppose%20the%20plan%20for%20Digital%20IDs&amp;body=Dear%20%E2%80%A6%2C%0A%0AI%20object%20to%20the%20introduction%20of%20digital%20IDs%20in%20pubs%20or%20any%20other%20public%20places%20for%20these%20reasons%3A%0A%0A1.%20It%20violates%20the%20European%20Convention%20of%20Human%20Rights%2C%20article%208%3A%20%E2%80%9CEveryone%20has%20the%20right%20to%20respect%20for%20his%20private%20and%20family%20life%E2%80%9D%20(https%3A%2F%2Ffra.europa.eu%2Fen%2Flaw-reference%2Feuropean-convention-human-rights-article-8-0).%0AAsking%20to%20present%20digital%20IDs%20when%20proof%20of%20identity%20is%20not%20legally%20required%2C%20even%20if%20it%20is%20optional%2C%20disrespects%20our%20privacy%2C%20and%20is%20therefore%20illegal.%0A%0A2.%20It%20will%20not%20be%20an%20effective%20measure%20in%20reducing%20the%20violations%20of%20the%20law.%20People%20who%20want%20to%20circumvent%20it%2C%20will%20find%20a%20way.%0A%0A3.%20It%20will%20increase%20crime%2C%20because%20combining%20a%20large%20amount%20of%20private%20information%20in%20a%20single%20system%20increases%20the%20risks%20of%20this%20information%20becoming%20available%20to%20criminals%2C%20who%20will%20exploit%20it%20for%20financial%20crimes%20and%20identity%20theft.%0A%0AI%20kindly%20ask%20you%20to%20oppose%20this%20plan%2C%20both%20publicly%20and%20during%20any%20discussions%20in%20the%20UK%20Parliament.%0A%0ASincerely%20yours%2C%0A%E2%80%A6">click this link</a> to copy it into email app:</li> +</ol> +<p><em>Dear …,</em></p> +<p><em>I object to the introduction of digital IDs in pubs or any other public places for these reasons:</em></p> +<ol> +<li><em>It violates the European Convention of Human Rights, article 8: “Everyone has the right to respect for his private and family life” (<a href="https://fra.europa.eu/en/law-reference/european-convention-human-rights-article-8-0">https://fra.europa.eu/en/law-reference/european-convention-human-rights-article-8-0</a>).</em><br /> +<em>Asking to present digital IDs when proof of identity is not legally required, even if it is optional, disrespects our privacy, and is therefore illegal.</em></li> +<li><em>It will not be an effective measure in reducing the violations of the law. People who want to circumvent it, will find a way.</em></li> +<li><em>It will increase crime, because combining a large amount of private information in a single system increases the risks of this information becoming available to criminals, who will exploit it for financial crimes and identity theft.</em></li> +</ol> +<p><em>I kindly ask you to oppose this plan, both publicly and during any discussions in the UK Parliament.</em></p> +<p><em>Sincerely yours,</em><br /> +<em>…</em></p> +<ol start="2"> +<li> +<p><a href="https://members.parliament.uk/members/Commons"><strong>Find the email address of your MP</strong></a> and copy it to the email.</p> +</li> +<li> +<p>Fill in the blanks, edit the text if needed, and <strong>send it</strong>!</p> +</li> +</ol> +<p>Public opposition changed government decisions in many cases.</p> +<p>It is your opportunity to tell the government which country you want to live in — please use it!</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html + + 2025-01-14T00:00:00Z + + SimpleX network: large groups and privacy-preserving content moderation + <h1 id="simplex-network-large-groups-and-privacy-preserving-content-moderation" tabindex="-1">SimpleX network: large groups and privacy-preserving content moderation</h1> +<p><strong>Published:</strong> Jan 14, 2025</p> +<img src="https://simplex.chat/blog/images/20250114-locked-books.jpg" width="345" class="float-to-right" /> +<p>Many people believe that it is impossible to moderate and prevent abuse in end-to-end encrypted conversations. This belief is incorrect — there is a way to prevent abuse and distribution of illegal content without any compromises to users' privacy and security of end-to-end encryption.</p> +<p>Anti-privacy lobbyists use this incorrect belief to advocate for scanning of private communications, which not only would fail to prevent abuse, but would make it worse — because our private data will become available to criminals.</p> +<p>So it's very important to understand how privacy preserving content moderation works, and educate the politicians who you voted for, and who is currently in the office, that we do not need to compromise privacy and security in any way to substantially reduce online crime and abuse.</p> +<p>This post answers these questions:</p> +<ul> +<li>Why <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#large-groups-on-simplex-network">large groups on SimpleX network</a> don't work well?</li> +<li>How do we plan to <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#can-large-groups-scale">make them scale</a>?</li> +<li>How do <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-abuse-with-anonymous-participation">group owners prevent abuse</a> when people participate anonymously?</li> +<li>How do server operators <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-server-abuse-without-compromising-e2e-encryption">prevent abuse of their servers</a> and <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#privacy-preserving-content-moderation">how these measures will evolve</a> without any compromises to privacy and end-to-end encryption?</li> +<li>Which <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#privacy-and-security-improvements-we-plan-this-year">privacy and security improvements</a> we plan this year?</li> +</ul> +<h2 id="large-groups-on-simplex-network" tabindex="-1">Large groups on SimpleX network</h2> +<p>When we designed groups, we expected them to be used primarily for small groups where people know each other, with not more than 100 or so members.</p> +<p>But we learnt that people want to participate in public discussions remaining anonymous — it protects their freedom of speech. As an experiment, we are curating a small <a href="https://simplex.chat/docs/directory.html">directory of groups</a> that currently has almost 400 public groups, with the largest ones having thousands of members. You can connect to this experimental directory via <a href="https://simplex.chat/contact#/?v=2-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">SimpleX chat address</a>.</p> +<h2 id="can-large-groups-scale" tabindex="-1">Can large groups scale?</h2> +<p>Currently the groups are fully decentralized, and every time you send the message to some group your client has to send it to each group member, which is very costly for traffic and battery in large groups.</p> +<p>We are currently working on the new group architecture when dedicated group members that run their clients on the server or on desktop with good internet connection will re-broadcast messages to all members — these members are &quot;super-peers&quot;.</p> +<p>We will be offering pre-configured super-peers via the app, and you will be able to use your own super-peers, in case you are hosting a large private group, and to have a better control and ownership of the group — e.g., if we decide to remove our super peer from the group, it will continue to function thanks to your super-peer re-broadcasting messages.</p> +<p>This new design improves both privacy of group participation and censorship resistance of the groups, and also makes abusing the group harder.</p> +<h2 id="preventing-abuse-with-anonymous-participation" tabindex="-1">Preventing abuse with anonymous participation</h2> +<p>All public discussions are abused by spammers and trolls, whether anonymous or not. We have been evolving ability of group owners to moderate conversations by allowing to remove inappropriate and off-topic messages, to block members who send spam, and to make all new members who join their group unable to send messages until approved.</p> +<p>As support for large groups improves, we expect that the attempts to abuse may increase too, unless we add better moderation capabilities in advance.</p> +<p>v6.3 will add ability of the group members to send reports to the group owners and administrators — the beta version we just released adds ability to manage these reports, so group admins won't miss reports when members start sending them.</p> +<p>Other features that we plan to add this year to improve both usability and safety of the groups:</p> +<ul> +<li>message comments — some groups may choose to allow only comments, when ability to send messages is restricted to group owners or admins.</li> +<li>ability to limit the maximum number of messages the members can send per day.</li> +<li>ability to pre-moderate messages before they can be seen by all members.</li> +<li>&quot;knocking&quot; — approving new members before they can join the group.</li> +<li>sub-groups — smaller conversations with the same members.</li> +</ul> +<h2 id="preventing-server-abuse-without-compromising-e2e-encryption" tabindex="-1">Preventing server abuse without compromising e2e encryption</h2> +<p>Some categories of content may be prohibited by servers operators. An extreme case would be child sexual abuse materials (CSAM).</p> +<p>Many people believe that when conversation is end-to-end encrypted, the problem is unsolvable. This incorrect belief is used by unscrupulous lobbyists and politicians who attempt to mandate various types of content scanning under the guise of preventing CSAM distribution.</p> +<p>We <a href="https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html">wrote before</a> about how such measures not only would fail to solve the problem, but would make it worse. If our private photos become available to service providers, they will eventually become available to criminals too, and will be used to abuse and exploit the users and their children.</p> +<p>An absolute majority of CSAM distributed online is publicly accessible. Many large tech companies failed to act on it and to remove CSAM from their services before it became an epidemic. We see it as a very important objective to eliminate the possibility to distribute CSAM from publicly accessible groups, even if it hurts network growth.</p> +<p>When we receive a user complaint about CSAM shared in any group, we remove the files and, in some cases, the links to join the group from our servers. Our approach to moderation preserves user privacy and security of end-to-end encryption.</p> +<p>How does it work? Let's go over the process step by step.</p> +<ol> +<li> +<p>A user discovered the link to join the group that distributes CSAM and sent a complaint to our support email address or via the app to <a href="simplex:/contact#/?v=1&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D">SimpleX Chat team</a> contact.</p> +</li> +<li> +<p>Once we received the link to join the group, we instruct our automated bot to join it. If the complaint is confirmed as valid, the bot sends the information about the files sent in this group to the servers that store these files.</p> +</li> +<li> +<p>Once the servers receive the file identifiers from the bot, they block the files.</p> +</li> +</ol> +<p>File servers cannot look inside end-to-end encrypted files, and they don't even know file sizes — they are securely locked, and sent in chunks, across multiple servers. But if the bot that joined the group provides the address of the particular file, the server can delete this file. It doesn't allow the servers to access any other files.</p> +<p>In this way, the moderation is possible without any content scanning, and it preserves privacy and security of end-to-end encryption.</p> +<h2 id="privacy-preserving-content-moderation" tabindex="-1">Privacy-preserving content moderation</h2> +<p>Right now, when we act on user complaints, we delete uploaded files or the links to join the groups from our servers, and to the users it looks as if something stopped working.</p> +<p>We are currently rolling out the change to the servers that would mark these files and group links as blocked, so that users who try to download them or to join blocked groups can see that they were blocked for violating server operator conditions of use. This will improve transparency of moderation and reliability of the network.</p> +<p>Later this year we plan to do more than that — client-side restrictions on the clients that violated conditions of use by uploading prohibited content.</p> +<p>How would it work? When the client discovers that the uploaded file was blocked, it may, optionally, depending on the information in the blocking record, disable further uploads from the app to the servers of the operator that blocked the file. Also, when the client that tried to receive the file sees that the file is blocked, it may also refuse to receive further files from the same group member via the same servers.</p> +<p>In this way, the servers can restrict the future actions of the users who violate the conditions of use, while preserving privacy and security of the users and content – even of those users who violated the conditions.</p> +<p>We discussed this plan with the users, and we really appreciate their feedback. The current plan is quite different from our initial ideas, the users had a real impact. Users asked the questions below.</p> +<p><strong>Can't users modify their clients code to circumvent these restrictions?</strong></p> +<p>Yes, they can, but for this to work both sender and recipient would have to modify their clients. It's technically complex, so most users won't do it, and it is also hard to coordinate between users who don't know and don't trust each other.</p> +<p>So these measures would be effective, even though they can be in theory circumvented, as any restrictions can be.</p> +<p>Other services that identify users reduce abuse by blocking the user account. It is even easier to circumvent than changing the client code, and yet these measures reduce abuse.</p> +<p><strong>Can't users use other servers?</strong></p> +<p>Yes, they can. But in the same way as web browser is not responsible for the content you can access, SimpleX app should not restrict your communications with other servers based on blocking action from just one server.</p> +<p>That approach allows different server operators to have different content policies, depending on their jurisdiction and other factors. It also prevents the possibility of abuse by server operators.</p> +<p><strong>Wouldn't these measures be abused?</strong></p> +<p>With the proposed changes, server operators will only be able to prevent uploads to their own servers, which prevents any impact on other communications.</p> +<p>In the future we plan to increase the resilience to any server malfunction or abuse by using multiple different servers with each contact.</p> +<p>If servers were to apply any upload restrictions unreasonably, the users would simply stop using them.</p> +<p>At the same time, server operators need to have technical means to protect their servers from users' abuse, and the proposed client-side restrictions achieve it.</p> +<p><strong>What additional measures are considered?</strong></p> +<p>We published other technical ideas that could be used to prevent distribution of illegal content in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-12-30-content-moderation.md">this document</a>. None of these measures compromise users' privacy or end-to-end encryption, and they can (and should) only be applied to publicly accessible content that other users complained about.</p> +<p>We technically cannot, and we won't scan all content. We actively <a href="https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html">campaign against any content-scanning proposals</a>, because it violates our right to privacy, and it would result in huge increase of online crime.</p> +<p>The belief that it is impossible to moderate conversations when they are e2e encrypted is incorrect. It is possible when users themselves share conversation contents with server operators, in which case the operators can identify and, if necessary, remove this content. It is also possible to moderate conversations that users made publicly accessible.</p> +<h2 id="send-us-comments-and-questions" tabindex="-1">Send us comments and questions</h2> +<p>Let us know any comments and feedback to the proposed measures. This is still an evolving design, and it won't be implemented until later this year.</p> +<p>Your comments will help to find the right balance between users' and server operators' requirements.</p> +<h2 id="privacy-and-security-improvements-we-plan-this-year" tabindex="-1">Privacy and security improvements we plan this year</h2> +<p>To increase privacy and security we plan to add this year:</p> +<ul> +<li>quantum-resistant e2e encryption in small groups.</li> +<li>receiving proxy for files, to protect users IP addresses and other transport metadata from file senders' servers.</li> +</ul> +<p>We see privacy and security as necessary for online safety, and prevention of abuse. If you don't already use SimpleX network, try it now, and let us know what you need to make it better.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html + + 2025-03-08T00:00:00Z + + SimpleX Chat v6.3: new user experience and safety in public groups + <h1 id="simplex-chat-v63-new-user-experience-and-safety-in-public-groups" tabindex="-1">SimpleX Chat v6.3: new user experience and safety in public groups</h1> +<p><strong>Published:</strong> Mar 8, 2025</p> +<p><strong>What's new in v6.3</strong>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#preventing-spam-and-abuse-in-public-groups">preventing spam and abuse in public groups</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#group-improvements">group improvements</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#mention-other-members-and-get-notified-when-mentioned">mention other members</a>, <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#better-group-performance">improved performance</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#better-chat-navigation">better chat navigation</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#organize-chats-into-lists">organize chats into lists</a> and <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#jump-to-found-and-forwarded-messages">jump to found and forwarded messages</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#privacy-and-security-improvements">privacy and security improvements</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#set-message-retention-period-in-chats">chat retention period</a> and <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#private-media-file-names">private media file names</a>.</li> +</ul> +<p>Also, we added Catalan interface language to Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>The last but not the least - <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#reproducible-server-builds">server builds are now reproducible</a>.</p> +<h2 id="whats-new-in-v63" tabindex="-1">What's new in v6.3</h2> +<h2 id="preventing-spam-and-abuse-in-public-groups" tabindex="-1">Preventing spam and abuse in public groups</h2> +<p><a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html">We wrote before</a>: as the network grows, it becomes more attractive to attackers. This release adds several features that reduce the possibility of attacks and abuse.</p> +<h3 id="spam-in-groups-that-are-listed-in-our-group-directory" tabindex="-1">Spam in groups that are listed in our group directory</h3> +<p>There is no built-in group discovery in SimpleX Chat apps. Instead, we offer an experimental chat bot that allows to submit and to discover public groups. Not so long ago, spammers started sending messages via bots attempting to disrupt these groups.</p> +<p>We released several changes to the groups directory to protect from spam attacks.</p> +<p><strong>Optional captcha verification</strong></p> +<img src="https://simplex.chat/blog/images/20250308-captcha.png" width="288" class="float-to-right" /> +<p>Group owners can enable the requirement to pass captcha challenge before joining the group. Captcha is generated in the directory bot itself, without any 3rd party servers, and is sent to the joining member. The new member must reply with the text in the image to be accepted to the group. While not a perfect protection, this basic measure complicates programming automatic bots to join public groups. It also provides a foundation to implement &quot;knocking&quot; - a conversation with dedicated group admins prior to joining the group. We plan to release support for knocking in March.</p> +<p><strong>Profanity filter for member names</strong></p> +<p>While group settings support giving all joining member an &quot;observer&quot; role - that is, without the right to send messages - the attackers tried spaming groups by joining and leaving. We added an optional filter for member names that group owners can enable for groups listed in directory - if a member name contains profanity, they will be rejected. Further improvements will be released in March as well.</p> +<p>The current SimpleX directory chatbot is a hybrid of <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#can-large-groups-scale">future chat relays</a> (a.k.a. super-peers) we are now developing to support large groups, and of a directory service that will be embedded in the app UI later this year, allowing to search and to discover public groups. Anybody is able to run their own directory bots now, and there will be possibility to use third party directories via the app UI in the future too.</p> +<p>Read more about <a href="https://simplex.chat/docs/directory.html">SimpleX group directory</a>, how to submit your groups, and which groups we now accept. Currently we accept groups related to a limited list of topics that will be expanded once we have better moderation functionality for the groups.</p> +<h3 id="more-power-to-group-owners-and-moderators" tabindex="-1">More power to group owners and moderators</h3> +<p>This release includes two new features to help group moderators.</p> +<img src="https://simplex.chat/blog/images/20250308-reports.png" width="288" class="float-to-right" /> +<p><strong>Private reports</strong></p> +<p>Group members can privately bring to group moderators attention specific messages and members, even if the group does not allow direct messages. The simply need to choose report in the message context menu and choose the report reason. This report will be visible to all group owners and moderators, but not to other members.</p> +<p>Group moderators can see all member reports in a separate view, and quickly find the problematic messages, making moderation much easier in public groups. These reports are private to groups, they are not sent to server operators.</p> +<p>Please note: in the groups listed in our directory, the directory bot acts as admin, so it will receive all reports as well.</p> +<p><strong>Acting on multiple members at once</strong></p> +<p>When attackers come, they often use multiple profiles. This version allows selecting multiple members at once and perform these actions on all selected members:</p> +<ul> +<li>switch members role between &quot;observer&quot; and &quot;member&quot;.</li> +<li>block and unblock members - this is a &quot;shadow&quot; block, so when you block multiple members who you believe are attackers, their messages will be blocked for all other members but not for them.</li> +<li>remove members from the group.</li> +</ul> +<p>The next version will also allow to remove members together with all messages they sent - for example, if a spam bot joined and sent a lot of spam, but nothing of value.</p> +<h2 id="group-improvements" tabindex="-1">Group improvements</h2> +<h3 id="mention-other-members-and-get-notified-when-mentioned" tabindex="-1">Mention other members and get notified when mentioned</h3> +<img src="https://simplex.chat/blog/images/20250308-mentions.png" width="288" class="float-to-right" /> +<p>This feature allows you to mention other members in the group in the usual way - type <code>@</code> character, and choose the member you want to mention from the menu. Even that there is no user accounts and persistent identities we made it work by referencing members by their random group ID that is also used for replies and all other interactions in the group.</p> +<p>You can also now switch message notifications in the group to &quot;mentions only&quot; mode. You will be notified only when you are mentioned in a message, or when somebody replies to your message. Simply choose &quot;Mute&quot; in the context menu of the group in the list of chats to switch group notifications to &quot;mentions only&quot; mode. After that you can choose &quot;Mute all&quot; to disable all notifications, including mentions.</p> +<h3 id="better-group-performance" tabindex="-1">Better group performance</h3> +<p><strong>Send messages faster</strong></p> +<p>We didn't reduce the required network traffic to send messages to large groups yet - your client still has to send message to each member individually. But we redesigned the process of sending a message, reducing temporary storage required to schedule the message for delivery by about 100x. This creates a significant storage saving - e.g, to send one message to a group of 1,000 members previously required ~20Mb, and now it is reduced to ~200kb. It also reduces the time and battery used to send a message.</p> +<p><strong>Faster group deletion</strong></p> +<p>When you leave the group, the app preserves a copy of all your communications in the group. You can choose to keep it or to delete it completely. This final group deletion was very slow prior to this release - depending on the number of groups on your device it could sometimes take several minutes.</p> +<p>This release solved this problem – the time it takes to delete the group is reduced to seconds, and even in cases when the app is terminated half-way, it either rolls back or completes, but it cannot leave the group in a partially deleted state. It improves both user experience and privacy, as gives you better control over your data.</p> +<h2 id="better-chat-navigation" tabindex="-1">Better chat navigation</h2> +<h3 id="organize-chats-into-lists" tabindex="-1">Organize chats into lists</h3> +<img src="https://simplex.chat/blog/images/20250308-lists.png" width="288" class="float-to-right" /> +<p>It is a common feature in many messengers – it helps organizing your conversations.</p> +<p>The lists also show a blue mark when any chat in the list has new messages.</p> +<p>There are several preset lists: contacts, groups, private notes, business chats, favourite chats and also groups with member reports - the last list is automatically shown if members of any groups where you are the moderator or the owner sent private reports, until these reports are acted on or archived.</p> +<h3 id="jump-to-found-and-forwarded-messages" tabindex="-1">Jump to found and forwarded messages</h3> +<p>This version allows to quickly navigate from message in the search results to the point in the conversation when it was sent.</p> +<p>You can also navigate from the forwarded message (or from the message saved to private notes) to the original message in the chat where it was forwarded or saved from.</p> +<h2 id="privacy-and-security-improvements" tabindex="-1">Privacy and security improvements</h2> +<h3 id="set-message-retention-period-in-chats" tabindex="-1">Set message retention period in chats</h3> +<p>Before this version, you could enable message retention period for all chats in your profile. While helpful in some cases, many of us have conversations that we want to keep for a long time, and some other conversations that we want to remove quicker.</p> +<p>This version allows it - you can set different retention periods in different conversations. It can be 1 day, 1 week, 1 month or 1 year. We may allow custom retention time in the future.</p> +<h3 id="private-media-file-names" tabindex="-1">Private media file names</h3> +<p>Previously there were scenarios when original media file names were preserved - e.g., when sending a video file or when forwarding any media file. The latter problem was worse, as media file name is generated automatically, and includes timestamp. So the same name could have been used to correlate files between conversations, as one of our users pointed out.</p> +<p>This version fixes this problem - media file name is now changed when forwarding it to match the time of forwarding, so no additional metadata is revealed.</p> +<p>Please also note:</p> +<ul> +<li>the apps remove metadata from all static images,</li> +<li>iOS app removes metadata from videos, but android and desktop apps do not do it yet,</li> +<li>animated images are sent as is,</li> +<li>other file types are sent as is, and their names are left unchanged - we believe that for ordinary files their name is part of their content.</li> +</ul> +<p>We plan further improvements to reduce metadata in files in the near future – please let us know what you believe is the most important to reduce first.</p> +<h2 id="reproducible-server-builds" tabindex="-1">Reproducible server builds</h2> +<p>Starting from v6.3 server releases are reproducible!</p> +<p><strong>Why it is important</strong></p> +<p>With reproducible builds anybody can build servers from our code following the same process, and the build would produce identical binaries.</p> +<p>This also allows us to sign releases, as we reproduce GitHub builds ourselves and by signing them we attest that our builds resulted in identical binaries.</p> +<p><strong>How to reproduce builds</strong></p> +<p>You can reproduce our builds on Linux with x86 CPU in docker container - please follow the instructions <a href="https://simplex.chat/docs/server.html#reproduce-builds">here</a>.</p> +<p>We are looking for support from open-source contributors or security researchers who would also reproduce and sign our releases.</p> +<p><strong>How to verify release signature</strong></p> +<p>Please see the instructions <a href="https://simplex.chat/docs/server.html#verifying-server-binaries">here</a>.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html + + 2025-07-03T00:00:00Z + + SimpleX network: new experience of connecting with people &mdash; available in SimpleX Chat v6.4-beta.4 + <h1 id="simplex-network-new-experience-of-connecting-with-people-available-in-simplex-chat-v64-beta4" tabindex="-1">SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4</h1> +<p><strong>Published:</strong> Jul 3, 2025</p> +<p>The mission of communication network is connecting people [1]. The process of connecting in SimpleX network is really secure — it is protected from server MITM attacks. But before this beta version connecting to contacts had a really bad user experience.</p> +<h2 id="what-was-the-problem" tabindex="-1">What was the problem?</h2> +<p>How did it work before:</p> +<ol> +<li>Your contact created a large link (1-time invitation or contact address [2]) and shared with you via another messenger, email, social profile or website. Sharing the link &quot;out-of-band&quot; (i.e., not via the server) is necessary for security. But it was not working well in some cases:</li> +</ol> +<ul> +<li>the link was incorrectly changed by some applications, e.g. Telegram, because of link complexity, preventing people from connecting.</li> +<li>some people were worried that the link &quot;looks like malware&quot;.</li> +<li>the QR code for the link was large, and sometimes difficult to scan.</li> +<li>the link did not fit the size limit in social media profiles.</li> +</ul> +<ol start="2"> +<li>Once you received the link, you used it in the app. But when using the link you could not see who you were connecting to. The only choice you had is to share your current profile or to use incognito profile. And as people didn't know which profile will be shared with them, many were choosing to share incognito profile, making recognizing contacts more complex — you don't know who is who unless you attach aliases to incognito contacts.</li> +<li>Once you tap Connect, all you see is the line in the list of chats that said &quot;Connecting via link&quot;. The process of connection required your contact to be online, and in some cases to approve the request, so you may had contact in &quot;connecting&quot; state for a really long time.</li> +</ol> +<p>So it is not surprising that a large number of people failed connecting to friends — either they refused to engage because of large and scary looking links, or their application made the link unusable, or they abandoned the process at step 3, deciding that the app is not working correctly.</p> +<h2 id="why-cant-we-just-use-usernames" tabindex="-1">Why can't we just use usernames?</h2> +<p>Many people asked — why don't you just use usernames or a link shortener for some really short links, as other networks and apps do.</p> +<p>The problem is that usernames or very short links make e2e encryption security of your chats dependent on the servers. Unless the link you share contains enough randomness in it and is cryptographically linked to the encryption keys, the servers can substitute the e2e encryption keys and read all your communication without you knowing it. We see this risk as unacceptable.</p> +<p>Mitigation against this &quot;man-in-the-middle&quot; attack by the server [3] is offered by Signal and other apps via security code verification [4], when you compare the numeric code in your app with your contact's app, but:</p> +<ul> +<li>most people do not verify security codes, and even if they do, they do not re-verify them every time security code changes, so their security is dependent on the server not being compromised, which is not a great security,</li> +<li>the servers can still compromise the initial messages, where profile names are exchanged, before you had the chance to verify the security codes.</li> +</ul> +<p>When we design communication protocols for SimpleX network we always aim to protect you from the attack via your network operators — this is what sets SimpleX network design apart from many other communication networks and platforms.</p> +<p>Even though you choose the servers that you trust, and they are bound by privacy policy, and we follow the best security practices to protect servers from any 3rd party attacks, there is still a possibility that servers may be compromised by some attackers, and unless your communications are not protected from the servers, they are not protected from whoever can compromise the servers [5].</p> +<h2 id="what-is-the-new-way-to-make-connections" tabindex="-1">What is the new way to make connections?</h2> +<p>Before diving into the details of technology, let's walk though the new process of connecting to people that is introduced in <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.0-beta.4">v6.4-beta.4</a>.</p> +<img src="https://simplex.chat/blog/images/20250703-card.jpg" width="288" class="float-to-right" /> +<ol> +<li>As before, to connect you or your contact need to create a 1-time invitation or a contact address link. All the past problems of the long links are now solved:</li> +</ol> +<ul> +<li>this link is correctly processed by all applications, as it has a simple structure,</li> +<li>it is short and simple, e.g. the SimpleX Chat team address for support is: <a href="https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw">https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw</a></li> +<li>the QR code is now much smaller, fits a standard business card, and is easy to scan from all devices,</li> +<li>it fits in most social media profiles.</li> +</ul> +<p>While the link is short, it still contains 256 bits of key material with additional 192 bits of server-generated link ID for one-time invitation links, so the connection is as secure as before, and in case of one-time invitations it became more secure (see below).</p> +<p><img src="https://simplex.chat/blog/images/20250703-connect2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250703-connect1.png" width="288" class="float-to-right" /></p> +<ol start="2"> +<li> +<p>As before, you have to use this link in the app, either by pasting the link or scanning QR code. But now you instantly see the name of your contact or group you are connecting to, and from v6.4.1 that will be released this July you will also see a profile image (currently disabled for backward compatibility).</p> +</li> +<li> +<p>Once you tap &quot;Open new chat&quot;, the app will instantly open a conversation with your contact. As you now can see which profile is shared with you via the link, you can choose which of your profiles to use to connect. If your contact shared an incognito pseudonym, then you may also choose to connect incognito. But if your contact shared a real name, you may want to share your real name as well, making it easier for your contact to recognize you — the law of reciprocity in action! <strong>In any case, your and your contact's profile names are inaccessible to messaging servers — they are e2e encrypted</strong>.</p> +</li> +</ol> +<p>If you are connecting via a contact address you can also add a message to your request, making it more likely to be accepted when connecting to somebody you don't know well. And from v6.4.1 contact addresses can include a welcome message that you would see before connecting, right in the conversation. This way, you effectively become connected to your contact and start a secure conversation even before you tap &quot;Connect&quot; button.</p> +<p>If you are connecting via a one-time invitation link, all you need to do is to tap &quot;Connect&quot;, and then you can send messages straight after that, without waiting for your contact to be online — they will be securely received later.</p> +<p>This new experience of connecting is very similar to commonly used messengers, but it protects your security. We hope that it will be much easier for the new users to connect to their friends.</p> +<h2 id="what-about-security" tabindex="-1">What about security?</h2> +<p>We took a great care to design the protocol extension for the new experience of connecting in a way that not only preserves security at the same level as before, but also increases security of connecting via one-time invitation links.</p> +<p>First, because all the keys are now included in encrypted link data on the server, and not in the link itself as before, we can include the keys for post-quantum (PQ) key exchange and make the first message sent via one-time link (your profile) encrypted with PQ e2e encryption. Previously, PQ encryption started only after the response from your contact.</p> +<p>Second, whoever can observe the link is not able to determine which public keys are used in key exchange and what messaging queue address is used, and this data is removed from the server once the connection is established. Previously, the invitation link contained public keys and the actual queue address that could have been used for a long time, unless you rotated it.</p> +<p>Third, if somebody retrieves the associated data of one-time invitation link they observed in transit, this link would become inaccessible for the intended recipient, so the recipient would know that the connection was potentially compromised, and would alert the contact that sent the link.</p> +<h2 id="how-does-it-work" tabindex="-1">How does it work?</h2> +<p>In short, a new short link references a container with the encrypted data on the server that contains:</p> +<ul> +<li>the original full link that now include quantum-resistant keys that previously were not included because of their size,</li> +<li>contact's or group's profile and conversation preferences, from v6.4.1 it will include profile images,</li> +<li>also, it will include an optional contact's or group's welcome message from v6.4.1.</li> +</ul> +<p>Making user profile and welcome message included in the encrypted link data allows to start conversation as soon as you scan the link, as described in the previous section.</p> +<h3 id="design-objectives-and-cryptographic-primitives-that-achieve-them" tabindex="-1">Design objectives and cryptographic primitives that achieve them</h3> +<p>This section is not a formal specification of the protocol, but an informal technical explanation of objectives we had for this design and how they were achieved. The technical details are available in <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2025-03-16-smp-queues.md">this RFC document</a>.</p> +<ol> +<li><strong>Encrypted link data cannot be accessed by the server</strong>.</li> +</ol> +<p>It means that while the client apps should use the link to derive both the link ID for the server and decryption key for the associated link data, the server should not be able to derive the link and decryption key from the link ID that it knows, and can't access the link data.</p> +<p>This objective is achieved by using <code>secret_box</code> encryption of link data with the symmetric key derived from link URI, which is different from link ID known to the server. As it is a symmetric encryption, it is secure against quantum computers.</p> +<ol start="2"> +<li><strong>Allow changing encrypted link data without changing the link itself</strong>.</li> +</ol> +<p>This is necessary to allow changes in user profile, chat preferences and welcome messages.</p> +<p>This is possible via a specific server request that allows to change user-defined part of the link data to the link owner. Because the link is derived from fixed part of the link data, the link itself remains the same.</p> +<ol start="3"> +<li><strong>Prevent MITM attack on the link data by the server, even if the server obtained the link</strong>.</li> +</ol> +<p>It means that the server should not be able to replace the associated link data even if it somehow obtained the link and can decrypt the data.</p> +<p>This objective is achieved by deriving encryption key from the hash of the fixed part of the link data — if server changes the link data, it would be rejected by the client, as its hash won't match the link. Server also cannot replace the user-defined part of the link data, because it is signed and will be verified with the key included in the fixed part of link data.</p> +<p>Clients use <code>HKDF</code> for key derivation, <code>SHA3-256</code> to compute hash of the fixed part of link data, and <code>ED25519</code> signature to sign user-defined link data.</p> +<ol start="4"> +<li><strong>Prevent undetectably accessing encrypted link data of one-time links</strong>.</li> +</ol> +<p>This is explained in the previous section — if link observers retrieve the link data, the link will become inaccessible for the intended recipient.</p> +<p>This objective is achieved because the link data of 1-time invitation link data can only be accessed with the server request that locks queue on the first access. Any subsequent access to the queue must uses the same authorization key (<code>ED25519</code>).</p> +<ol start="5"> +<li><strong>The link owner cannot include address of another queue in the link</strong>.</li> +</ol> +<p>It means that the link cannot redirect the connecting party to another server or to another queue on the same server — the apps would reject the links that attempt to do it. While allowing redirects may be seen as higher security from the server, it would open the possibility of resource exhaustion attacks, as the server would not know if the links were actually used to connect or not, and when the link data can be removed. So we decided that preventing redirects is a better tradeoff. This cryptographically enforced association between link and queue allows to remove link data from the server once the connection is established, or once some time passes (e.g., 3 weeks for unused one-time invitation links).</p> +<p>This objective is achieved by including queue ID and link data into the same server response.</p> +<ol start="6"> +<li><strong>Prevent link owner from being able to change the queue address and encryption keys in the link</strong>.</li> +</ol> +<p>This quality prevents the MITM attack on e2e encryption via break-in attack on the client of the link owner.</p> +<p>The server does not provide any API to change the fixed part of the link data. Also, changing fixed data would require changing the link, as otherwise the hash of the data won't match the link.</p> +<ol start="7"> +<li><strong>It should be impossible to check the existence of a messaging queue for one-time invitation links</strong>.</li> +</ol> +<p>It means that any 3rd party that observed 1-time invitation link (e.g., by reading the message in the messenger or email where it was sent) must not be able to undetectably confirm whether this messaging queue still exists, by attempting to create another queue with the same link ID and the same link data.</p> +<p>This objective is achieved by servers requiring that sender ID is derived (using <code>SHA3-384</code>) from request correlation ID, so an arbitrary sender ID cannot be used, and by generating link ID on the server — for 1-time invitation link, the link ID is included in the link in addition to link key, and is not derived from the link data.</p> +<p>See the detailed <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2025-03-16-smp-queues.md#threat-model">threat model</a> for protocol extension supporting the new user experience of making connections.</p> +<h2 id="let-us-know-what-you-think" tabindex="-1">Let us know what you think!</h2> +<p>We worked really hard to deliver this big change — the simplicity of user experience required to hide a lot of complexity under the hood. We really hope that it will help you to bring more of your friends to SimpleX network and to benefit from using secure communications.</p> +<p>The stable versions v6.4 and v6.4.1 will be released this July, but you can already use the beta version available via <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a> (Android), <a href="https://testflight.apple.com/join/DWuT2LQu">Test Flight</a> (iOS) and <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.0-beta.4">GitHub</a> (Android and desktop).</p> +<p>Big thank you to everybody who uses SimpleX network, even though the experience of connecting to people was complex before this release.</p> +<p>With your help, SimpleX network should be able to get over the million active users now!</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +<p>[1]: An interesting case study is the rise and fall of Nokia as the dominant supplier of mobile phones. The slogan &quot;Connecting people&quot; was created in 1992 by Ove Strandberg, an intern at Nokia, and as it was adopted as the core mission of the company, we saw it rise as the world's main mobile phone supplier. The fall of Nokia is usually attributed on iPhone success. But it may also be attributed to internal cultural changes, with Nokia's communications chief leaving in early 2000s, and Nokia failure to understand how the definition of &quot;Connecting people&quot; should evolve with time.</p> +<p>[2]: One-time invitation can only be used once by the person you gave it too. Once your contact scans the one-time link, nobody else can connect to you via this link. Contact address can be used by multiple people, and even if you later delete the address, everybody who connected to you will remain connected. You can read more about the differences between one-time invitation links and contact addresses <a href="https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses">here</a>.</p> +<p>[3]: Read more about how man-in-the-middle attack works in our <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#5-man-in-the-middle-attack-mitigated-by-two-factor-key-exchange">post about e2e encryption properties</a>. It also has the comparison of e2e encryption security in different messengers.</p> +<p>[4]: SimpleX apps also allow security code verification, but it protects against different attack — the link substitution by the channel you use to pass it, not from the attacks by the servers — SimpleX servers cannot compromise e2e encryption.</p> +<p>[5]: That is also why &quot;securely scanning users' communications&quot;, also known as &quot;Chat Control&quot; is impossible — what communication operator can access, cyber-criminals will also access, and instead of reducing crime it would expose users to more crime.</p> + + + SimpleX Chat + chat@simplex.chat + + + + https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html + + 2025-07-29T00:00:00Z + + SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. + <h1 id="simplex-chat-v641-welcome-your-contacts-review-members-to-protect-groups-and-more" tabindex="-1">SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more.</h1> +<p><strong>Published:</strong> Jul 29, 2025</p> +<p><strong>What's new in v6.4.1</strong>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#welcome-your-contacts-the-new-experience-of-making-connections">welcome your contacts</a>: set your profile bio and welcome message.</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#protect-your-groups">protect your communities</a> from spam and abuse: +<ul> +<li>review new members (&quot;knocking&quot;),</li> +<li>moderator role to delegate message moderation to trusted members,</li> +<li>receive direct feedback from your group members.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#other-improvements">other improvements</a>: set default time to delete messages for new contacts.</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#improved-app-integrity">improved app integrity</a>.</li> +</ul> +<p>Also, we added 3 new interface languages to Android and desktop apps: Indonesian, Romanian and Vietnamese.</p> +<p>Huge thanks to our users who <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">contributed translations</a>.</p> +<h2 id="whats-new-in-v641" tabindex="-1">What's new in v6.4.1</h2> +<h3 id="welcome-your-contacts-the-new-experience-of-making-connections" tabindex="-1">Welcome your contacts: the new experience of making connections</h3> +<p><img src="https://simplex.chat/blog/images/20250729-connect2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250729-connect1.png" width="288" class="float-to-right" /></p> +<p>The new simple way to connect to your friends is fully available in this version.</p> +<p>We received many compliments from our users who started using it in beta versions and in v6.4 about how it simplifies connecting with friends. We agree - this is the biggest UX revolution since the app was released.</p> +<p>Instead of connecting blindly, and waiting until your contact is online, as it was before, you can now see profile and welcome message of the person you connect to, before you connect.</p> +<p>When you tap Open new chat you can decide which profile to use to connect or if you want to connect incognito, and in some cases you can include a message with your connection request.</p> +<p>This way, the conversation with your friends starts even before they connect to you!</p> +<p>For previously created SimpleX addresses and group links you have an option to upgrade. The links will become short, and will include profile information into link data. Old long links will continue to work, so you won't lose any contacts or members during the upgrade.</p> +<p>These links are now short enough to be shared in your social media profiles - they are less than 80 characters.</p> +<p>And as before, it is as secure - servers cannot see you profiles, unless they have the link, and cannot modify them even if they somehow get the link. You can read more about security property and other technical details in our <a href="https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html">post about SimpleX protocols extension</a> supporting this new user experience.</p> +<p>Thank you for bringing your friends to SimpleX network!</p> +<h3 id="protect-your-groups" tabindex="-1">Protect your groups</h3> +<p><img src="https://simplex.chat/blog/images/20250729-join2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250729-join1.png" width="288" class="float-to-right" /></p> +<p><strong>Review new members</strong></p> +<p>Since v6.4 there are some major improvements in your ability to protect your group from spam and abuse.</p> +<p>You can enable an option to review all new group members. It is also commonly called &quot;knocking&quot;. It allows you to:</p> +<ul> +<li>ask prospective members any questions,</li> +<li>explain the group rules,</li> +<li>make sure their profile is appropriate for the group,</li> +<li>decide whether to allow them joining the group, and whether they should be able to send messages in the group.</li> +</ul> +<p>Some small groups may enable member review permanently, while larger public groups may enable it temporarily during spam/troll attacks.</p> +<p><strong>New role for group moderators</strong></p> +<p>In addition to that, there is a new group role - moderator.</p> +<p>This role allows:</p> +<ul> +<li>to approve members in review,</li> +<li>moderate messages,</li> +<li>block members for all.</li> +</ul> +<p>Unlike admins, moderators can't add new members or permanently remove members from the group. This allows you to delegate group moderation to your community members without risking that they may disrupt the group.</p> +<p><strong>Receive direct feedback from group members</strong></p> +<p>Your group members now can send messages to group admins. Each conversation with a group member is a mini-group where all group owners, admins and moderators can talk to a member. Reports that members can send <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html">since v6.3</a> are also added to chat with member, allowing you to discuss the report.</p> +<h3 id="other-improvements" tabindex="-1">Other improvements</h3> +<p><strong>Enable disappearing messages for new contacts</strong></p> +<p>Now you can enable disappearing messages for all new contacts automatically. Tap your profile image in the corner, then tap Chat preferences and set time for messages to disappear.</p> +<p><strong>Improved message delivery</strong></p> +<p>We improved networking layer by increasing request timeouts for all background requests. It substantially reduces traffic on slow networks.</p> +<h3 id="improved-app-integrity" tabindex="-1">Improved app integrity</h3> +<p><strong>Supply chain security</strong></p> +<p>The app security depends on security of its components and its build process, and many of these components are created by third parties. In this version we improved the build process to control the upgrades of these components:</p> +<ul> +<li>all 3rd party GitHub actions used during the build are now moved to <a href="https://github.com/simplex-chat?q=action&amp;type=fork&amp;sort=name">the forks we control</a> - it prevents supply chain attacks via build actions.</li> +<li>we now build VLC library for all platforms from the source code ourselves, in <a href="https://github.com/simplex-chat/vlc">this repository</a>.</li> +<li>SQLCipher and <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/dependencies/HASKELL.md">Haskell dependencies</a> versions were already &quot;locked&quot; prior to this version.</li> +</ul> +<p><strong>Automatic virus scanning</strong></p> +<p>We now run automatic daily virus scanning of all apps released via GitHub using <a href="https://www.virustotal.com/">VirusTotal.com</a>.</p> +<p>You can see the scan results <a href="https://github.com/simplex-chat/simplex-virutstotal-scan">here</a>.</p> +<p><strong>Reproducible builds</strong></p> +<p>In addition to <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v6.4.1">server builds</a> that were reproducible since v6.3, the builds of Linux CLI and desktop apps are now reproducible too. You can build Linux apps from source using <a href="https://github.com/simplex-chat/simplex-chat/blob/master/scripts/simplex-chat-reproduce-builds.sh">this script</a>.</p> +<p><em>Please note</em>: Linux package upgrades may change the build.</p> +<p>Stable builds of Linux apps are now independently reproduced and <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.1">signed by our and Flux teams</a> - it verifies the integrity of GitHub builds.</p> +<p>Huge thanks to <a href="https://runonflux.com/">Flux</a> for doing that and for providing their servers via the app.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + SimpleX Chat + chat@simplex.chat + + + \ No newline at end of file diff --git a/feed.rss b/feed.rss new file mode 100644 index 0000000000..a86a2462de --- /dev/null +++ b/feed.rss @@ -0,0 +1,3641 @@ + + + + SimpleX Chat Blog + https://simplex.chat/ + + It allows you to stay up to date with the latest Blogs from SimpleX Chat. + en + + SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. + https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html + <h1 id="simplex-chat-v641-welcome-your-contacts-review-members-to-protect-groups-and-more" tabindex="-1">SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more.</h1> +<p><strong>Published:</strong> Jul 29, 2025</p> +<p><strong>What's new in v6.4.1</strong>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#welcome-your-contacts-the-new-experience-of-making-connections">welcome your contacts</a>: set your profile bio and welcome message.</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#protect-your-groups">protect your communities</a> from spam and abuse: +<ul> +<li>review new members (&quot;knocking&quot;),</li> +<li>moderator role to delegate message moderation to trusted members,</li> +<li>receive direct feedback from your group members.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#other-improvements">other improvements</a>: set default time to delete messages for new contacts.</li> +<li><a href="https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html#improved-app-integrity">improved app integrity</a>.</li> +</ul> +<p>Also, we added 3 new interface languages to Android and desktop apps: Indonesian, Romanian and Vietnamese.</p> +<p>Huge thanks to our users who <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">contributed translations</a>.</p> +<h2 id="whats-new-in-v641" tabindex="-1">What's new in v6.4.1</h2> +<h3 id="welcome-your-contacts-the-new-experience-of-making-connections" tabindex="-1">Welcome your contacts: the new experience of making connections</h3> +<p><img src="https://simplex.chat/blog/images/20250729-connect2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250729-connect1.png" width="288" class="float-to-right" /></p> +<p>The new simple way to connect to your friends is fully available in this version.</p> +<p>We received many compliments from our users who started using it in beta versions and in v6.4 about how it simplifies connecting with friends. We agree - this is the biggest UX revolution since the app was released.</p> +<p>Instead of connecting blindly, and waiting until your contact is online, as it was before, you can now see profile and welcome message of the person you connect to, before you connect.</p> +<p>When you tap Open new chat you can decide which profile to use to connect or if you want to connect incognito, and in some cases you can include a message with your connection request.</p> +<p>This way, the conversation with your friends starts even before they connect to you!</p> +<p>For previously created SimpleX addresses and group links you have an option to upgrade. The links will become short, and will include profile information into link data. Old long links will continue to work, so you won't lose any contacts or members during the upgrade.</p> +<p>These links are now short enough to be shared in your social media profiles - they are less than 80 characters.</p> +<p>And as before, it is as secure - servers cannot see you profiles, unless they have the link, and cannot modify them even if they somehow get the link. You can read more about security property and other technical details in our <a href="https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html">post about SimpleX protocols extension</a> supporting this new user experience.</p> +<p>Thank you for bringing your friends to SimpleX network!</p> +<h3 id="protect-your-groups" tabindex="-1">Protect your groups</h3> +<p><img src="https://simplex.chat/blog/images/20250729-join2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250729-join1.png" width="288" class="float-to-right" /></p> +<p><strong>Review new members</strong></p> +<p>Since v6.4 there are some major improvements in your ability to protect your group from spam and abuse.</p> +<p>You can enable an option to review all new group members. It is also commonly called &quot;knocking&quot;. It allows you to:</p> +<ul> +<li>ask prospective members any questions,</li> +<li>explain the group rules,</li> +<li>make sure their profile is appropriate for the group,</li> +<li>decide whether to allow them joining the group, and whether they should be able to send messages in the group.</li> +</ul> +<p>Some small groups may enable member review permanently, while larger public groups may enable it temporarily during spam/troll attacks.</p> +<p><strong>New role for group moderators</strong></p> +<p>In addition to that, there is a new group role - moderator.</p> +<p>This role allows:</p> +<ul> +<li>to approve members in review,</li> +<li>moderate messages,</li> +<li>block members for all.</li> +</ul> +<p>Unlike admins, moderators can't add new members or permanently remove members from the group. This allows you to delegate group moderation to your community members without risking that they may disrupt the group.</p> +<p><strong>Receive direct feedback from group members</strong></p> +<p>Your group members now can send messages to group admins. Each conversation with a group member is a mini-group where all group owners, admins and moderators can talk to a member. Reports that members can send <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html">since v6.3</a> are also added to chat with member, allowing you to discuss the report.</p> +<h3 id="other-improvements" tabindex="-1">Other improvements</h3> +<p><strong>Enable disappearing messages for new contacts</strong></p> +<p>Now you can enable disappearing messages for all new contacts automatically. Tap your profile image in the corner, then tap Chat preferences and set time for messages to disappear.</p> +<p><strong>Improved message delivery</strong></p> +<p>We improved networking layer by increasing request timeouts for all background requests. It substantially reduces traffic on slow networks.</p> +<h3 id="improved-app-integrity" tabindex="-1">Improved app integrity</h3> +<p><strong>Supply chain security</strong></p> +<p>The app security depends on security of its components and its build process, and many of these components are created by third parties. In this version we improved the build process to control the upgrades of these components:</p> +<ul> +<li>all 3rd party GitHub actions used during the build are now moved to <a href="https://github.com/simplex-chat?q=action&amp;type=fork&amp;sort=name">the forks we control</a> - it prevents supply chain attacks via build actions.</li> +<li>we now build VLC library for all platforms from the source code ourselves, in <a href="https://github.com/simplex-chat/vlc">this repository</a>.</li> +<li>SQLCipher and <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/dependencies/HASKELL.md">Haskell dependencies</a> versions were already &quot;locked&quot; prior to this version.</li> +</ul> +<p><strong>Automatic virus scanning</strong></p> +<p>We now run automatic daily virus scanning of all apps released via GitHub using <a href="https://www.virustotal.com/">VirusTotal.com</a>.</p> +<p>You can see the scan results <a href="https://github.com/simplex-chat/simplex-virutstotal-scan">here</a>.</p> +<p><strong>Reproducible builds</strong></p> +<p>In addition to <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v6.4.1">server builds</a> that were reproducible since v6.3, the builds of Linux CLI and desktop apps are now reproducible too. You can build Linux apps from source using <a href="https://github.com/simplex-chat/simplex-chat/blob/master/scripts/simplex-chat-reproduce-builds.sh">this script</a>.</p> +<p><em>Please note</em>: Linux package upgrades may change the build.</p> +<p>Stable builds of Linux apps are now independently reproduced and <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.1">signed by our and Flux teams</a> - it verifies the integrity of GitHub builds.</p> +<p>Huge thanks to <a href="https://runonflux.com/">Flux</a> for doing that and for providing their servers via the app.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 29 Jul 2025 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html + + + SimpleX network: new experience of connecting with people &mdash; available in SimpleX Chat v6.4-beta.4 + https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html + <h1 id="simplex-network-new-experience-of-connecting-with-people-available-in-simplex-chat-v64-beta4" tabindex="-1">SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4</h1> +<p><strong>Published:</strong> Jul 3, 2025</p> +<p>The mission of communication network is connecting people [1]. The process of connecting in SimpleX network is really secure — it is protected from server MITM attacks. But before this beta version connecting to contacts had a really bad user experience.</p> +<h2 id="what-was-the-problem" tabindex="-1">What was the problem?</h2> +<p>How did it work before:</p> +<ol> +<li>Your contact created a large link (1-time invitation or contact address [2]) and shared with you via another messenger, email, social profile or website. Sharing the link &quot;out-of-band&quot; (i.e., not via the server) is necessary for security. But it was not working well in some cases:</li> +</ol> +<ul> +<li>the link was incorrectly changed by some applications, e.g. Telegram, because of link complexity, preventing people from connecting.</li> +<li>some people were worried that the link &quot;looks like malware&quot;.</li> +<li>the QR code for the link was large, and sometimes difficult to scan.</li> +<li>the link did not fit the size limit in social media profiles.</li> +</ul> +<ol start="2"> +<li>Once you received the link, you used it in the app. But when using the link you could not see who you were connecting to. The only choice you had is to share your current profile or to use incognito profile. And as people didn't know which profile will be shared with them, many were choosing to share incognito profile, making recognizing contacts more complex — you don't know who is who unless you attach aliases to incognito contacts.</li> +<li>Once you tap Connect, all you see is the line in the list of chats that said &quot;Connecting via link&quot;. The process of connection required your contact to be online, and in some cases to approve the request, so you may had contact in &quot;connecting&quot; state for a really long time.</li> +</ol> +<p>So it is not surprising that a large number of people failed connecting to friends — either they refused to engage because of large and scary looking links, or their application made the link unusable, or they abandoned the process at step 3, deciding that the app is not working correctly.</p> +<h2 id="why-cant-we-just-use-usernames" tabindex="-1">Why can't we just use usernames?</h2> +<p>Many people asked — why don't you just use usernames or a link shortener for some really short links, as other networks and apps do.</p> +<p>The problem is that usernames or very short links make e2e encryption security of your chats dependent on the servers. Unless the link you share contains enough randomness in it and is cryptographically linked to the encryption keys, the servers can substitute the e2e encryption keys and read all your communication without you knowing it. We see this risk as unacceptable.</p> +<p>Mitigation against this &quot;man-in-the-middle&quot; attack by the server [3] is offered by Signal and other apps via security code verification [4], when you compare the numeric code in your app with your contact's app, but:</p> +<ul> +<li>most people do not verify security codes, and even if they do, they do not re-verify them every time security code changes, so their security is dependent on the server not being compromised, which is not a great security,</li> +<li>the servers can still compromise the initial messages, where profile names are exchanged, before you had the chance to verify the security codes.</li> +</ul> +<p>When we design communication protocols for SimpleX network we always aim to protect you from the attack via your network operators — this is what sets SimpleX network design apart from many other communication networks and platforms.</p> +<p>Even though you choose the servers that you trust, and they are bound by privacy policy, and we follow the best security practices to protect servers from any 3rd party attacks, there is still a possibility that servers may be compromised by some attackers, and unless your communications are not protected from the servers, they are not protected from whoever can compromise the servers [5].</p> +<h2 id="what-is-the-new-way-to-make-connections" tabindex="-1">What is the new way to make connections?</h2> +<p>Before diving into the details of technology, let's walk though the new process of connecting to people that is introduced in <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.0-beta.4">v6.4-beta.4</a>.</p> +<img src="https://simplex.chat/blog/images/20250703-card.jpg" width="288" class="float-to-right" /> +<ol> +<li>As before, to connect you or your contact need to create a 1-time invitation or a contact address link. All the past problems of the long links are now solved:</li> +</ol> +<ul> +<li>this link is correctly processed by all applications, as it has a simple structure,</li> +<li>it is short and simple, e.g. the SimpleX Chat team address for support is: <a href="https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw">https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw</a></li> +<li>the QR code is now much smaller, fits a standard business card, and is easy to scan from all devices,</li> +<li>it fits in most social media profiles.</li> +</ul> +<p>While the link is short, it still contains 256 bits of key material with additional 192 bits of server-generated link ID for one-time invitation links, so the connection is as secure as before, and in case of one-time invitations it became more secure (see below).</p> +<p><img src="https://simplex.chat/blog/images/20250703-connect2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20250703-connect1.png" width="288" class="float-to-right" /></p> +<ol start="2"> +<li> +<p>As before, you have to use this link in the app, either by pasting the link or scanning QR code. But now you instantly see the name of your contact or group you are connecting to, and from v6.4.1 that will be released this July you will also see a profile image (currently disabled for backward compatibility).</p> +</li> +<li> +<p>Once you tap &quot;Open new chat&quot;, the app will instantly open a conversation with your contact. As you now can see which profile is shared with you via the link, you can choose which of your profiles to use to connect. If your contact shared an incognito pseudonym, then you may also choose to connect incognito. But if your contact shared a real name, you may want to share your real name as well, making it easier for your contact to recognize you — the law of reciprocity in action! <strong>In any case, your and your contact's profile names are inaccessible to messaging servers — they are e2e encrypted</strong>.</p> +</li> +</ol> +<p>If you are connecting via a contact address you can also add a message to your request, making it more likely to be accepted when connecting to somebody you don't know well. And from v6.4.1 contact addresses can include a welcome message that you would see before connecting, right in the conversation. This way, you effectively become connected to your contact and start a secure conversation even before you tap &quot;Connect&quot; button.</p> +<p>If you are connecting via a one-time invitation link, all you need to do is to tap &quot;Connect&quot;, and then you can send messages straight after that, without waiting for your contact to be online — they will be securely received later.</p> +<p>This new experience of connecting is very similar to commonly used messengers, but it protects your security. We hope that it will be much easier for the new users to connect to their friends.</p> +<h2 id="what-about-security" tabindex="-1">What about security?</h2> +<p>We took a great care to design the protocol extension for the new experience of connecting in a way that not only preserves security at the same level as before, but also increases security of connecting via one-time invitation links.</p> +<p>First, because all the keys are now included in encrypted link data on the server, and not in the link itself as before, we can include the keys for post-quantum (PQ) key exchange and make the first message sent via one-time link (your profile) encrypted with PQ e2e encryption. Previously, PQ encryption started only after the response from your contact.</p> +<p>Second, whoever can observe the link is not able to determine which public keys are used in key exchange and what messaging queue address is used, and this data is removed from the server once the connection is established. Previously, the invitation link contained public keys and the actual queue address that could have been used for a long time, unless you rotated it.</p> +<p>Third, if somebody retrieves the associated data of one-time invitation link they observed in transit, this link would become inaccessible for the intended recipient, so the recipient would know that the connection was potentially compromised, and would alert the contact that sent the link.</p> +<h2 id="how-does-it-work" tabindex="-1">How does it work?</h2> +<p>In short, a new short link references a container with the encrypted data on the server that contains:</p> +<ul> +<li>the original full link that now include quantum-resistant keys that previously were not included because of their size,</li> +<li>contact's or group's profile and conversation preferences, from v6.4.1 it will include profile images,</li> +<li>also, it will include an optional contact's or group's welcome message from v6.4.1.</li> +</ul> +<p>Making user profile and welcome message included in the encrypted link data allows to start conversation as soon as you scan the link, as described in the previous section.</p> +<h3 id="design-objectives-and-cryptographic-primitives-that-achieve-them" tabindex="-1">Design objectives and cryptographic primitives that achieve them</h3> +<p>This section is not a formal specification of the protocol, but an informal technical explanation of objectives we had for this design and how they were achieved. The technical details are available in <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2025-03-16-smp-queues.md">this RFC document</a>.</p> +<ol> +<li><strong>Encrypted link data cannot be accessed by the server</strong>.</li> +</ol> +<p>It means that while the client apps should use the link to derive both the link ID for the server and decryption key for the associated link data, the server should not be able to derive the link and decryption key from the link ID that it knows, and can't access the link data.</p> +<p>This objective is achieved by using <code>secret_box</code> encryption of link data with the symmetric key derived from link URI, which is different from link ID known to the server. As it is a symmetric encryption, it is secure against quantum computers.</p> +<ol start="2"> +<li><strong>Allow changing encrypted link data without changing the link itself</strong>.</li> +</ol> +<p>This is necessary to allow changes in user profile, chat preferences and welcome messages.</p> +<p>This is possible via a specific server request that allows to change user-defined part of the link data to the link owner. Because the link is derived from fixed part of the link data, the link itself remains the same.</p> +<ol start="3"> +<li><strong>Prevent MITM attack on the link data by the server, even if the server obtained the link</strong>.</li> +</ol> +<p>It means that the server should not be able to replace the associated link data even if it somehow obtained the link and can decrypt the data.</p> +<p>This objective is achieved by deriving encryption key from the hash of the fixed part of the link data — if server changes the link data, it would be rejected by the client, as its hash won't match the link. Server also cannot replace the user-defined part of the link data, because it is signed and will be verified with the key included in the fixed part of link data.</p> +<p>Clients use <code>HKDF</code> for key derivation, <code>SHA3-256</code> to compute hash of the fixed part of link data, and <code>ED25519</code> signature to sign user-defined link data.</p> +<ol start="4"> +<li><strong>Prevent undetectably accessing encrypted link data of one-time links</strong>.</li> +</ol> +<p>This is explained in the previous section — if link observers retrieve the link data, the link will become inaccessible for the intended recipient.</p> +<p>This objective is achieved because the link data of 1-time invitation link data can only be accessed with the server request that locks queue on the first access. Any subsequent access to the queue must uses the same authorization key (<code>ED25519</code>).</p> +<ol start="5"> +<li><strong>The link owner cannot include address of another queue in the link</strong>.</li> +</ol> +<p>It means that the link cannot redirect the connecting party to another server or to another queue on the same server — the apps would reject the links that attempt to do it. While allowing redirects may be seen as higher security from the server, it would open the possibility of resource exhaustion attacks, as the server would not know if the links were actually used to connect or not, and when the link data can be removed. So we decided that preventing redirects is a better tradeoff. This cryptographically enforced association between link and queue allows to remove link data from the server once the connection is established, or once some time passes (e.g., 3 weeks for unused one-time invitation links).</p> +<p>This objective is achieved by including queue ID and link data into the same server response.</p> +<ol start="6"> +<li><strong>Prevent link owner from being able to change the queue address and encryption keys in the link</strong>.</li> +</ol> +<p>This quality prevents the MITM attack on e2e encryption via break-in attack on the client of the link owner.</p> +<p>The server does not provide any API to change the fixed part of the link data. Also, changing fixed data would require changing the link, as otherwise the hash of the data won't match the link.</p> +<ol start="7"> +<li><strong>It should be impossible to check the existence of a messaging queue for one-time invitation links</strong>.</li> +</ol> +<p>It means that any 3rd party that observed 1-time invitation link (e.g., by reading the message in the messenger or email where it was sent) must not be able to undetectably confirm whether this messaging queue still exists, by attempting to create another queue with the same link ID and the same link data.</p> +<p>This objective is achieved by servers requiring that sender ID is derived (using <code>SHA3-384</code>) from request correlation ID, so an arbitrary sender ID cannot be used, and by generating link ID on the server — for 1-time invitation link, the link ID is included in the link in addition to link key, and is not derived from the link data.</p> +<p>See the detailed <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2025-03-16-smp-queues.md#threat-model">threat model</a> for protocol extension supporting the new user experience of making connections.</p> +<h2 id="let-us-know-what-you-think" tabindex="-1">Let us know what you think!</h2> +<p>We worked really hard to deliver this big change — the simplicity of user experience required to hide a lot of complexity under the hood. We really hope that it will help you to bring more of your friends to SimpleX network and to benefit from using secure communications.</p> +<p>The stable versions v6.4 and v6.4.1 will be released this July, but you can already use the beta version available via <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a> (Android), <a href="https://testflight.apple.com/join/DWuT2LQu">Test Flight</a> (iOS) and <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.4.0-beta.4">GitHub</a> (Android and desktop).</p> +<p>Big thank you to everybody who uses SimpleX network, even though the experience of connecting to people was complex before this release.</p> +<p>With your help, SimpleX network should be able to get over the million active users now!</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +<p>[1]: An interesting case study is the rise and fall of Nokia as the dominant supplier of mobile phones. The slogan &quot;Connecting people&quot; was created in 1992 by Ove Strandberg, an intern at Nokia, and as it was adopted as the core mission of the company, we saw it rise as the world's main mobile phone supplier. The fall of Nokia is usually attributed on iPhone success. But it may also be attributed to internal cultural changes, with Nokia's communications chief leaving in early 2000s, and Nokia failure to understand how the definition of &quot;Connecting people&quot; should evolve with time.</p> +<p>[2]: One-time invitation can only be used once by the person you gave it too. Once your contact scans the one-time link, nobody else can connect to you via this link. Contact address can be used by multiple people, and even if you later delete the address, everybody who connected to you will remain connected. You can read more about the differences between one-time invitation links and contact addresses <a href="https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses">here</a>.</p> +<p>[3]: Read more about how man-in-the-middle attack works in our <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#5-man-in-the-middle-attack-mitigated-by-two-factor-key-exchange">post about e2e encryption properties</a>. It also has the comparison of e2e encryption security in different messengers.</p> +<p>[4]: SimpleX apps also allow security code verification, but it protects against different attack — the link substitution by the channel you use to pass it, not from the attacks by the servers — SimpleX servers cannot compromise e2e encryption.</p> +<p>[5]: That is also why &quot;securely scanning users' communications&quot;, also known as &quot;Chat Control&quot; is impossible — what communication operator can access, cyber-criminals will also access, and instead of reducing crime it would expose users to more crime.</p> + + + Thu, 03 Jul 2025 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html + + + SimpleX Chat v6.3: new user experience and safety in public groups + https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html + <h1 id="simplex-chat-v63-new-user-experience-and-safety-in-public-groups" tabindex="-1">SimpleX Chat v6.3: new user experience and safety in public groups</h1> +<p><strong>Published:</strong> Mar 8, 2025</p> +<p><strong>What's new in v6.3</strong>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#preventing-spam-and-abuse-in-public-groups">preventing spam and abuse in public groups</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#group-improvements">group improvements</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#mention-other-members-and-get-notified-when-mentioned">mention other members</a>, <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#better-group-performance">improved performance</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#better-chat-navigation">better chat navigation</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#organize-chats-into-lists">organize chats into lists</a> and <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#jump-to-found-and-forwarded-messages">jump to found and forwarded messages</a>.</li> +<li><a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#privacy-and-security-improvements">privacy and security improvements</a>: <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#set-message-retention-period-in-chats">chat retention period</a> and <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#private-media-file-names">private media file names</a>.</li> +</ul> +<p>Also, we added Catalan interface language to Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>The last but not the least - <a href="https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html#reproducible-server-builds">server builds are now reproducible</a>.</p> +<h2 id="whats-new-in-v63" tabindex="-1">What's new in v6.3</h2> +<h2 id="preventing-spam-and-abuse-in-public-groups" tabindex="-1">Preventing spam and abuse in public groups</h2> +<p><a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html">We wrote before</a>: as the network grows, it becomes more attractive to attackers. This release adds several features that reduce the possibility of attacks and abuse.</p> +<h3 id="spam-in-groups-that-are-listed-in-our-group-directory" tabindex="-1">Spam in groups that are listed in our group directory</h3> +<p>There is no built-in group discovery in SimpleX Chat apps. Instead, we offer an experimental chat bot that allows to submit and to discover public groups. Not so long ago, spammers started sending messages via bots attempting to disrupt these groups.</p> +<p>We released several changes to the groups directory to protect from spam attacks.</p> +<p><strong>Optional captcha verification</strong></p> +<img src="https://simplex.chat/blog/images/20250308-captcha.png" width="288" class="float-to-right" /> +<p>Group owners can enable the requirement to pass captcha challenge before joining the group. Captcha is generated in the directory bot itself, without any 3rd party servers, and is sent to the joining member. The new member must reply with the text in the image to be accepted to the group. While not a perfect protection, this basic measure complicates programming automatic bots to join public groups. It also provides a foundation to implement &quot;knocking&quot; - a conversation with dedicated group admins prior to joining the group. We plan to release support for knocking in March.</p> +<p><strong>Profanity filter for member names</strong></p> +<p>While group settings support giving all joining member an &quot;observer&quot; role - that is, without the right to send messages - the attackers tried spaming groups by joining and leaving. We added an optional filter for member names that group owners can enable for groups listed in directory - if a member name contains profanity, they will be rejected. Further improvements will be released in March as well.</p> +<p>The current SimpleX directory chatbot is a hybrid of <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#can-large-groups-scale">future chat relays</a> (a.k.a. super-peers) we are now developing to support large groups, and of a directory service that will be embedded in the app UI later this year, allowing to search and to discover public groups. Anybody is able to run their own directory bots now, and there will be possibility to use third party directories via the app UI in the future too.</p> +<p>Read more about <a href="https://simplex.chat/docs/directory.html">SimpleX group directory</a>, how to submit your groups, and which groups we now accept. Currently we accept groups related to a limited list of topics that will be expanded once we have better moderation functionality for the groups.</p> +<h3 id="more-power-to-group-owners-and-moderators" tabindex="-1">More power to group owners and moderators</h3> +<p>This release includes two new features to help group moderators.</p> +<img src="https://simplex.chat/blog/images/20250308-reports.png" width="288" class="float-to-right" /> +<p><strong>Private reports</strong></p> +<p>Group members can privately bring to group moderators attention specific messages and members, even if the group does not allow direct messages. The simply need to choose report in the message context menu and choose the report reason. This report will be visible to all group owners and moderators, but not to other members.</p> +<p>Group moderators can see all member reports in a separate view, and quickly find the problematic messages, making moderation much easier in public groups. These reports are private to groups, they are not sent to server operators.</p> +<p>Please note: in the groups listed in our directory, the directory bot acts as admin, so it will receive all reports as well.</p> +<p><strong>Acting on multiple members at once</strong></p> +<p>When attackers come, they often use multiple profiles. This version allows selecting multiple members at once and perform these actions on all selected members:</p> +<ul> +<li>switch members role between &quot;observer&quot; and &quot;member&quot;.</li> +<li>block and unblock members - this is a &quot;shadow&quot; block, so when you block multiple members who you believe are attackers, their messages will be blocked for all other members but not for them.</li> +<li>remove members from the group.</li> +</ul> +<p>The next version will also allow to remove members together with all messages they sent - for example, if a spam bot joined and sent a lot of spam, but nothing of value.</p> +<h2 id="group-improvements" tabindex="-1">Group improvements</h2> +<h3 id="mention-other-members-and-get-notified-when-mentioned" tabindex="-1">Mention other members and get notified when mentioned</h3> +<img src="https://simplex.chat/blog/images/20250308-mentions.png" width="288" class="float-to-right" /> +<p>This feature allows you to mention other members in the group in the usual way - type <code>@</code> character, and choose the member you want to mention from the menu. Even that there is no user accounts and persistent identities we made it work by referencing members by their random group ID that is also used for replies and all other interactions in the group.</p> +<p>You can also now switch message notifications in the group to &quot;mentions only&quot; mode. You will be notified only when you are mentioned in a message, or when somebody replies to your message. Simply choose &quot;Mute&quot; in the context menu of the group in the list of chats to switch group notifications to &quot;mentions only&quot; mode. After that you can choose &quot;Mute all&quot; to disable all notifications, including mentions.</p> +<h3 id="better-group-performance" tabindex="-1">Better group performance</h3> +<p><strong>Send messages faster</strong></p> +<p>We didn't reduce the required network traffic to send messages to large groups yet - your client still has to send message to each member individually. But we redesigned the process of sending a message, reducing temporary storage required to schedule the message for delivery by about 100x. This creates a significant storage saving - e.g, to send one message to a group of 1,000 members previously required ~20Mb, and now it is reduced to ~200kb. It also reduces the time and battery used to send a message.</p> +<p><strong>Faster group deletion</strong></p> +<p>When you leave the group, the app preserves a copy of all your communications in the group. You can choose to keep it or to delete it completely. This final group deletion was very slow prior to this release - depending on the number of groups on your device it could sometimes take several minutes.</p> +<p>This release solved this problem – the time it takes to delete the group is reduced to seconds, and even in cases when the app is terminated half-way, it either rolls back or completes, but it cannot leave the group in a partially deleted state. It improves both user experience and privacy, as gives you better control over your data.</p> +<h2 id="better-chat-navigation" tabindex="-1">Better chat navigation</h2> +<h3 id="organize-chats-into-lists" tabindex="-1">Organize chats into lists</h3> +<img src="https://simplex.chat/blog/images/20250308-lists.png" width="288" class="float-to-right" /> +<p>It is a common feature in many messengers – it helps organizing your conversations.</p> +<p>The lists also show a blue mark when any chat in the list has new messages.</p> +<p>There are several preset lists: contacts, groups, private notes, business chats, favourite chats and also groups with member reports - the last list is automatically shown if members of any groups where you are the moderator or the owner sent private reports, until these reports are acted on or archived.</p> +<h3 id="jump-to-found-and-forwarded-messages" tabindex="-1">Jump to found and forwarded messages</h3> +<p>This version allows to quickly navigate from message in the search results to the point in the conversation when it was sent.</p> +<p>You can also navigate from the forwarded message (or from the message saved to private notes) to the original message in the chat where it was forwarded or saved from.</p> +<h2 id="privacy-and-security-improvements" tabindex="-1">Privacy and security improvements</h2> +<h3 id="set-message-retention-period-in-chats" tabindex="-1">Set message retention period in chats</h3> +<p>Before this version, you could enable message retention period for all chats in your profile. While helpful in some cases, many of us have conversations that we want to keep for a long time, and some other conversations that we want to remove quicker.</p> +<p>This version allows it - you can set different retention periods in different conversations. It can be 1 day, 1 week, 1 month or 1 year. We may allow custom retention time in the future.</p> +<h3 id="private-media-file-names" tabindex="-1">Private media file names</h3> +<p>Previously there were scenarios when original media file names were preserved - e.g., when sending a video file or when forwarding any media file. The latter problem was worse, as media file name is generated automatically, and includes timestamp. So the same name could have been used to correlate files between conversations, as one of our users pointed out.</p> +<p>This version fixes this problem - media file name is now changed when forwarding it to match the time of forwarding, so no additional metadata is revealed.</p> +<p>Please also note:</p> +<ul> +<li>the apps remove metadata from all static images,</li> +<li>iOS app removes metadata from videos, but android and desktop apps do not do it yet,</li> +<li>animated images are sent as is,</li> +<li>other file types are sent as is, and their names are left unchanged - we believe that for ordinary files their name is part of their content.</li> +</ul> +<p>We plan further improvements to reduce metadata in files in the near future – please let us know what you believe is the most important to reduce first.</p> +<h2 id="reproducible-server-builds" tabindex="-1">Reproducible server builds</h2> +<p>Starting from v6.3 server releases are reproducible!</p> +<p><strong>Why it is important</strong></p> +<p>With reproducible builds anybody can build servers from our code following the same process, and the build would produce identical binaries.</p> +<p>This also allows us to sign releases, as we reproduce GitHub builds ourselves and by signing them we attest that our builds resulted in identical binaries.</p> +<p><strong>How to reproduce builds</strong></p> +<p>You can reproduce our builds on Linux with x86 CPU in docker container - please follow the instructions <a href="https://simplex.chat/docs/server.html#reproduce-builds">here</a>.</p> +<p>We are looking for support from open-source contributors or security researchers who would also reproduce and sign our releases.</p> +<p><strong>How to verify release signature</strong></p> +<p>Please see the instructions <a href="https://simplex.chat/docs/server.html#verifying-server-binaries">here</a>.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 08 Mar 2025 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html + + + SimpleX network: large groups and privacy-preserving content moderation + https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html + <h1 id="simplex-network-large-groups-and-privacy-preserving-content-moderation" tabindex="-1">SimpleX network: large groups and privacy-preserving content moderation</h1> +<p><strong>Published:</strong> Jan 14, 2025</p> +<img src="https://simplex.chat/blog/images/20250114-locked-books.jpg" width="345" class="float-to-right" /> +<p>Many people believe that it is impossible to moderate and prevent abuse in end-to-end encrypted conversations. This belief is incorrect — there is a way to prevent abuse and distribution of illegal content without any compromises to users' privacy and security of end-to-end encryption.</p> +<p>Anti-privacy lobbyists use this incorrect belief to advocate for scanning of private communications, which not only would fail to prevent abuse, but would make it worse — because our private data will become available to criminals.</p> +<p>So it's very important to understand how privacy preserving content moderation works, and educate the politicians who you voted for, and who is currently in the office, that we do not need to compromise privacy and security in any way to substantially reduce online crime and abuse.</p> +<p>This post answers these questions:</p> +<ul> +<li>Why <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#large-groups-on-simplex-network">large groups on SimpleX network</a> don't work well?</li> +<li>How do we plan to <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#can-large-groups-scale">make them scale</a>?</li> +<li>How do <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-abuse-with-anonymous-participation">group owners prevent abuse</a> when people participate anonymously?</li> +<li>How do server operators <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-server-abuse-without-compromising-e2e-encryption">prevent abuse of their servers</a> and <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#privacy-preserving-content-moderation">how these measures will evolve</a> without any compromises to privacy and end-to-end encryption?</li> +<li>Which <a href="https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#privacy-and-security-improvements-we-plan-this-year">privacy and security improvements</a> we plan this year?</li> +</ul> +<h2 id="large-groups-on-simplex-network" tabindex="-1">Large groups on SimpleX network</h2> +<p>When we designed groups, we expected them to be used primarily for small groups where people know each other, with not more than 100 or so members.</p> +<p>But we learnt that people want to participate in public discussions remaining anonymous — it protects their freedom of speech. As an experiment, we are curating a small <a href="https://simplex.chat/docs/directory.html">directory of groups</a> that currently has almost 400 public groups, with the largest ones having thousands of members. You can connect to this experimental directory via <a href="https://simplex.chat/contact#/?v=2-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">SimpleX chat address</a>.</p> +<h2 id="can-large-groups-scale" tabindex="-1">Can large groups scale?</h2> +<p>Currently the groups are fully decentralized, and every time you send the message to some group your client has to send it to each group member, which is very costly for traffic and battery in large groups.</p> +<p>We are currently working on the new group architecture when dedicated group members that run their clients on the server or on desktop with good internet connection will re-broadcast messages to all members — these members are &quot;super-peers&quot;.</p> +<p>We will be offering pre-configured super-peers via the app, and you will be able to use your own super-peers, in case you are hosting a large private group, and to have a better control and ownership of the group — e.g., if we decide to remove our super peer from the group, it will continue to function thanks to your super-peer re-broadcasting messages.</p> +<p>This new design improves both privacy of group participation and censorship resistance of the groups, and also makes abusing the group harder.</p> +<h2 id="preventing-abuse-with-anonymous-participation" tabindex="-1">Preventing abuse with anonymous participation</h2> +<p>All public discussions are abused by spammers and trolls, whether anonymous or not. We have been evolving ability of group owners to moderate conversations by allowing to remove inappropriate and off-topic messages, to block members who send spam, and to make all new members who join their group unable to send messages until approved.</p> +<p>As support for large groups improves, we expect that the attempts to abuse may increase too, unless we add better moderation capabilities in advance.</p> +<p>v6.3 will add ability of the group members to send reports to the group owners and administrators — the beta version we just released adds ability to manage these reports, so group admins won't miss reports when members start sending them.</p> +<p>Other features that we plan to add this year to improve both usability and safety of the groups:</p> +<ul> +<li>message comments — some groups may choose to allow only comments, when ability to send messages is restricted to group owners or admins.</li> +<li>ability to limit the maximum number of messages the members can send per day.</li> +<li>ability to pre-moderate messages before they can be seen by all members.</li> +<li>&quot;knocking&quot; — approving new members before they can join the group.</li> +<li>sub-groups — smaller conversations with the same members.</li> +</ul> +<h2 id="preventing-server-abuse-without-compromising-e2e-encryption" tabindex="-1">Preventing server abuse without compromising e2e encryption</h2> +<p>Some categories of content may be prohibited by servers operators. An extreme case would be child sexual abuse materials (CSAM).</p> +<p>Many people believe that when conversation is end-to-end encrypted, the problem is unsolvable. This incorrect belief is used by unscrupulous lobbyists and politicians who attempt to mandate various types of content scanning under the guise of preventing CSAM distribution.</p> +<p>We <a href="https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html">wrote before</a> about how such measures not only would fail to solve the problem, but would make it worse. If our private photos become available to service providers, they will eventually become available to criminals too, and will be used to abuse and exploit the users and their children.</p> +<p>An absolute majority of CSAM distributed online is publicly accessible. Many large tech companies failed to act on it and to remove CSAM from their services before it became an epidemic. We see it as a very important objective to eliminate the possibility to distribute CSAM from publicly accessible groups, even if it hurts network growth.</p> +<p>When we receive a user complaint about CSAM shared in any group, we remove the files and, in some cases, the links to join the group from our servers. Our approach to moderation preserves user privacy and security of end-to-end encryption.</p> +<p>How does it work? Let's go over the process step by step.</p> +<ol> +<li> +<p>A user discovered the link to join the group that distributes CSAM and sent a complaint to our support email address or via the app to <a href="simplex:/contact#/?v=1&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D">SimpleX Chat team</a> contact.</p> +</li> +<li> +<p>Once we received the link to join the group, we instruct our automated bot to join it. If the complaint is confirmed as valid, the bot sends the information about the files sent in this group to the servers that store these files.</p> +</li> +<li> +<p>Once the servers receive the file identifiers from the bot, they block the files.</p> +</li> +</ol> +<p>File servers cannot look inside end-to-end encrypted files, and they don't even know file sizes — they are securely locked, and sent in chunks, across multiple servers. But if the bot that joined the group provides the address of the particular file, the server can delete this file. It doesn't allow the servers to access any other files.</p> +<p>In this way, the moderation is possible without any content scanning, and it preserves privacy and security of end-to-end encryption.</p> +<h2 id="privacy-preserving-content-moderation" tabindex="-1">Privacy-preserving content moderation</h2> +<p>Right now, when we act on user complaints, we delete uploaded files or the links to join the groups from our servers, and to the users it looks as if something stopped working.</p> +<p>We are currently rolling out the change to the servers that would mark these files and group links as blocked, so that users who try to download them or to join blocked groups can see that they were blocked for violating server operator conditions of use. This will improve transparency of moderation and reliability of the network.</p> +<p>Later this year we plan to do more than that — client-side restrictions on the clients that violated conditions of use by uploading prohibited content.</p> +<p>How would it work? When the client discovers that the uploaded file was blocked, it may, optionally, depending on the information in the blocking record, disable further uploads from the app to the servers of the operator that blocked the file. Also, when the client that tried to receive the file sees that the file is blocked, it may also refuse to receive further files from the same group member via the same servers.</p> +<p>In this way, the servers can restrict the future actions of the users who violate the conditions of use, while preserving privacy and security of the users and content – even of those users who violated the conditions.</p> +<p>We discussed this plan with the users, and we really appreciate their feedback. The current plan is quite different from our initial ideas, the users had a real impact. Users asked the questions below.</p> +<p><strong>Can't users modify their clients code to circumvent these restrictions?</strong></p> +<p>Yes, they can, but for this to work both sender and recipient would have to modify their clients. It's technically complex, so most users won't do it, and it is also hard to coordinate between users who don't know and don't trust each other.</p> +<p>So these measures would be effective, even though they can be in theory circumvented, as any restrictions can be.</p> +<p>Other services that identify users reduce abuse by blocking the user account. It is even easier to circumvent than changing the client code, and yet these measures reduce abuse.</p> +<p><strong>Can't users use other servers?</strong></p> +<p>Yes, they can. But in the same way as web browser is not responsible for the content you can access, SimpleX app should not restrict your communications with other servers based on blocking action from just one server.</p> +<p>That approach allows different server operators to have different content policies, depending on their jurisdiction and other factors. It also prevents the possibility of abuse by server operators.</p> +<p><strong>Wouldn't these measures be abused?</strong></p> +<p>With the proposed changes, server operators will only be able to prevent uploads to their own servers, which prevents any impact on other communications.</p> +<p>In the future we plan to increase the resilience to any server malfunction or abuse by using multiple different servers with each contact.</p> +<p>If servers were to apply any upload restrictions unreasonably, the users would simply stop using them.</p> +<p>At the same time, server operators need to have technical means to protect their servers from users' abuse, and the proposed client-side restrictions achieve it.</p> +<p><strong>What additional measures are considered?</strong></p> +<p>We published other technical ideas that could be used to prevent distribution of illegal content in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-12-30-content-moderation.md">this document</a>. None of these measures compromise users' privacy or end-to-end encryption, and they can (and should) only be applied to publicly accessible content that other users complained about.</p> +<p>We technically cannot, and we won't scan all content. We actively <a href="https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html">campaign against any content-scanning proposals</a>, because it violates our right to privacy, and it would result in huge increase of online crime.</p> +<p>The belief that it is impossible to moderate conversations when they are e2e encrypted is incorrect. It is possible when users themselves share conversation contents with server operators, in which case the operators can identify and, if necessary, remove this content. It is also possible to moderate conversations that users made publicly accessible.</p> +<h2 id="send-us-comments-and-questions" tabindex="-1">Send us comments and questions</h2> +<p>Let us know any comments and feedback to the proposed measures. This is still an evolving design, and it won't be implemented until later this year.</p> +<p>Your comments will help to find the right balance between users' and server operators' requirements.</p> +<h2 id="privacy-and-security-improvements-we-plan-this-year" tabindex="-1">Privacy and security improvements we plan this year</h2> +<p>To increase privacy and security we plan to add this year:</p> +<ul> +<li>quantum-resistant e2e encryption in small groups.</li> +<li>receiving proxy for files, to protect users IP addresses and other transport metadata from file senders' servers.</li> +</ul> +<p>We see privacy and security as necessary for online safety, and prevention of abuse. If you don't already use SimpleX network, try it now, and let us know what you need to make it better.</p> + + + Tue, 14 Jan 2025 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html + + + Oppose digital IDs – they break the law and lead to mass scale surveillance + https://simplex.chat/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html + <h1 id="oppose-digital-ids-they-break-the-law-and-lead-to-mass-scale-surveillance" tabindex="-1">Oppose digital IDs – they break the law and lead to mass scale surveillance</h1> +<p><strong>Published:</strong> Dec 18, 2024</p> +<img src="https://simplex.chat/blog/images/20241218-pub.jpg" width="330" class="float-to-right" /> +<p>Starting next year, the UK government plans to introduce <a href="https://www.telegraph.co.uk/politics/2024/12/08/digital-id-to-be-introduced-for-pubs-and-clubs/">digital ID cards</a> for the young people to prove their age when visiting pubs. While officials claim this system will remain optional, it's part of a broader government initiative to move more state functions online so that people can prove their identity for everything from paying taxes to opening a bank account using the government-backed app. This will be a step toward a society where every pub visit, purchase, and social interaction becomes a permanent digital record linked to a government-issued ID – a step to normalizing mass surveillance at scale.</p> +<p>Digital IDs are promoted as a way to fight law violations, and some politicians support them as <a href="https://www.telegraph.co.uk/politics/2024/07/10/id-cards-inevitable-tackle-immigration-lord-blunkett-labour/">a way to tackle illegal immigration</a>. But digital IDs themselves break the law. Article 8 of the European Convention of Human Rights says: “Everyone has the right to respect for his private and family life”. It means that not only our right to privacy is enshrined in the law, but the right to have our privacy respected is also part of the law. Asking to present a digital ID when visiting a pub, even if it is optional, disrespects our privacy, and is therefore illegal.</p> +<p>Digital IDs would not stop people who decide to break laws. Pubs already can refuse to serve alcohol to young people and require the ID in case the age is in doubt. And illegal immigration can also be reduced without any digital IDs. But introducing digital IDs and collecting our actions, names and locations in one government-controlled database will result in making this information easier to access for criminals, and being exploited for financial and identity crimes.</p> +<p>What starts as a &quot;convenient option&quot; is likely to end as a mandatory requirement. The digital ID systems being pushed by governments and corporations aren't about making our lives easier. They're about tracking, monitoring, and controlling every move we make. And we can see <a href="https://www.wired.com/story/china-social-credit-system-explained/">where this road leads in China</a>, when IDs and social scores created for convenience are used to prevent access to basic services and bank accounts as a punishment for legal social media posts that the government disagrees with. What started as a convenience, is now trialed <a href="https://www.thesun.ie/news/13154812/china-installs-toilet-timers-to-broadcast-time-spent/">to track the duration of public toilet visits</a>.</p> +<p>The United Kingdom is a democratic country, and the law protects our right to privacy and freedom of speech. If we accept digital IDs as something required for simple things, like buying a drink, it leaves the door wide open to a range of privacy violations.</p> +<p>We call on everyone to oppose the digital ID systems. Do not use them. Do not install these systems in your pub, for as long as it is not legally required. Support local businesses that don’t use them. Protect your privacy and freedom by using software that respects them. Demand that your privacy is respected, as required by law.</p> +<p>To make your voice heard, email your MP expressing your rejection of digital IDs as a violation of European Convention of Human Rights in three simple steps:</p> +<ol> +<li><strong>Copy the text below</strong> or <a href="mailto:?subject=Please%20oppose%20the%20plan%20for%20Digital%20IDs&amp;body=Dear%20%E2%80%A6%2C%0A%0AI%20object%20to%20the%20introduction%20of%20digital%20IDs%20in%20pubs%20or%20any%20other%20public%20places%20for%20these%20reasons%3A%0A%0A1.%20It%20violates%20the%20European%20Convention%20of%20Human%20Rights%2C%20article%208%3A%20%E2%80%9CEveryone%20has%20the%20right%20to%20respect%20for%20his%20private%20and%20family%20life%E2%80%9D%20(https%3A%2F%2Ffra.europa.eu%2Fen%2Flaw-reference%2Feuropean-convention-human-rights-article-8-0).%0AAsking%20to%20present%20digital%20IDs%20when%20proof%20of%20identity%20is%20not%20legally%20required%2C%20even%20if%20it%20is%20optional%2C%20disrespects%20our%20privacy%2C%20and%20is%20therefore%20illegal.%0A%0A2.%20It%20will%20not%20be%20an%20effective%20measure%20in%20reducing%20the%20violations%20of%20the%20law.%20People%20who%20want%20to%20circumvent%20it%2C%20will%20find%20a%20way.%0A%0A3.%20It%20will%20increase%20crime%2C%20because%20combining%20a%20large%20amount%20of%20private%20information%20in%20a%20single%20system%20increases%20the%20risks%20of%20this%20information%20becoming%20available%20to%20criminals%2C%20who%20will%20exploit%20it%20for%20financial%20crimes%20and%20identity%20theft.%0A%0AI%20kindly%20ask%20you%20to%20oppose%20this%20plan%2C%20both%20publicly%20and%20during%20any%20discussions%20in%20the%20UK%20Parliament.%0A%0ASincerely%20yours%2C%0A%E2%80%A6">click this link</a> to copy it into email app:</li> +</ol> +<p><em>Dear …,</em></p> +<p><em>I object to the introduction of digital IDs in pubs or any other public places for these reasons:</em></p> +<ol> +<li><em>It violates the European Convention of Human Rights, article 8: “Everyone has the right to respect for his private and family life” (<a href="https://fra.europa.eu/en/law-reference/european-convention-human-rights-article-8-0">https://fra.europa.eu/en/law-reference/european-convention-human-rights-article-8-0</a>).</em><br /> +<em>Asking to present digital IDs when proof of identity is not legally required, even if it is optional, disrespects our privacy, and is therefore illegal.</em></li> +<li><em>It will not be an effective measure in reducing the violations of the law. People who want to circumvent it, will find a way.</em></li> +<li><em>It will increase crime, because combining a large amount of private information in a single system increases the risks of this information becoming available to criminals, who will exploit it for financial crimes and identity theft.</em></li> +</ol> +<p><em>I kindly ask you to oppose this plan, both publicly and during any discussions in the UK Parliament.</em></p> +<p><em>Sincerely yours,</em><br /> +<em>…</em></p> +<ol start="2"> +<li> +<p><a href="https://members.parliament.uk/members/Commons"><strong>Find the email address of your MP</strong></a> and copy it to the email.</p> +</li> +<li> +<p>Fill in the blanks, edit the text if needed, and <strong>send it</strong>!</p> +</li> +</ol> +<p>Public opposition changed government decisions in many cases.</p> +<p>It is your opportunity to tell the government which country you want to live in — please use it!</p> + + + Wed, 18 Dec 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html + + + SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps + https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html + <h1 id="simplex-network-preset-servers-operated-by-flux-business-chats-and-more-with-v62-of-the-apps" tabindex="-1">SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps</h1> +<p><strong>Published:</strong> Dec 10, 2024</p> +<p>What's new in v6.2:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#simplex-chat-and-flux-improve-metadata-privacy-in-simplex-network">SimpleX Chat and Flux</a> improve metadata privacy in SimpleX network.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#business-chats">Business chats</a> to provide support from your business to users of SimpleX network.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#better-user-experience">Better user experience</a>: open on the first unread, jump to quoted messages, see who reacted.</li> +<li><a href="https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html#improving-notifications-in-ios-app">Improving notifications in iOS app</a>.</li> +</ul> +<h2 id="whats-new-in-v62" tabindex="-1">What's new in v6.2</h2> +<h3 id="simplex-chat-and-flux-improve-metadata-privacy-in-simplex-network" tabindex="-1">SimpleX Chat and Flux improve metadata privacy in SimpleX network</h3> +<p><img src="https://simplex.chat/blog/images/20241210-operators-1.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20241210-operators-2.png" width="288" class="float-to-right" /></p> +<p>SimpleX Chat and <a href="https://runonflux.com/">Flux</a> (Influx Technology Limited) made an agreement to include messaging and file servers operated by Flux into the app.</p> +<p>SimpleX network is decentralized by design, but in the users of the previous app versions had to find other servers online or host servers themselves to use any other servers than operated by us.</p> +<p>Now all users can choose between servers of two companies, use both of them, and continue using any other servers they host or available online.</p> +<p>To use Flux servers enable them when the app offers it, or at any point later via Network &amp; servers settings in the app.</p> +<p>When both SimpleX Chat and Flux servers are enabled, the app will use servers of both operators in each connection to receive messages and for <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a>, increasing metadata privacy for all users.</p> +<p>Read more about why SimpleX network benefits from multiple operators in <a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html">our previous post</a>.</p> +<p>You can also read about our plan <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-04-26-commercial-model.md">how network operators will make money</a>, while continuing to protect users privacy, based on network design rather than on trust to operators, and without any cryptocurrency emission.</p> +<h3 id="business-chats" tabindex="-1">Business chats</h3> +<img src="https://simplex.chat/blog/images/20241210-business.png" width="288" class="float-to-right" /> +<p>We use SimpleX Chat to provide support to SimpleX Chat users, and we also see some other companies offering SimpleX Chat as a support channel.</p> +<p>One of the problem of providing support via general purpose messengers is that the customers don't see who they talk to, as they can in all dedicated support systems.</p> +<p>It is not possible in most messengers, including SimpleX Chat prior to v6.2 - every new customer joins a one-to-one conversation, where the customers see that they talk to a company, not knowing who they talk to, and if it's a bot or a human.</p> +<p>The new business chats in SimpleX Chat solve this problem: to use them enable the toggle under the contact address in your chat profile. It is safe to do, and you can always toggle it off, if needed - the address itself does not change.</p> +<p>Once you do it, the app will be creating a new business chat with each connecting customer where multiple people can participate. Business chat is a hybrid of one-to-one and group conversation. In the list of chats you will see customer names and avatars, and the customer will see your business name and avatar, like with one-to-one conversations. But inside it works as a group, allowing customer to see who sent the message, and allowing you to add other participants from the business side, for delegation and escalation of customer questions.</p> +<p>This can be done manually, or you can automate these conversations using bots that can answer some customer questions and then add a human to the conversation when appropriate or requested by the customer. We will be offering more bot-related features to the app and a simpler way to program bots very soon - watch our announcements.</p> +<h3 id="better-user-experience" tabindex="-1">Better user experience</h3> +<img src="https://simplex.chat/blog/images/20241210-reactions.png" width="288" class="float-to-right" /> +<p><strong>Chat navigation</strong></p> +<p>This has been a long-standing complaint from the users: <em>why does the app opens conversations on the last message, and not on the first unread message</em>?</p> +<p>Android and desktop apps now open the chat on the first unread message. It will soon be done in the iOS app too.</p> +<p>Also, the app can scroll to the replied message anywhere in the conversation (when you tap it), even if it was sent a very long time ago.</p> +<p><strong>See who reacted!</strong></p> +<p>This is a small but important change - you can now see who reacted to your messages!</p> +<h3 id="improving-notifications-in-ios-app" tabindex="-1">Improving notifications in iOS app</h3> +<p>iOS notifications in a decentralized network is a complex problem. We <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html#ios-notifications-require-a-server">support iOS notifications</a> from early versions of the app, focussing on preserving privacy as much as possible. But the reliability of notifications was not good enough.</p> +<p>We solved several problems of notification delivery in this release:</p> +<ul> +<li>messaging servers no longer lose notifications while notification servers are restarted.</li> +<li>Apple can drop notifications while your device is offline - about 15-20% of notifications are dropped because of it. The servers and the new version of the app work around this problem by delivering several last notifications, to show notifications correctly even when Apple drops them.</li> +</ul> +<p>With these changes the iOS notifications remained as private and secure as before. The notifications only contain metadata, without the actual messages, and even the metadata is end-to-end encrypted between SimpleX notification servers and the client device, inaccessible to Apple push notification servers.</p> +<p>There are two remaining problems we will solve soon:</p> +<ul> +<li>iOS only allows to use 25mb of device memory when processing notifications in the background. This limit didn't change for many years, and it is challenging for decentralized design. If the app uses more memory, iOS kills it and the notification is not shown – approximately 10% of notifications can be lost because of that.</li> +<li>for notifications to work, the app communicates with the notification server. If the user puts the app in background too quickly, the app may fail to enable notification for the new contacts. We plan to change clients and servers to delegate this task to messaging servers, to remove the need for this additional communication entirely, without any impact on privacy and security. This will happen early next year.</li> +</ul> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 10 Dec 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html + + + Servers operated by Flux - true privacy and decentralization for all users + https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html + <h1 id="servers-operated-by-flux-true-privacy-and-decentralization-for-all-users" tabindex="-1">Servers operated by Flux — true privacy and decentralization for all users</h1> +<p><strong>Published:</strong> Nov 25, 2024</p> +<ul> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#welcome-flux--the-new-servers-in-v62-beta1">Welcome, Flux</a> — the new servers in v6.2-beta.1!</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#whats-the-problem">What's the problem</a>?</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#using-two-operators-improves-connection-privacy">Using two operators improves connection privacy</a>.</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#simplex-decentralization-compared-with-matrix-session-and-tor">SimpleX decentralization</a> compared with Matrix, Session and Tor.</li> +<li><a href="https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html#whats-next-for-simplex-network-decentralization">What's next</a> for SimpleX network decentralization?</li> +</ul> +<h2 id="welcome-flux-the-new-servers-in-v62-beta1" tabindex="-1">Welcome, Flux – the new servers in v6.2-beta.1!</h2> +<img src="https://simplex.chat/blog/images/20241125-operators-1.png" width="288" class="float-to-right" /> +<p><a href="https://runonflux.com/">Flux</a> is a decentralized cloud infrastructure that consists of user-operated nodes [1]. With this beta release all SimpleX Chat users can use pre-configured Flux servers to improve metadata privacy and decentralization.</p> +<p>We are very grateful to <a href="https://x.com/dak_flux">Daniel Keller</a>, CEO and co-founder of Flux, for supporting SimpleX network, and betting on our vision of extreme decentralization of communication. Flux investing their infrastructure in our vision is a game changer for us and our users.</p> +<p>Download new mobile and desktop SimpleX apps from <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight</a> (iOS), <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a>, our <a href="https://simplex.chat/fdroid/">F-Droid repo</a> or <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v6.2.0-beta.1">GitHub</a>.</p> +<p>Read on to learn why it is important and how using several operators improves metadata privacy.</p> +<h2 id="whats-the-problem" tabindex="-1">What's the problem?</h2> +<p>SimpleX network is fully decentralized, without any central component or bootstrap nodes — you could use your own servers from day one. While there is no full list of SimpleX network servers, we see many hundreds of servers in public groups.</p> +<p>But a large number of SimpleX app users use the servers pre-configured in the app. Even though the app randomly chooses 4 servers in each connection to improve privacy and security, prior to v6.2 for these users the servers were operated by the same company — ourselves.</p> +<p>Our open-source code that we are <a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#legally-binding-transparency">legally bound to use</a> doesn't provide any metadata that could be used to learn who connects to whom. But the privacy of users' connections still depends on us honouring our promises and <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/PRIVACY.md">privacy policy</a>. Flux servers in the app improve that.</p> +<h2 id="using-two-operators-improves-connection-privacy" tabindex="-1">Using two operators improves connection privacy</h2> +<img src="https://simplex.chat/blog/images/20241125-operators-2.png" width="288" class="float-to-right" /> +<p>To ensure that the users' metadata from different servers cannot be combined to discover who talks to whom, the servers in each connection have to be operated by different independent organizations.</p> +<p>Before this version the app was choosing servers randomly. Now, when both SimpleX Chat and Flux servers are enabled it will always choose servers of different operators in each connection to receive messages and for <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a>, increasing metadata privacy for all users.</p> +<p>Flux servers are configured as opt-in, and the privacy policy and conditions of use that apply to Flux servers are the same as for SimpleX Chat servers, to make it simple for the users.</p> +<p>To improve connection privacy by using Flux servers all you have to do is to enable Flux once the app offers it, or later, via Network &amp; servers settings, and accept that the same conditions apply.</p> +<img src="https://simplex.chat/blog/images/20241125-operators-3.png" width="330" class="float-to-left" /> +<p>By default, if both Flux and SimpleX servers are enabled in this version, you will be using SimpleX Chat servers to receive messages, Flux servers to forward messages to SimpleX Chat servers, and the servers of both to forward messages to unknown servers. We will enable Flux to receive messages by default a bit later, or you can change it now via settings.</p> +<p>Any additional servers you add to app configuration are treated as belonging to another operator, so they will also be used to improve connection privacy, together with pre-configured servers, unless you disable them.</p> +<h2 id="simplex-decentralization-compared-with-matrix-session-and-tor" tabindex="-1">SimpleX decentralization compared with Matrix, Session and Tor</h2> +<p>SimpleX network decentralization model is different from other decentralized networks in several important aspects.</p> +<table> +<thead> +<tr> +<th style="text-align:left">Communication network</th> +<th style="text-align:center">SimpleX</th> +<th style="text-align:center">Matrix</th> +<th style="text-align:center">Session</th> +<th style="text-align:center">Tor-based</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align:left">Full decentralization</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +<tr> +<td style="text-align:left">No user profile identity</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +<tr> +<td style="text-align:left">Connection privacy</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">✅</td> +</tr> +<tr> +<td style="text-align:left">Server operator transparency</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">✅</td> +<td style="text-align:center">-</td> +<td style="text-align:center">-</td> +</tr> +</tbody> +</table> +<p><strong>Full decentralization</strong></p> +<p>Fully decentralized networks do not have a central component, bootstrap nodes or any global shared state, like in cryptocurrency/blockchain-based communication networks. The presence of any central component or shared state introduces an attack vector that undermines privacy and security of the network.</p> +<p><strong>No user profile identity</strong></p> +<p>User profile identities, even if it is only a random number or a long-term key, undermine privacy of users connections, because in some cases they may allow network operators, observers and users to find out who talks to whom.</p> +<p>Most communication networks rely on fixed user profile identities. It includes Matrix and communication networks with onion routing.</p> +<p>SimpleX network design avoids the need for profile identities or keys, while still allowing optional long-term addresses for users and groups for convenience. It protects users from being discovered and approached by malicious parties, and many family users chose to use SimpleX with children because of it.</p> +<p><strong>Connection privacy</strong></p> +<p>SimpleX network has <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">private message routing</a> (2-hop onion routing) — it prevents server operators from discovering who connects to whom via network traffic metadata. Onion routing used in Tor-based messengers and in Session also hides it. But because neither Tor nor Session users have knowledge about who operates servers, in some cases the clients may connect via the servers controlled by one entity, that may learn the IP addresses of both parties.</p> +<p>Statistically, if traffic metadata from 2% of onion network servers is available to an attacker, and the client chooses servers randomly, after about 1750 of such choices the probability of choosing attacker's servers as both entry and exit nodes, and connection privacy being compromised becomes over 50% [2].</p> +<p>Matrix network does not provide connection privacy, as not only user identity exists, it is tied to a specific server that knows all user connections and a part of user's contacts connections. What is worse, Element — the most widely used Matrix app — offers the servers of only one organization to create an account, resulting in some degree of network centralization.</p> +<p><strong>Server operator transparency</strong></p> +<p>Operator transparency means that network users know who operates the servers they use.</p> +<p>You may argue that when the operators are known, the servers data can be requested by the authorities. But such requests, in particular when multiple operators are used by all users, will follow a due legal process, and will not result in compromising the privacy of all users.</p> +<p>With Tor and Session networks such legal process becomes impossible, and some users may see it as advantage. But nothing prevents the attackers, both criminal and corporate- or state-funded, to compromise the privacy of Tor or Session users by running many servers, or by purchasing traffic metadata from the existing server owners — there are no legal conditions that prohibit server owners of these networks to share or sell traffic data.</p> +<p>Because of that, we see operator transparency in SimpleX network as a better trade-off for privacy of most users than operator anonymity provided by Session and Tor. You can see privacy of network participants as a zero sum game — for the end users to have it, server operators should be known.</p> +<h2 id="whats-next-for-simplex-network-decentralization" tabindex="-1">What's next for SimpleX network decentralization</h2> +<p>SimpleX network is designed for extreme decentralization — not only users are distributed across network operators, as happens with federated networks, but each conversation will be relying on servers of 4-6 independent operators, and these operators will be regularly and automatically changed in the near future.</p> +<p>We believe that the only viable commercial model is freemium — a small share of paying users, who have better service quality and additional features, sponsors free users. This model doesn't have downsides of exploitative &quot;provide service, sell data&quot; approaches, that technology monopolies practice, and it also doesn't have problems of cryptocurrency blockchains, that have shared and immutable state, and also have regulatory problems.</p> +<p>To provide this extreme decentralization with freemium model we will create the system of payments allowing server operators to receive money for infrastructure certificates that will be used with any other participating network operators without compromising privacy of the paying users. You can read about this model <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2024-04-26-commercial-model.md">here</a>. We will be writing more about it as this development progresses.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/#please-support-us-with-your-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +<p>[1]: You can also to self-host your own SimpleX servers on <a href="https://home.runonflux.io/apps/marketplace?q=simplex">Flux decentralized cloud</a>.</p> +<p>[2]: The probability of connection being de-anonymized and the number of random server choices follow this equation: <code>(1 - s ^ 2) ^ n = 1 - p</code>, where <code>s</code> is the share of attacker-controlled servers in the network, <code>n</code> is the number of random choices of entry and exit nodes for the circuit, and <code>p</code> is the probability of both entry and exit nodes, and the connection privacy being compromised. Substituting <code>0.02</code> (2%) for <code>s</code>, <code>0.5</code> (50%) for <code>p</code>, and solving this equation for <code>n</code> we obtain that <code>1733</code> random circuits have 50% probability of privacy being compromised.</p> +<p>Also see <a href="https://ritter.vg/p/tor-v1.6.pdf">this presentation about Tor</a>, specifically the approximate calculations on page 76, and also <a href="https://blog.torproject.org/announcing-vanguards-add-onion-services/">Tor project post</a> about the changes that made attack on hidden service anonymity harder, but still viable in case the it is used for a long time.</p> + + + Mon, 25 Nov 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html + + + Wired’s Attack on Privacy + https://simplex.chat/blog/20241016-wired-attack-on-privacy.html + <h1 id="wireds-attack-on-privacy" tabindex="-1">Wired’s Attack on Privacy</h1> +<p><strong>Published:</strong> Oct 16, 2024</p> +<img src="https://simplex.chat/blog/images/20241016-wired-privacy.jpg" width="330" class="float-to-right" /> +<p>The <a href="https://www.wired.com/story/neo-nazis-flee-telegram-encrypted-app-simplex/">Wired article</a> by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in privacy policy is biased and misleading. By cherry-picking information from <a href="https://www.isdglobal.org/digital_dispatches/neo-nazi-accelerationists-seek-new-digital-refuge-amid-looming-telegram-crackdown/">the report</a> by the Institute for Strategic Dialogue (ISD), Wired fails to mention that SimpleX network design prioritizes privacy in order to protect human rights defenders, journalists, and everyday users who value their privacy — many people feel safer using SimpleX than non-private apps, being protected from strangers contacting them.</p> +<p>Yes, privacy-focused SimpleX network offers encryption and anonymity — that’s the point. To paint this as problematic solely because of who may use such apps misses the broader, critical context.</p> +<p>SimpleX’s true strength lies in protection of <a href="https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html">users' metadata</a>, which can reveal sensitive information about who is communicating, when, and how often. SimpleX protocols are designed to minimize metadata collection. For countless people, especially vulnerable groups, these features can be life-saving. Wired article ignores these essential protections, and overlooks the positive aspects of having such a unique design, as noted in the publication which <a href="https://www.maargentino.com/is-telegrams-privacy-shift-driving-extremists-toward-simplex/">they link to</a>:</p> +<blockquote> +<p><em>“SimpleX also has a significant advantage when it comes to protecting metadata — the information that can reveal who you’re talking to, when, and how often. SimpleX is designed with privacy at its core, minimizing the amount of metadata collected and ensuring that any temporary data necessary for functionality is not retained or linked to identifiable users.”</em></p> +</blockquote> +<p>Both publications referenced by Wired also explore how SimpleX design actually hinders extremist groups from spreading propaganda or building large networks. SimpleX design restricts message visibility and file retention, making it far from ideal for those looking to coordinate large networks. Yet these important qualities are ignored by Wired in favor of fear-mongering about encryption — an argument we've seen before when apps like Signal <a href="https://foreignpolicy.com/2021/03/13/telegram-signal-apps-right-wing-extremism-islamic-state-terrorism-violence-europol-encrypted/">faced similar treatment</a>. Ironically, Wired just a month earlier encouraged its readers to <a href="https://www.wired.com/story/gadget-lab-podcast-657/">adopt encrypted messaging apps</a>, making its current stance even more contradictory.</p> +<p>The vilification of apps that offer critically important privacy, anonymity, and encryption must stop. That a small share of users may abuse these tools doesn’t justify broad criticism. Additionally, the lobbying for client-side scanning, which Wired’s article seems to indirectly endorse, is not only dangerous but goes against fundamental principles of free speech and personal security. We strongly oppose the use of private communications for any kind of monitoring, including AI training, which would undermine the very trust encryption is designed to build.</p> +<p>It’s alarming to see Wired not only criticize SimpleX for its strong privacy protections but also subtly blame the European Court of Human Rights for <a href="https://www.theregister.com/2024/02/15/echr_backdoor_encryption/">upholding basic human rights</a> by rejecting laws that would force encrypted apps to scan and hand over private messages before encryption. Wired writes:</p> +<blockquote> +<p><em>…European Court of Human Rights decision in February of this year ruled that forcing encrypted messaging apps to provide a backdoor to law enforcement was illegal. This decision undermined the EU’s controversial proposal that would potentially force encrypted messaging apps to scan all user content for identifiers of child sexual abuse material.</em></p> +</blockquote> +<p>This commentary is both inappropriate and misguided — it plays into the hands of anti-privacy lobbyists attempting to criminalize access to private communications. Framing privacy and anonymity as tools for criminals ignores the reality that these protections are essential for millions of legitimate users, from activists to journalists, to ordinary citizens. Client-side scanning can't have any meaningful effect on reducing CSAM distribution, instead resulting in increase of crime and abuse when criminals get access to this data.</p> +<p>We need to correct this narrative. The real danger lies not in protecting communication, but in failing to do so. Privacy apps like SimpleX are crucial, not just for those resisting mass surveillance, but for everyone who values the right to communicate without fear of their conversations being monitored or misused. This is a right we must defend and incorporate into law, <a href="https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html">as we wrote before</a>.</p> +<p>Wired could have stood on the right side of this battle and helped normalize the demand for privacy, genuinely protecting people from criminals and from the exploitation of the increasingly AI-enabled mass surveillance. Instead they chose the path of spreading fear and uncertainty of encrypted messaging and tools that enable privacy and anonymity.</p> +<p>Spreading misinformation about privacy and security undermines trust in the tools that protect us, making it easier to justify more invasive surveillance measures that chip away at our civil liberties.</p> +<p>Wired did not respond to our request for comment.</p> + + + Wed, 16 Oct 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20241016-wired-attack-on-privacy.html + + + SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. + https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html + <h1 id="simplex-network-security-review-of-protocols-design-by-trail-of-bits-v61-released-with-better-calls-and-user-experience" tabindex="-1">SimpleX network: security review of protocols design by Trail of Bits, v6.1 released with better calls and user experience.</h1> +<p><strong>Published:</strong> Oct 14, 2024</p> +<p><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#simplex-cryptographic-design-review-by-trail-of-bits">New security audit</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#review-findings-our-comments-and-improvements">review findings</a>, our comments and improvements.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#next-security-audit-in-2025">next</a>: security audit in early 2025.</li> +</ul> +<p><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#whats-new-in-v61">What's new in v6.1</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-calls">better calls</a>.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-ios-notifications">better iOS notifications</a>.</li> +<li><a href="https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html#better-user-experience">better user experience</a>.</li> +</ul> +<h2 id="simplex-cryptographic-design-review-by-trail-of-bits" tabindex="-1">SimpleX cryptographic design review by Trail of Bits</h2> +<img src="https://simplex.chat/blog/images/20221108-trail-of-bits.jpg" width="240" class="float-to-right" /> +<p>It's been almost two years since Trail of Bits did the first security assessment of SimpleX Chat.</p> +<p>Since then SimpleX Chat grew a lot, both in the number of users and in its functionality. We added XFTP — a protocol for sending files, — and XRCP — the protocol for using a mobile app profile from a desktop app. Messaging protocols also evolved a lot, adding private message routing and quantum resistant encryption.</p> +<p>Trail of Bits reviewed the design of protocols used in SimpleX network and applications in July 2024. Even though there are no critical issues, we made some security improvements based on this report.</p> +<p><a href="https://www.trailofbits.com/about">Trail of Bits</a> is a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects. Its engineers reviewed the cryptographic design of the protocols used in SimpleX network and applications over a week:</p> +<ul> +<li>SimpleX Messaging Protocol (SMP), including a formal verification of currently used message queue negotiation protocol,</li> +<li>the SMP agent protocol,</li> +<li>the push notification system,</li> +<li>the file transfer protocol (XFTP),</li> +<li>the remote control protocol (XRCP),</li> +<li>and the chat protocol.</li> +</ul> +<p>There are 3 medium and 1 low severity findings, all of which require a high difficulty attack to exploit — the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. Additionally, there are 3 informational findings.</p> +<p>3 of these issues are improved in v6.1, and the remaining issues are accepted. Below we are commenting on these findings in detail, and also on the released improvements.</p> +<p>The full cryptographic design review is available <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SimpleX_Design_Review_2024_Summary_Report_12_08_2024.pdf">here</a>.</p> +<p>We are very thankful to Trail of Bits and their engineers for their work identifying these issues and helping us make SimpleX Chat more secure.</p> +<h3 id="review-findings-our-comments-and-improvements" tabindex="-1">Review findings, our comments and improvements</h3> +<h4 id="protocols-specifications-informational" tabindex="-1">Protocols specifications (informational)</h4> +<p>The review finding #1 is that the protocols specification is informal. We addressed <a href="https://github.com/simplex-chat/simplexmq/commit/7b6c86c6c1093cdae5ad2ee566655828076bc25c">reported</a> <a href="https://github.com/simplex-chat/simplex-chat/commit/1cb3c25478db0f2a42c943f7469f5f9f75752a27">inconsistencies</a>, and we accept that we need to improve specification beyond verbose descriptions and ABNF syntax specification, and add algebraic notations and sequence diagrams. Having said that, the current specification correctly describes the implemented protocol, without any contradictions.</p> +<h4 id="user-correlating-attacks-via-introduced-latency-or-via-get-command-of-messaging-protocol-medium-and-low-severity" tabindex="-1">User-correlating attacks via introduced latency or via GET command of messaging protocol (medium and low severity)</h4> +<p>These two findings #7 and #2 of the report relate to the attacks confirming that two known users communicate via observing their internet traffic.</p> +<p>The first attack is possible for a party that can introduce the latency in the network traffic. This attacker has to control some network node that passes the traffic of the sender — for example, it could be the sender's ISP, VPN provider, Tor entry node operator, the operator of the forwarding SMP server or a server hosting provider, etc. Such attacker can correlate delays in sender's traffic and the suspected recipient's traffic to confirm that they communicate.</p> +<p>The second attack relates to GET command used by iOS clients receiving notifications — depending on whether the server has the message, there will be a different number of packets sent, allowing the observer to determine if there was the message. While this comment is correct, in practice iOS clients only send GET commands when they receive notification, which also happens only when there is a message on the server, so in absolute majority of cases the number of packets will be the same.</p> +<p>These are not new findings — this type of attacks is covered in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md#a-passive-adversary-able-to-monitor-a-set-of-senders-and-recipients">threat model</a>: <em>a passive adversary able to monitor a set of senders and recipients <strong>can</strong> perform traffic correlation attacks against senders and recipients and correlate senders and recipients within the monitored set, frustrated by the number of users on the servers</em>.</p> +<p>As threat model states, this attack is more likely to be successful with the less busy servers, and also for the users with few connections.</p> +<p>The recommendation of the review is to add optional randomized latency to message delivery that would reduce the opportunities for traffic correlation attacks — we consider adding it in the future.</p> +<h4 id="a-compromised-transport-protocol-allows-more-efficient-correlation-attacks-medium-severity" tabindex="-1">A compromised transport protocol allows more efficient correlation attacks (medium severity)</h4> +<p>The finding #3 is about the incorrect statement in threat model for SMP and XFTP protocols: <em>a passive adversary, able to monitor a set of senders and recipients, <strong>cannot</strong>, even in case of a compromised transport protocol perform traffic correlation attacks with any increase in efficiency over a non-compromised transport protocol</em>.</p> +<p>For protocols prior to v6.1 it is only partially correct, as responses to the commands that create a messaging queue or a file chunk include the identifiers both for senders and for the recipients, so if any observers were to compromise transport protocol (TLS) and record these identifiers, then they were able to correlate message senders with the recipients (and file recipients with the file senders).</p> +<p>The solution to make this correlation impossible even in case of compromised TLS is to encrypt these identifiers, as proposed in the review, or, better, encrypt the whole transmission inside TLS.</p> +<p>However unlikely is TLS being compromised, we added additional <a href="https://github.com/simplex-chat/simplexmq/pull/1317/files">transport encryption layer in SMP protocol</a>, where it can be more important, and we are going to add the same layer of encryption in XFTP protocol later, where we <a href="https://github.com/simplex-chat/simplexmq/commit/7b6c86c6c1093cdae5ad2ee566655828076bc25c">amended the threat model</a>.</p> +<h4 id="xrcp-protocol-recommendations-informational" tabindex="-1">XRCP protocol recommendations (informational)</h4> +<p>XRCP protocol is used for connecting desktop and mobile. There are two findings in the review:</p> +<ul> +<li>SHA256 was used as a KDF in XRCP (#4).</li> +<li>there was no forward secrecy or break-in recovery between sessions (#5).</li> +</ul> +<p>SHA256 is now <a href="https://github.com/simplex-chat/simplexmq/pull/1302/files">replaced with SHA3-256</a>, as was <a href="https://www.ietf.org/archive/id/draft-josefsson-ntruprime-hybrid-01.html">recommended</a> by the internet draft about hybrid key agreement that XRCP uses.</p> +<p>Even though XRCP sessions are short lived, and usually the connection happens over local network, we added forward secrecy to XRCP sessions <a href="https://github.com/simplex-chat/simplexmq/pull/1328/files">here</a> and <a href="https://github.com/simplex-chat/simplex-chat/pull/4926/files">here</a> — each request from desktop app to mobile app is now encrypted with a new key derived from chain ratchets. This improves security of this connection.</p> +<p>We believe that it is unnecessary to have in-session break-in recovery in XRCP protocol, as there is break-in recovery between the sessions.</p> +<h4 id="device-compromise-can-be-hidden-in-some-scenarios-medium" tabindex="-1">Device compromise can be hidden in some scenarios (medium)</h4> +<p>The finding #6 in the report is about an attacker who was not only able to break into the device and get a copy of the database, which would be mitigated by break-in recovery in <a href="https://simplex.chat/docs/glossary.html#double-ratchet-algorithm">double ratchet protocol</a>, but also was able to modify the state of the app database and to substitute the addresses and cryptographic keys of the messaging queues used with some contact with other message queues that the attacker controls.</p> +<p>Even though this is a very hard attack, if successful, it would allow the attacker intercepting all messages with this contact.</p> +<p>Effectively, it is a <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">man-in-the-middle attack</a>, where an intermediary is inserted via the app database modification. Such attack can be mitigated by periodic verification of security codes. Although, the attacker who was able to modify the state of the device, could have also modified the app itself, making it show the same security code as the compromised contact has, thus avoiding detection.</p> +<p>We accept that such an attack is possible, and we don't believe there is any viable defense against the attacker who can modify the device state. We may consider adding the measures to validate the database integrity, but they may be ineffective in case the app and/or operating system are compromised.</p> +<h3 id="next-security-audit-in-2025" tabindex="-1">Next: security audit in 2025</h3> +<p>We are planning the implementation security assessment with Trail of Bits in the beginning of 2025. It will be a twice bigger assessment than we did in 2022 — it will cover both the core of the app and the handling of cryptographic secrets in the mobile applications.</p> +<h2 id="whats-new-in-v61" tabindex="-1">What's new in v6.1</h2> +<p>This release has many user experience and stability improvements.</p> +<h3 id="better-calls" tabindex="-1">Better calls</h3> +<img src="https://simplex.chat/blog/images/20241014-calls.png" width="288" class="float-to-right" /> +<p>This release improves reliability and usability of the calls. Now you can enable the camera and share the screen from the desktop app even if the call started as a voice call. We've also fixed several issues that prevented calls from connecting.</p> +<p>This is a substantial change, and some issues may have been introduced - please report them.</p> +<p>We will be further improving the calls interface in the app in the next versions.</p> +<h3 id="better-ios-notifications" tabindex="-1">Better iOS notifications</h3> +<p>iOS notifications were added <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html">more than 2 years ago</a>, based on this <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html">system design</a>. Until recently we made almost no improvements to them. As the number of iOS users is growing, their reliability is insufficient. In addition to that, once we started the work on improving them, we have found several important issues, one of which was introduced recently, when we improved the speed of creating new connections.</p> +<p>This release fixes many important issues with iOS notifications delivery in iOS app, improves app performance and reduces traffic required to manage notifications.</p> +<p>We also fixed several notification server issues, made change that almost completely prevents losing notifications when notification servers are restarted, and added real-time monitoring to diagnose any issues with iOS notifications delivery.</p> +<p>This work is not over – iOS notifications in a decentralized network are complex and require more work. We will be further improving both client apps and servers to make their delivery stable.</p> +<h3 id="better-user-experience" tabindex="-1">Better user experience</h3> +<h4 id="new-conversation-layout-and-customizable-messages" tabindex="-1">New conversation layout and customizable messages</h4> +<img src="https://simplex.chat/blog/images/20241014-messages.png" width="288" class="float-to-right" /> +<p>Messages are now grouped when they are sent sequentially, with less than 60 seconds between them. We also made message shapes configurable, and separated the messages in different days. When you scroll conversation quickly, there will be a floating date indication, allowing to find messages faster.</p> +<h4 id="improved-switching-between-user-profiles" tabindex="-1">Improved switching between user profiles</h4> +<p><img src="https://simplex.chat/blog/images/20241014-profiles2.png" width="288" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20241014-profiles1.png" width="288" class="float-to-right" /></p> +<p>Another improvement relates to switching between chat profiles. Previously, when you added multiple chat profiles to the app, there were two problems:</p> +<ul> +<li>you had to tap twice to get to some important functions in the app,</li> +<li>anybody who could see your screen, could also see all your chat profiles.</li> +</ul> +<p>We changed this design by making important functions available after tapping profile image once, and by only showing the previously used profile image to switch to it quickly, while switching to other profiles now requires scrolling to them or opening <em>Your chat profiles</em> screen.</p> +<p>You also can switch chat profile when creating a one-time invitation link.</p> +<h4 id="faster-deletion-moderation-and-forwarding-of-messages" tabindex="-1">Faster deletion, moderation and forwarding of messages</h4> +<img src="https://simplex.chat/blog/images/20241014-forward.png" width="288" class="float-to-right" /> +<p>You now can forward multiple messages at once - up to 20. If you are forwarding messages with files or media, and they were not received, the app will offer you to download them, and it will also allow forwarding messages without files. These messages will be &quot;packed&quot; into the smallest number of sent messages as possible. If there are no images and messages are not too large, it will be just one sent message containing all forwarded messages.</p> +<p>The previous version allowed deleting and moderating multiple messages. As most users now upgraded the app, we increased the maximum number of messages that can be deleted or moderated to 200 messages - in most cases all these deletions will be packed into one sent message.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge <em>thank you</em> to everybody who donated to SimpleX Chat!</p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Mon, 14 Oct 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html + + + SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. + https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html + <h1 id="simplex-network-the-investment-from-jack-dorsey-and-asymmetric-v60-released-with-the-new-user-experience-and-private-message-routing" tabindex="-1">SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing.</h1> +<p><strong>Published:</strong> Aug 14, 2024</p> +<p><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#simplex-chat-vision-and-funding-20">SimpleX Chat: vision and funding 2.0</a>:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-past-investment-from-village-global">The past</a>: investment from Village Global.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-present-announcing-the-investment-from-jack-dorsey-and-asymmetric">The present</a>: announcing the investment from Jack Dorsey and Asymmetric Capital Partners.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#the-future-faster-development-and-transition-to-non-profit-governance">The future</a>: faster development and the path to non-profit governance.</li> +</ul> +<p><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#whats-new-in-v60">What's new in v6.0</a>:</p> +<ul> +<li>Private message routing — now enabled by default.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-chat-experience">New chat experience</a>: +<ul> +<li>connect to your friends faster.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-reachable-interface">new reachable interface</a>.</li> +<li>archive contacts to chat later.</li> +<li>new way to start chat.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#moderate-like-a-pro">moderate like a pro</a>: delete many messages at once.</li> +<li>new chat themes<sup>*</sup></li> +<li>increase font size<sup>**</sup>.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#new-media-options">New media options</a>: +<ul> +<li>play from the chat list.</li> +<li>blur for better privacy.</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#share-from-other-apps">share from other apps</a><sup>*</sup>.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html#improved-networking-and-reduced-battery-usage">Improved networking and reduced battery usage</a></li> +</ul> +<p>* New for iOS app.</p> +<p>** Android and desktop apps.</p> +<h2 id="simplex-chat-vision-and-funding-20" tabindex="-1">SimpleX Chat: vision and funding 2.0</h2> +<h3 id="the-past-investment-from-village-global" tabindex="-1">The past: investment from Village Global</h3> +<p>Last year <a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#how-is-it-funded-and-what-is-the-business-model">we announced</a> pre-seed funding from several angel investors and Village Global. Some of our users were very excited that we have funds to continue developing SimpleX network. But as some of Village Global LPs (Limited Partners) are <a href="https://www.villageglobal.vc/">the founders of very large technology companies</a>, some of our users were worried about any negative influence this investment might have on the project.</p> +<p><a href="https://www.villageglobal.vc/team/ben-casnocha">Ben Casnocha</a>, the founder and general partner of Village Global, commented on their investment:</p> +<blockquote> +<p>I believe in SimpleX Chat vision and team’s ability to execute it. The growing number of Internet users who demand privacy of their data and contacts will make SimpleX Chat profitable, which is critically important for any sustainable organization.</p> +<p>We are fortunate to have LPs who founded many iconic Internet ventures. But they don’t have any influence on the 400+ companies we invested in. They are financial investors in our fund and exert no control or influence on any of the underlying portfolio companies.</p> +<p>What's more, we believe that founders should lead their ventures, as it yields better results – our investment in SimpleX Chat has no control provisions. We are happy to help, but we don’t control any decisions nor have a board seat. Evgeny runs the company independently.</p> +</blockquote> +<p>Ben, thank you for believing in our vision – without it SimpleX Chat would simply not exist, as most other investors at the time did not believe that privacy could ever escape the niche of privacy enthusiasts – and we already see the first signs of it happening.</p> +<h3 id="the-present-announcing-the-investment-from-jack-dorsey-and-asymmetric" tabindex="-1">The present: announcing the investment from Jack Dorsey and Asymmetric</h3> +<p>The Android app recently hit <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">100,000 downloads on Google Play Store</a>, and our users naturally ask for improved reliability, privacy, security, better user experience and design – all at the same time, and as soon as possible. This requires more funding.</p> +<p>We are very happy to announce that we now have funds to move faster – we raised a $1.3 million pre-seed round led by <a href="https://en.wikipedia.org/wiki/Jack_Dorsey">Jack Dorsey</a>, with participation of <a href="https://www.acp.vc/">Asymmetric Capital Partners</a> (ACP) VC fund.</p> +<p>When Jack discovered SimpleX Chat last year, he <a href="https://x.com/jack/status/1661681076983529479">posted on Twitter</a>:</p> +<blockquote> +<p>Better than Signal? Looks promising.<br /> +A few bugs and UX issues but great foundation. Love that it’s public domain.</p> +</blockquote> +<p>And <a href="https://primal.net/e/note1txz9xmmc456kwcg7zrsrtqrhn7as29ptuz0qulu452k8n85hsshqq6uh6q">on Nostr</a>:</p> +<blockquote> +<p>A full day with @SimpleX Chat. Solid overall. TestFlight is not recommended. There are some scaling issues today. And not the most intuitive onboarding for everyone. Name still reminds everyone of herpes. All fixable. It’s fast and doesn’t require a phone number or email and I do believe people will eventually see the value of that. Finally, some competition for Signal, and in a permissionless way. And def a solid path so apps don’t have to build their own DM experiences.</p> +</blockquote> +<p>Jack, we are super lucky to have your support and investment – thank you for believing in our ability to build a better messaging network! It is a hard work, and we’ve made a lot of progress since your note was written, and a lot of work is ongoing!</p> +<p>The ACP investment is strategically important – it is a fund that only invests in B2B startups, and SimpleX Chat currently is mostly used by individual users. Making a private communication network sustainable requires its adoption by businesses, and we already see a growing usage by the small teams.</p> +<p><a href="https://www.acp.vc/team/rob-biederman">Rob Biederman</a> and <a href="https://www.acp.vc/team/sam">Sam Clayman</a>, the partners of ACP, commented:</p> +<blockquote> +<p>We believe that SimpleX Chat network can grow into a de facto Internet standard for private and secure communications for both businesses and individual users, unifying instant and email-like messaging into a single product.</p> +<p>Emails no longer provide privacy and security that businesses require, particularly given the emerging threat of AI-led phishing and social engineering attacks. We look forward to SimpleX network providing a secure alternative.</p> +</blockquote> +<p>I was lucky to have met Rob, Sam and the ACP team when I was presenting SimpleX Chat in London – thank you all for your support and believing that the future of communication requires a single product, both for businesses and individual users.</p> +<h3 id="the-future-faster-development-and-the-path-to-non-profit-governance" tabindex="-1">The future: faster development and the path to non-profit governance</h3> +<p>Jack Dorsey and ACP support enable us to make huge product improvements, thanks to a bigger team, and provide us with medium-term funding to get to the next stage of product and business evolution. Like with Village Global, this is a financial investment, without control or board seat provisions – so the users can be certain that SimpleX remains true to our vision of privacy first communication network.</p> +<p>We already added two great engineers to the team and are about to hire a UX/UI designer.</p> +<p><a href="https://www.trailofbits.com/about/">Trail of Bits</a> has just completed the protocols design security review and will be doing implementation security review in the end of the year. We will publish the first report soon.</p> +<p>This year we will launch group improvements that we presented in the <a href="https://www.youtube.com/watch?v=7yjQFmhAftE">live-stream last year</a>. While the main problem explained in this video was solved with the current design, the issue of group scalability remains – to send a message to a group your client needs to send it to each member, creating substantial traffic.</p> +<p>We will also launch long-form email-like messaging over SimpleX network this year, together with optional short public addresses that show profile you are connecting to before the connection – this is important for any public users and businesses.</p> +<p>The last but not the least, we started the work with <a href="https://www.techlawpartners.com/heather">Heather Meeker</a>, a great legal expert on intellectual property matters and one of the earliest advocates of the open-source software development in businesses, to setup open-source governance model, to some extent similar to how Matrix did it. We believe, and our investors agree, that it would both increase the company value and also create more value for the users community.</p> +<h2 id="whats-new-in-v60" tabindex="-1">What's new in v6.0</h2> +<p>v6.0 is one of our biggest releases ever, with a lot of focus on UX and stability improvements, and the new features the users asked for.</p> +<p>The private message routing <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">we announced before</a> is now enabled for all users by default – it protects users IP addresses and sessions from the destination servers.</p> +<h3 id="new-chat-experience" tabindex="-1">New chat experience</h3> +<h4 id="connect-to-your-friends-faster" tabindex="-1">Connect to your friends faster</h4> +<p>This version includes messaging protocol improvements that reduce twice the number of messages required for two users to connect. Not only it means connecting faster and using less traffic, this change allows to start sending messages sooner, so you would see &quot;connecting&quot; in the list of the chats for a much shorter time than before.</p> +<p>It will be improved further in the next version: you will be able to send messages straight after using the invitation link, without waiting for your contact to be online.</p> +<h4 id="new-reachable-interface" tabindex="-1">New reachable interface</h4> +<img src="https://simplex.chat/blog/images/20240814-reachable.png" width="288" class="float-to-right" /> +<p>Like with the most innovative mobile browsers (e.g., Safari and Firefox), SimpleX Chat users now can use the app with one hand by moving the toolbar and search bar to the bottom of the screen, and ordering the chats with the most recent conversations in the bottom too, where they can be more easily reached on a mobile screen.</p> +<p>This layout is enabled by default, and you can disable it right from the list of chats when you install the new version if you prefer to use conventional UI.</p> +<p>Give it a try – our experience is that that after less than a day of using it, it starts feeling as the only right way. You can always toggle it in the Appearance settings.</p> +<h4 id="archive-contacts-to-chat-later" tabindex="-1">Archive contacts to chat later</h4> +<p><img src="https://simplex.chat/blog/images/20240814-delete-contact-2.png" width="288" class="float-to-right" />   <img src="https://simplex.chat/blog/images/20240814-delete-contact-1.png" width="288" class="float-to-right" /></p> +<p>Now you have two new options when deleting a conversation:</p> +<ul> +<li>only delete conversation, and archive contact. We will add archiving conversation without clearing it in the next version, as some users of our beta version asked.</li> +<li>delete contact but keep the conversation.</li> +</ul> +<p>Also, deleting a contact now requires double confirmation, so you are less likely to delete the contact accidentally. This deletion is irreversible, and the only way to re-connect would be using a new link.</p> +<h4 id="new-way-to-start-chat" tabindex="-1">New way to start chat</h4> +<img src="https://simplex.chat/blog/images/20240814-new-message.png" width="288" class="float-to-right" /> +<p>When you tap pencil button, you will see a large <em>New message</em> sheet, that adds new functions to the options you had before.</p> +<p>Old options:</p> +<ul> +<li><em>Add contact</em> to create a new 1-time invitation link,</li> +<li><em>Scan / paste link</em>: to use the link you received. It can be 1-time invitation, a public SimpleX address, or a link to join the group.</li> +<li><em>Create group</em></li> +</ul> +<p>New options:</p> +<ul> +<li>Open archived chats.</li> +<li>Accept pending contact requests.</li> +<li>Connect to preset public addresses (we will add an option to add your own addresses here too).</li> +<li>Search for your contacts.</li> +</ul> +<h4 id="new-chat-themes" tabindex="-1">New chat themes</h4> +<p>We released the new themes <a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html">for Android and desktop apps</a> in the previous version, and now they are available for iOS too.</p> +<p>You can set different themes for different chat profiles you have, and for different conversations – it can help avoid mistakes about which conversation you are in.</p> +<p>Also, these themes are compatible between platforms, so you can import the theme created on Android into iOS app and vice versa.</p> +<h4 id="moderate-like-a-pro" tabindex="-1">Moderate like a pro</h4> +<img src="https://simplex.chat/blog/images/20240814-delete-messages.png" width="288" class="float-to-right" /> +<p>As much as we disagree with the attacks on the freedom of speech on the society level – all people must be able to express their opinions – we also believe that the small community owners should have full control over which content is allowed and which is not. But as communities grow, bad actors begin to join in order to disrupt, subvert and troll the conversations. So, the moderation tools are critical for small public communities to thrive.</p> +<p>SimpleX Chat already has several moderation tools available for community owners:</p> +<ul> +<li>Moderate individual messages.</li> +<li>Set the default role of the new members to &quot;observer&quot; — they won't be able to send messages until you allow it. In addition to that, by enabling default messages for admins and owners only you can reach out to the new members and ask some questions before allowing to send messages.</li> +<li>Block messages of a member for yourself only.</li> +<li>Block a member for all other members — only admins and group owners can do that.</li> +</ul> +<p>With this version you can now select multiple messages at once and delete or moderate them, depending on your role in the community. The current version limits the number of messages that can be deleted to 20 — this limit will be increased to 200 messages in the next version.</p> +<p>Also, this version makes profile images of the blocked members blurred, to prevent the abuse via inappropriate profile images.</p> +<h4 id="increase-font-size" tabindex="-1">Increase font size</h4> +<p>Android and desktop apps now allow to increase font size inside the app, without changing the system settings. Desktop app also allows to zoom the whole screen — it can be helpful on some systems with a limited support of high density displays.</p> +<p>These settings can be changed via Appearance settings.</p> +<h3 id="new-media-options" tabindex="-1">New media options</h3> +<h4 id="play-from-the-chat-list" tabindex="-1">Play from the chat list</h4> +<img src="https://simplex.chat/blog/images/20240814-play.png" width="288" class="float-to-right" /> +<p>Now you can interact with the media directly from the list of the chats.</p> +<p>This is very convenient – when somebody sends you a voice message or a video, they can be played directly from the list of chats, without opening a conversation. Similarly, an image can be opened, a file can be saved, and the link with preview can be opened in the browser.</p> +<p>And, in some circumstances, this is also more private, as you can interact with the media, without opening the whole conversation.</p> +<p>We will add the option to return missed calls from the chat list in the next version.</p> +<h4 id="blur-for-better-privacy" tabindex="-1">Blur for better privacy</h4> +<p>You can set all images and videos to blur in your app, and unblur them on tap (or on hover in desktop app). The blur level can be set in Privacy and security settings.</p> +<h4 id="share-from-other-apps" tabindex="-1">Share from other apps</h4> +<img src="https://simplex.chat/blog/images/20240814-share.png" width="288" class="float-to-right" /> +<p>Not much to brag about, as most iOS messaging apps allow it, and users expected it to be possible since the beginning.</p> +<p>But iOS makes it much harder to develop the capability to share into the app than Android, so it's only in this version you can share images, videos, files and links into SimpleX Chat from other apps.</p> +<h3 id="improved-networking-and-reduced-battery-usage" tabindex="-1">Improved networking and reduced battery usage</h3> +<p>This version includes the statistics of how your app communicates with all servers when sending and receiving messages and files. This information also includes the status of connection to all servers from which you receive messages — whether the connection is authorized to push messages from server to your device, and the share of these active connections.</p> +<p>Please note, that when you send a message to a group, your app has to send it to each member separately, so sent message statistics account for that — it may seem to be quite a large number if you actively participate in some large groups. Also, message counts not only include visible messages you receive and send, but also any service messages, reactions, message updates, message deletions, etc. — this is the correct reflection of how much traffic your app uses.</p> +<p>This information is only available to your device, we do NOT collect this information, even in the aggregate form.</p> +<p>While the main reason we added this information is to reduce traffic and battery usage, to be able to identify any cases of high traffic, this version already reduced a lot battery and traffic usage, as reported by several beta-version users.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="please-support-us-with-your-donations" tabindex="-1">Please support us with your donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>You might ask: <em>Why do you need donations if you've just raised the investment?</em></p> +<p>Prioritizing users privacy and security, and also raising the investment, would have been impossible without your support and donations.</p> +<p>Also, funding the work to transition the protocols to non-profit governance model would not have been possible without the donations we received from the users.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds — any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Wed, 14 Aug 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html + + + The Future of Privacy: Enforcing Privacy Standards + https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html + <h1 id="the-future-of-privacy-enforcing-privacy-standards" tabindex="-1">The Future of Privacy: Enforcing Privacy Standards</h1> +<p><strong>Published:</strong> Jul 4, 2024</p> +<p>Recent anti-privacy legislations and proposals in <a href="https://www.theverge.com/2024/6/19/24181214/eu-chat-control-law-propose-scanning-encrypted-messages-csam">Europe</a>, <a href="https://theconversation.com/section-702-foreign-surveillance-law-lives-on-but-privacy-fight-continues-229253">the US</a> and <a href="https://www.theguardian.com/technology/article/2024/jun/20/meredith-walker-signal-boss-government-encryption-laws">Australia</a> threaten to infringe our fundamental right to privacy and to create grave risks to the <a href="https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html">safety</a> of children and vulnerable people. It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a right users must constantly fight to protect, and not something that users can be asked to consent away as a condition of access to a service.</p> +<p>Tech giants are trying to normalize surveillance capitalism, often with little to no consequences globally. These companies are contributing to a growing ecosystem where opting out of invasive data hoarding practices is becoming increasingly challenging, if not outright impossible. We are being gaslit by the technology executives who try to justify profiteering from AI theft, from <a href="https://www.computing.co.uk/news/4330395/microsoft-ai-chief-makes-questionable-claims-about-copyright-online-content">Microsoft</a> claiming all our content is fair game for their exploitation to unethical startups like <a href="https://www.theverge.com/2024/6/27/24187405/perplexity-ai-twitter-lie-plagiarism">Perplexity</a> turning the word “<a href="https://x.com/perplexity_ai/status/1789007907092066559">privacy</a>” into a marketable farce.</p> +<h2 id="the-ai-hypes-impact-on-privacy" tabindex="-1">The AI Hype’s Impact on Privacy</h2> +<p>The exaggeration of AI’s actual capabilities and the continuous promotion of its “intelligence” is creating a rat race where tech companies and well-funded startups are evading accountability, as they eagerly collect and exploit more data than ever.</p> +<p>They're prioritizing AI development over user privacy and rights, setting a dangerous precedent for current and future online engagements. They've already normalized the use of AI to scan and analyze supposedly private communications - from emails to instant messages - repackaging this intrusion as &quot;productivity tools”. Meanwhile, most consumers actually want <a href="https://iapp.org/news/a/most-consumers-want-data-privacy-and-will-act-to-defend-it">more data privacy</a>, not less, and are increasingly concerned by the lack of it.</p> +<p>The legal push towards “client-side scanning”, attacks on end-to-end encryption and the support for pro-surveillance legislation gives credibility to these highly intrusive practices that literally endanger lives. And we know that moral obligations mean nothing to corporations benefiting from these exploitative models, so we have to ensure that our demands for privacy are legally enforceable and non-negotiable.</p> +<h2 id="legal-action" tabindex="-1">Legal Action</h2> +<p>We are encouraged to see more legal pressure on companies that exploit user data on a daily basis. For example, the European Center for Digital Rights’ (Noyb) <a href="https://noyb.eu/en/noyb-urges-11-dpas-immediately-stop-metas-abuse-personal-data-ai">complaints</a> against Meta’s abuse of personal data to train their AI and, and the demands from the Norwegian Consumer Council to data protection authority to ensure that applicable laws are enforced against Meta considering there is “<a href="https://www.forbrukerradet.no/side/legal-complaint-against-metas-use-of-personal-content-for-ai-training/">no way to remove personal data from AI models once Meta has begun the training</a>”.</p> +<p>Noyb is taking a strong stance against <a href="https://noyb.eu/en/project/cases">other companies</a> with similar exploitative models, including facial recognition surveillance tools often misused by law enforcement agencies. Consider <a href="https://noyb.eu/en/support">supporting</a> their ongoing efforts — we strongly believe legal action is one of the most effective means to hold these companies accountable for their persistent abuses, which are otherwise shielded by heavily funded self-serving lobby groups.</p> +<h2 id="privacy-as-a-legal-obligation" tabindex="-1">Privacy as a Legal Obligation</h2> +<p>We must shift from a defensive stance to a proactive one by proposing privacy legislation that puts users in direct control of their private data.</p> +<p>This legislation should:</p> +<ol> +<li>Establish non-negotiable provider duties for protecting user privacy, with hefty fines and consequences for service operators who do not comply.</li> +<li>Prevent providers from circumventing these duties through user consent clauses — it should be legally prohibited to ask for a consent to share user data or to use it for anything other than providing a service.</li> +<li>Prevent providers from asking for any more personal information from the users than technically necessary and legally required. For example, asking for a phone number as a condition of access to a service should be made illegal in most cases — it does not provide a sufficient security, exposes users' private information and allows simple aggregation of users' data across multiple services.</li> +<li>Create a strong legal framework that cannot be resisted or modified</li> +</ol> +<p>By codifying these principles into law, we can establish a strong technological framework that is built to create more value for end users, while protecting their privacy against data exploitation, criminal use and identity theft. We will continue the fight against illogical legislative proposals designed to normalize mass surveillance, but our efforts should equally gear towards creating and supporting new models and technological foundations that bring us far closer to the reality we urgently need.</p> +<h2 id="collective-action" tabindex="-1">Collective Action</h2> +<p>There is great work being done by advocacy organizations, and service providers need to contribute to this fight as well by shifting the narrative and reclaiming the term “privacy” from the tech giants who co-opted and corrupted it. We must play a bigger role in supporting users in setting stronger boundaries, making demands, and refusing anything less than genuine privacy and data ownership, while getting comfortable with holding providers accountable for any violations.</p> +<p>Privacy should be seen as a fundamental obligation of technology providers, and legislators must actively enforce this expectation. The more consumers make this demand, the more pressure we put on anti-privacy lobbyists with rogue motives, the easier it will be to hold abusers accountable, and the more likely we can collectively ensure that a privacy-first web becomes a reality.</p> +<p>You can support privacy today by signing <a href="https://www.globalencryption.org/2024/05/joint-statement-on-the-dangers-of-the-may-2024-council-of-the-eu-compromise-proposal-on-eu-csam/">the petition</a> prepared by Global Encryption Coalition in support of communication privacy. You can also write to your elected representatives, explaining them how data privacy and encrypted communications protect children safety and reduce crime.</p> + + + Thu, 04 Jul 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240704-future-of-privacy-enforcing-privacy-standards.html + + + SimpleX network: private message routing, v5.8 released with IP address protection and chat themes + https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html + <h1 id="simplex-network-private-message-routing-v58-released-with-ip-address-protection-and-chat-themes" tabindex="-1">SimpleX network: private message routing, v5.8 released with IP address protection and chat themes</h1> +<p><strong>Published:</strong> June 4, 2024</p> +<p>What's new in v5.8:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#private-message-routing">private message routing</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#server-transparency">server transparency</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#protect-ip-address-when-downloading-files--media">protect IP address when downloading files &amp; media</a>.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#chat-themes">chat themes</a> for better conversation privacy - in Android and desktop apps.</li> +<li><a href="https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html#group-improvements">group improvements</a> - reduced traffic and additional preferences.</li> +<li>improved networking, message and file delivery.</li> +</ul> +<p>Also, we added Persian interface language to the Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<h2 id="private-message-routing" tabindex="-1">Private message routing</h2> +<h3 id="whats-the-problem" tabindex="-1">What's the problem?</h3> +<img src="https://simplex.chat/blog/images/simplex-explained.svg" width="37%" class="float-right" /> +<p>SimpleX network design has always been focussed on protecting user identity on the messaging protocol level - there is no user profile identifiers of any kind in the protocol design, not even random numbers or cryptographic keys.</p> +<p>Until this release though, SimpleX network had no built-in protection of user transport identities - IP addresses. As previously the users could only choose which messaging relays to use to receive messages, these relays could observe the IP addresses of the senders, and if these relays were controlled by the recipients, the recipients themselves could observe them too - either by modifying server code or simply by tracking all connecting IP addresses.</p> +<p>To work around this limitation, many users connected to SimpleX network relays via Tor or VPN - so that the recipients' relays could not observe IP addresses of the users when they send messages. Still, it was the most important and the most criticized limitation of SimpleX network for the users.</p> +<h3 id="why-didnt-we-just-embed-tor-in-the-app" tabindex="-1">Why didn't we just embed Tor in the app?</h3> +<p>Tor is the best transport overlay network in existence, and it provides network anonymity for millions of Internet users.</p> +<p>SimpleX Chat has many integration points with Tor:</p> +<ul> +<li>it allows <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">dual server addresses</a>, when the same messaging relay can be reached both via Tor and via clearnet.</li> +<li>it utilises Tor's SOCKS proxy &quot;isolate-by-auth&quot; feature to create a new Tor circuit for each user profile, and with an additional option - for each contact. Per-contact <a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation">transport isolation</a> is still experimental, as it doesn't work if you connect to groups with many members, and it's only available if you enable developer tools.</li> +</ul> +<p>Many SimpleX network design ideas are borrowed from Tor network design:</p> +<ul> +<li>mitigation of <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">MITM attack</a> on client-server connection is done in the same way as Tor relays do it - the fingerprint of offline certificate is included in server address and validated by the client.</li> +<li>the private routing itself uses the approach similar to onion routing, by adding encryption layers on each hop.</li> +<li>we are also considering to implement Tor's <a href="https://blog.torproject.org/introducing-proof-of-work-defense-for-onion-services/">Proof-of-work DoS defence</a> mechanism.</li> +</ul> +<p>So why didn't we just embed Tor into the messaging clients to provide IP address protection?</p> +<p>We believe that Tor may be the wrong solution for some users for one of the reasons:</p> +<ul> +<li>much higher latency, error rate and resource usage.</li> +<li>people who want to use Tor are better served by specialized apps, such as <a href="https://guardianproject.info/apps/org.torproject.android/">Orbot</a>.</li> +<li>Tor usage is restricted in some networks, so it would require complex configuration in the app UI.</li> +<li>some countries have legislative restrictions on Tor usage, so embedding Tor would require supporting multiple app versions, and it would leave the original problem unsolved in these countries.</li> +</ul> +<p>Also, while Tor solves the problem of IP address protection, it doesn't solve the problem of meta-data correlation by user's transport session. When the client connects to the messaging relays via Tor, the relays can still observe which messaging queues a user sends messages to via a single TCP connection. The client can mitigate it with per-contact transport isolation, but it uses too much traffic and battery for most users.</p> +<p>So we believed we would create more value to the users of SimpleX network with private message routing. This new message routing protocol provides IP address and transport session protection out of the box, once released. It can also be extended to support delayed delivery and other functions, improving both usability and transport privacy in the future.</p> +<p>At the same time, we plan to continue supporting Tor and other overlay networks. Any overlay network that supports SOCKS proxy with &quot;isolate-by-auth&quot; feature will work with SimpleX Chat app.</p> +<h3 id="what-is-private-message-routing-and-how-does-it-work" tabindex="-1">What is private message routing and how does it work?</h3> +<p>Private message routing is a major milestone for SimpleX network evolution. It is a new message routing protocol that protects both users' IP addresses and transport sessions from the messaging relays chosen by their contacts. Private message routing is, effectively, a 2-hop onion routing protocol inspired by Tor design, but with one important difference - the first (forwarding) relay is always chosen by message sender and the second (destination) - by the message recipient. In this way, neither side of the conversation can observe IP address or transport session of another.</p> +<p>At the same time, the relays chosen by the sending clients to forward the messages cannot observe to which connections (messaging queues) the messages are sent, because of the additional layer of end-to-end encryption between the sender and the destination relay, similar to how onion routing works in Tor network, and also thanks to the protocol design that avoids any repeated or non-random identifiers associated with the messages, that would otherwise allow correlating the messages sent to different connections as sent by the same user. Each message forwarded to the destination relay is additionally encrypted with one-time ephemeral key, to be independent of messages sent to different connections.</p> +<p>The routing protocol also prevents the possibility of MITM attack by the forwarding relay, which provides the certificate the session keys of the destination server to the sending client that are cryptographically signed by the same certificate that is included in destination server address, so the client can verify that the messages are sent to the intended destination, and not intercepted.</p> +<p>The diagram below shows all the encryption layers used in private message routing:</p> +<pre><code>----------------- ----------------- -- TLS -- ----------------- ----------------- +| | -- TLS -- | | -- f2d -- | | -- TLS -- | | +| | -- s2d -- | | -- s2d -- | | -- d2r -- | | +| Sending | -- e2e -- | sender's | -- e2e -- | recipient's | -- e2e -- | Receiving | +| client | message -&gt; | Forwarding | message -&gt; | Destination | message -&gt; | client | +| | -- e2e -- | relay | -- e2e -- | relay | -- e2e -- | | +| | -- s2d -- | | -- s2d -- | | -- d2r -- | | +| | -- TLS -- | | -- f2d -- | | -- TLS -- | | +----------------- ----------------- -- TLS -- ----------------- ----------------- +</code></pre> +<p><strong>e2e</strong> - two end-to-end encryption layers between <strong>sending</strong> and <strong>receiving</strong> clients, one of which uses double ratchet algorithm. These encryption layers are present in the previous version of message routing protocol too.</p> +<p><strong>s2d</strong> - encryption between the <strong>sending</strong> client and recipient's <strong>destination</strong> relay. This new encryption layer hides the message metadata (destination connection address and message notification flag) from the forwarding relay.</p> +<p><strong>f2d</strong> - additional new encryption layer between <strong>forwarding</strong> and <strong>destination</strong> relays, protecting from traffic correlation in case TLS is compromised - there are no identifiers or cyphertext in common between incoming and outgoing traffic of both relays inside TLS connection.</p> +<p><strong>d2r</strong> - additional encryption layer between destination relay and the recipient, also protecting from traffic correlation in case TLS is compromised.</p> +<p><strong>TLS</strong> - TLS 1.3 transport encryption.</p> +<p>For private routing to work, both the forwardig and the destination relays should support the updated messaging protocol - it is supported from v5.8 of the messaging relays. It is already released to all relays preset in the app, and available as a self-hosted server. We updated <a href="https://simplex.chat/docs/server.html">the guide</a> about how to host your own messaging relays.</p> +<p>Because many self-hosted relays did not upgrade yet, private routing is not enabled by default. To enable it, you can open <em>Network &amp; servers</em> settings in the app and change the settings in <em>Private message routing</em> section. We recommend setting <em>Private routing</em> option to <em>Unprotected</em> (to use it only with unknown relays and when not connecting via Tor) and <em>Allow downgrade</em> to <em>Yes</em> (so messages can still be delivered to the messaging relays that didn't upgrade yet) or to <em>When IP hidden</em> (in which case the messages will fail to deliver to unknown relays that didn't upgrade yet unless you connect to them via Tor).<br /> +See <a href="https://simplex.chat/faq/index.html#does-simplex-protect-my-ip-address">F.A.Q. section</a> for answers about private message routing.</p> +<p>Read more about the technical design of the private message routing in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/rfcs/done/2023-09-12-second-relays.md">this document</a> and in <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/simplex-messaging.md#proxying-sender-commands">the messaging protocol specification</a>.</p> +<h2 id="server-transparency" tabindex="-1">Server transparency</h2> +<img src="https://simplex.chat/blog/images/20240604-server.png" width="40%" class="float-to-right" /> +<p>Even with very limited information available to the messaging relays, there are <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md#simplex-messaging-protocol-server">several things</a> that would reduce users' privacy that a compromised relay can do.</p> +<p>We <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2024-03-20-server-metadata.md">wrote previously</a> that it is important that server operators commit to running unmodified server code or disclose any code modifications, and also disclose server ownership and any other relevant information.</p> +<p>While we cannot require the operators of self-hosted and private servers to disclose any information about them (apart from which server code they use - this is the requirement of the AGPLv3 license to share this information with users connecting to the server), as we add other server operators to the app, it is important for the users to have all important information about these operators and servers location.</p> +<p>This server release adds server information page where all this information can be made available to the users. For example, this is <a href="https://smp8.simplex.im/" target="_blank">the information</a> about one of the servers preset in the app.</p> +<p>The updated server guide also includes <a href="https://simplex.chat/docs/server.html#">the instruction</a> about how to host this page for your server. It is generated as a static page when the server starts. We recommend using Caddy webserver to serve it.</p> +<h2 id="more-new-things-in-v58" tabindex="-1">More new things in v5.8</h2> +<h3 id="protect-ip-address-when-downloading-files-and-media" tabindex="-1">Protect IP address when downloading files &amp; media</h3> +<p>This version added the protection of your IP address when receiving files from unknown file servers without Tor. Images and voice messages won't automatically download from unknown servers too until you tap them, and confirm that you trust the file server where they were uploaded.</p> +<h3 id="chat-themes" tabindex="-1">Chat themes</h3> +<p><img src="https://simplex.chat/blog/images/20240604-theme1.png" width="244" class="float-to-right" /> <img src="https://simplex.chat/blog/images/20240604-theme2.png" width="244" class="float-to-right" /></p> +<p>In Android and desktop app you can now customize how the app looks by choosing wallpapers with one of the preset themes or choose your own image as a wallpaper.</p> +<p>But this feature is not only about customization - it allows to set different colors and wallpaper for different user profiles and even specific conversations. You can also choose different themes for different chat profiles.</p> +<p>In case you use different identities for different conversations, it helps avoiding mistakes.</p> +<h3 id="group-improvements" tabindex="-1">Group improvements</h3> +<p>This version adds additional group configuration options to allow sending images, files and media, and also SimpleX links only to group administrators and owners. So with this release group owners can have more control over content shared in the groups.</p> +<p>We also stopped unnecessary traffic caused by the members who became inactive without leaving the groups - it should substantially reduce traffic and battery consumption to the users who send messages in large groups.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 04 Jun 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html + + + Protecting Children's Safety Requires End-to-End Encryption + https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html + <h1 id="protecting-childrens-safety-requires-end-to-end-encryption" tabindex="-1">Protecting Children's Safety Requires End-to-End Encryption</h1> +<p>As lawmakers grapple with the serious issue of child exploitation online, some proposed solutions would fuel the very problem they aim to solve. Despite expert warnings, the Belgian Presidency persists in pushing for the implementation of client-side scanning on encrypted messaging services, rebranding the effort as &quot;upload moderation&quot;. Their <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=COM%3A2022%3A209%3AFIN&amp;qid=1652451192472">latest proposal</a> mandates that providers of private communication services obtain user consent for AI-based scanning of their private chats. If users do not consent, they will be prohibited from sharing images, videos, and URLs.</p> +<p>Privacy critics have long pushed for measures like centralized scanning of private photos and messaging data, arguing it could detect illicit content. However, invasive monitoring of private communications would create detrimental risks that far outweigh any perceived benefits.</p> +<h2 id="why-were-taking-action" tabindex="-1">Why we’re taking action</h2> +<p>SimpleX Chat signed a <a href="https://www.globalencryption.org/2024/05/joint-statement-on-the-dangers-of-the-may-2024-council-of-the-eu-compromise-proposal-on-eu-csam/">joint statement</a> about the dangers of the EU compromise proposal on EU CSAM because maintaining end-to-end encryption is crucial for protecting privacy and security for everyone, including and especially children.</p> +<p>We urge the Ministers in the Council of the EU to stand firm against any scanning proposals that undermine end-to-end encryption, which would enable mass surveillance and misuse by bad actors, whether framed as client-side scanning, upload moderation, or any other terminology. Compromising this basic principle opens the door to devastating privacy violations. We also urge any organizations or individuals reading this to write to their representatives and voice their concerns. European Digital Rights has <a href="https://edri.org/our-work/be-scanned-or-get-banned/">outlined these issues</a> in greater detail for anyone seeking more information.</p> +<h2 id="why-compromising-privacy-endangers-children" tabindex="-1">Why compromising privacy endangers children</h2> +<p>The core issue is that compromising encryption and privacy makes innocent people vulnerable to malicious hackers and criminals seeking to exploit users data. Centralized scanning systems become a tempting target, potentially exposing millions of private family photos when breached. This would easily open up avenues for blackmail, abuse, and victimization of children. A case in point is the recent <a href="https://techcrunch.com/2024/01/17/unredacted-meta-documents-reveal-historical-reluctance-to-protect-children-new-mexico-lawsuit/">criminal charges</a> against Meta in New Mexico, which highlights how the tech giant's algorithms enabled child exploitation by encouraging connections between minors and sexual predators. Privacy-eroding initiatives like client-side scanning would play into the hands of malicious actors by making more sensitive information accessible and weaponized in the same way that it has been on Meta platforms.</p> +<h2 id="what-should-be-done" tabindex="-1">What should be done</h2> +<p>Rather than undermining privacy, to achieve child safety online users should be empowered with high standards for encryption and data control. For example, adopting a model where children (and users in general) cannot be discovered or approached on networks unless they or their parents permit it, similar to the SimpleX network privacy model. Intelligent multi-device synchronization could enable this oversight without compromising end-to-end encryption overall. It’s always possible to protect children without opening everyone, especially children themselves, to greater vulnerabilities due to such proposals.</p> +<p>However, some recent legislative efforts have bizarrely moved in the opposite direction by seeking to limit parental access. The chilling truth is that the least private platforms have been major enablers of child exploitation. Eroding privacy protections on other services will only aid criminals further, not protect children. Preserving strong encryption and user privacy must be the foundation for any credible effort to combat online child exploitation. Initiatives trading privacy for supposed safety are not just technically flawed, but would achieve the exact opposite of their stated intent. We must avoid being gaslighted by narratives that defy logic, and instead provide users with the highest possible standards for privacy protections as a core principle.</p> +<p>Protecting end-to-end encryption without carving out backdoors or vulnerabilities should be non-negotiable for children's and everyone’s safety. It is critical to redirect the discourse to focus on taking genuine privacy further by protecting against <a href="https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html">metadata hoarding</a> and other means by which people’s data can be abused or subjected to surveillance.</p> + + + Sat, 01 Jun 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240601-protecting-children-safety-requires-e2e-encryption.html + + + SimpleX: Redefining Privacy by Making Hard Choices + https://simplex.chat/blog/20240516-simplex-redefining-privacy-hard-choices.html + <h1 id="simplex-redefining-privacy-by-making-hard-choices" tabindex="-1">SimpleX: Redefining Privacy by Making Hard Choices</h1> +<p><strong>Published:</strong> May 16, 2024</p> +<p>When it comes to open source privacy tools, the status quo often dictates the limitations of existing protocols and structures. However, these norms need to be challenged to radically shift how we approach genuinely private communication. This requires doing some uncomfortable things, like making hard choices as it relates to funding, alternative decentralization models, doubling down on privacy over convenience, and more.</p> +<p>There will always be questions on why the SimpleX Chat and network makes the choices it makes, and that’s good! It’s important to question us and to understand the reasoning behind each decision, whether it’s technical, structural, financial or any other.</p> +<p>In this post we explain a bit more about why SimpleX operates and makes decisions the way it does.</p> +<h2 id="no-user-accounts" tabindex="-1">No user accounts</h2> +<p>Within SimpleX network there are no user accounts, and more importantly, no user profile identifiers whatsoever at the protocol level, not even random numbers or cryptographic keys used to identify the users. This means there is absolutely nothing that uniquely links users to their contacts or to the network relays. While it's accurate to say, &quot;You need an address to send something,&quot; it's crucial to understand that this &quot;address&quot; serves merely as a transient delivery destination, and not as a user profile identifier in any sense.</p> +<p>You can read more about how SimpleX works <a href="https://simplex.chat/#how-simplex-works">here</a>.</p> +<h2 id="privacy-over-convenience" tabindex="-1">Privacy over convenience</h2> +<p>One of the main considerations often ignored in security and privacy comparisons between messaging applications is multi-device access. For example, in Signal’s case, the Sesame protocol used to support multi-device access has the vulnerability that is <a href="https://eprint.iacr.org/2021/626.pdf">explained in detail here</a>:</p> +<p><em>&quot;We present an attack on the post-compromise security of the Signal messenger that allows to stealthily register a new device via the Sesame protocol. [...] This new device can send and receive messages without raising any ‘Bad encrypted message’ errors. Our attack thus shows that the Signal messenger does not guarantee post-compromise security at all in the multi-device setting&quot;</em>.</p> +<img src="https://simplex.chat/blog/images/20231125-mobile2.png" width="170" class="float-right" /> +<p>Solutions are possible, and even the quoted paper proposes improvements, but they are not implemented in any existing communication solutions. Unfortunately this results in most communication systems, even those in the privacy space, having compromised security in multi-device settings due to these limitations. That's the reason we are not rushing a full multi-device support, and currently only provide <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol">the ability to use mobile app profiles via the desktop app</a>, while they are on the same network.</p> +<p>Another choice that compromises privacy for convenience and usability is 3rd party push notifications. At SimpleX, we take a slow path of optimizing the network and battery consumption in the app, rather than simply hiding inefficiencies behind the quick fix solution of 3rd party push notifications that <a href="https://www.wired.com/story/apple-google-push-notification-surveillance/">increases vulnerability</a>, a path Signal and others chose. Like other choices, it has usability and optimization trade offs, but ultimately it’s the right thing to continue progressing towards a better solution as we explain <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html">here</a>.</p> +<p>Whenever possible, we strive to achieve significantly higher levels of privacy and security. For example, unlike most, if not all, applications (including Signal), <a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#encrypted-local-files-and-media-with-forward-secrecy">we encrypt application files with per-file unique key</a>. Consequently, once a message is deleted, there's no means to open a file that someone may have stolen in hopes of acquiring the key later. Similarly, apps like Session have done away with forward secrecy, a decision which caused them <a href="https://www.privacyguides.org/en/real-time-communication/#additional-options">not to be recommended</a> for &quot;long-term or sensitive communications&quot;. And <a href="https://simplifiedprivacy.com/spain-has-banned-telegram-defending-session/">misinformation</a> around this makes it dangerous and irresponsible to recommend without such necessary disclosures for people’s awareness.</p> +<p>Session’s decision was based on <a href="https://getsession.org/blog/session-protocol-explained">the incorrect statements</a> about double ratchet being impossible in decentralized networks, and underplayed importance of forward secrecy, break-in recovery and deniability - the absence of these crucial qualities makes Session a much weaker choice for private messaging. For transparency, this was something that was debated with their team <a href="https://twitter.com/SimpleXChat/status/1755216356159414602">here</a>. We also made <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#end-to-end-encryption-security-attacks-and-defense">a separate post</a> about these qualities of end-to-end encryption and their presence in different messengers, to show that not all end-to-end encrypted apps offer the same level of protections.</p> +<h2 id="network-decentralization" tabindex="-1">Network decentralization</h2> +<img src="https://simplex.chat/blog/images/simplex-explained.svg" width="40%" class="float-right" /> +<p>It's important to recognize that a model of decentralization where all servers are openly known and accessible to all clients, that some users ask for, actually results in a less decentralized network, and as the network grows it often requires an introduction of a central authority to protect from bad actors with malicious intent. Therefore, we've deliberately opted for a slower path towards achieving a higher degree of decentralization where there is no central server registry or network authority. For example, p2p designs may offer higher initial decentralization but often compromise on privacy and eventual decentralization. In essence, our approach prioritizes a balance between initial decentralization, privacy, and higher degree of decentralization down the line.</p> +<p>Additionally, while it's true that we haven't yet established a model to incentivize other network operators, it's certainly on the roadmap. We see the decentralization of network operators offered within the app as a top priority.</p> +<p>Where it stands today, users have the freedom to select their preferred servers within the SimpleX network by configuring the app, with thousands of self-hosted servers in operation. Moreover, numerous third-party applications rely on our code for their in-app communications, operating independently of our servers, many of which we may not even be aware of.</p> +<p>Decentralization is an ongoing journey, and we strive to proceed at a measured pace to ensure its proper implementation. While the immediate results may not always appear ideal, prioritizing a careful approach ensures that in the long run, the decisions made in this area align with our ultimate objectives of a private, efficient, reliable and fully decentralized network.</p> +<h2 id="funding-and-profitability" tabindex="-1">Funding and profitability</h2> +<p>We explain our rationale for funding <a href="https://simplex.chat/faq/index.html#funding-and-business-model">here</a>. Funding sources is always one of the most difficult choices to make, and it’s important to underline that VC models don’t necessarily translate to a quest for control, interference of any kind, or overall influence on product roadmap and strategy. The vast majority of investors seek profitability. Irrespective of the organization type profitability is essential for a sustainable operation, and it can and should be done while adhering to the highest possible standards for privacy. For-profit vs. nonprofit is also not an accurate metric to measure a commitment towards privacy and open standards, which is further explained <a href="https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html">here</a>.</p> +<p>To make a profit, satisfying customers is the key. Unlike the many companies that profit from selling customer data, we put user privacy first. Doing this at scale requires investments. If the investors don’t own or control a company, their participation becomes merely about profit for them, and not about how this profit is obtained. With the investors we have, we are completely aligned on this - they are betting on the future where privacy is the norm. They do not dictate on anything related to our model. We build SimpleX chat, protocols and network the way Internet should have been built if we as developers always put the privacy and empowerment of users first.</p> +<h2 id="company-jurisdiction" tabindex="-1">Company jurisdiction</h2> +<img src="https://simplex.chat/blog/images/20240516-parliament.jpg" width="40%" class="float-right" /> +<p>With regards to jurisdictions, nowhere is perfect. For that reason we plan to establish the foundations for protocol governance in <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#the-journey-to-the-decentralized-non-profit-protocol-governance">various jurisdictions</a>.</p> +<p>But we’d like to clarify some misconceptions about the UK, where SimpleX Chat Ltd. is registered, and the UK legislation.</p> +<p>For example, the Online Safety Act (OSA). Some people believe that it applies only to UK companies. But the OSA applicability isn’t determined by the company’s jurisdiction - it applies based on the nature and characteristics of the business and its services, as well as the number of its users in the UK. In case of SimpleX network, the OSA doesn’t apply for both of these reasons.</p> +<p>The UK’s position on communication encryption, and more specifically, on end-to-end encrypted messaging, remains the subject of political debates. But with the OSA, the legislative intent was to propose technical measures to block CSAM, and it was trying to explore ways to do this via client-side scanning, which of course would undermine the encryption. However, and thanks to the hard work of privacy experts, researchers, academics and rights organizations throughout the UK and the rest of the world, the Online Safety Bill did not prohibit end-to-end encrypted apps without such scanners. It is an open question whether such technology will ever be possible, and the UK government made a public commitment that client-side scanning won't be required until it is.</p> +<p>For now, strong end-to-end encryption remains permissible and protected, and we hope to also add to the privacy advocacy and debates as a UK-based company to keep it legally protected.</p> +<p>Overall, we view the UK as being better jurisdiction for privacy than many alternatives - there are some trade-offs everywhere.</p> +<h2 id="looking-ahead" tabindex="-1">Looking ahead</h2> +<p>The future of the Internet should be based on decentralized infrastructure operated by commercially viable organizations. These operators need to possess minimal user data, so that users have genuine control over their identities, and free from lock-in by the operators, to support fair competition. This requires a drastic re-imagining of the current norms and newer, more privacy-minded protocols. All in all, private messaging is surrounded by very difficult challenges but it’s worth it to keep pushing the industry forward and not settle for the status quo and current trade offs, protocol limitations and vulnerabilities. The Internet deserves better standards, and so do users.</p> + + + Thu, 16 May 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240516-simplex-redefining-privacy-hard-choices.html + + + SimpleX network: legally binding transparency, v5.7 released with better calls and messages + https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html + <h1 id="simplex-network-legally-binding-transparency-v57-released-with-better-calls-and-messages" tabindex="-1">SimpleX network: legally binding transparency, v5.7 released with better calls and messages</h1> +<p><strong>Published:</strong> Apr 26, 2024</p> +<p>What's new in v5.7:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#quantum-resistant-end-to-end-encryption">quantum resistant end-to-end encryption</a> with all contacts.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#forward-and-save-messages">forward and save messages</a> without revealing the source.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#in-call-sounds-and-switching-sound-sources">in-call sounds and switching sound sources</a>.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#network-management">better network connection management</a>.</li> +<li><a href="https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html#customizable-shape-of-profile-images">customizable profile images</a></li> +</ul> +<p>Also, we added Lithuanian interface language to the Android and desktop apps, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<h2 id="legally-binding-transparency" tabindex="-1">Legally binding transparency</h2> +<p>We are committed to open-source, privacy and security. Here are the recent changes we made:</p> +<ul> +<li>We now have a <a href="https://simplex.chat/transparency/index.html">Transparency Reports</a> page.</li> +<li>We updated our <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/PRIVACY.md">Privacy Policy</a> to remove undefined terms &quot;impermissible&quot; and &quot;acceptable&quot;, which would allow us to remove anything we don't like, without any clarity on what that is. You can see the edits <a href="https://github.com/simplex-chat/simplex-chat/pull/4076/files">here</a>.</li> +<li>We published a new page with <a href="https://simplex.chat/faq/index.html">Frequently Asked Questions</a>, thanks to the guidance from users.</li> +<li>We also have a new <a href="https://simplex.chat/security/index.html">Security Policy</a> – we welcome your feedback on it.</li> +</ul> +<p>What do we mean by “legally binding transparency?”. It includes these principles:</p> +<ul> +<li>Accountability: an empty promise or commitment to transparency that is not legally binding is just marketing, and can provide opportunities for the organizations to be misleading or not disclose important information that can affect their users privacy and security.</li> +<li>Consistency: often, there's a disconnect between marketing claims and legally binding policies. Our approach is to ensure that promises made in marketing materials or any external communications align with our legally binding documents, so that users can rely on our promises, and know exactly what to expect from us.</li> +</ul> +<p>For example:</p> +<ul> +<li>we use open-source code, and we made a legally binding commitment to use the published code in all released apps and deployed preset servers.</li> +<li>we use precise and technical language in the Privacy Policy defining what data and metadata can be accessed via the preset relays.</li> +</ul> +<p>If you see any inconsistency between technical parameters of SimpleX Network and what is promised in our Privacy Policy please raise it with us.</p> +<h2 id="whats-new-in-v57" tabindex="-1">What's new in v5.7</h2> +<p>This release focus is improving the app usability, and preparing the foundation for v5.8 that will provide an in-built protection of user IP addresses when connecting to unknown file and messaging servers, reducing the need to use Tor (which would still remain supported via SOCKS proxy, for additional privacy).</p> +<h3 id="quantum-resistant-end-to-end-encryption" tabindex="-1">Quantum resistant end-to-end encryption</h3> +<img src="https://simplex.chat/blog/images/20240426-pq.png" width="288" class="float-right" /> +<p>We <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html">wrote before</a> about how quantum resistant encryption was added to SimpleX Chat and also about other properties of end-to-end encryption, possible attacks on its security and known mitigations.</p> +<p>Quantum resistant encryption will now be enabled by default in all direct chats. For the new conversations it will be enabled from the beginning, and for the existing conversations it will be agreed after you exchange several messages with your contacts - you will see a notice in the conversation when it happens.</p> +<p>You can still safely downgrade the app to an earlier version if needed, as v5.6 already supports quantum resistant encryption.</p> +<p>With the users who have an earlier version, the app will work using the conventional encryption, which is still very secure. It's important that we augmented the conventional encryption with post-quantum cryptographic algorithm rather than replaced it, using a hybrid construction as recommended by the cryptography experts.</p> +<p>The groups currently do not support quantum resistant encryption yet - we plan to add it in the future to small groups.</p> +<h3 id="forward-and-save-messages" tabindex="-1">Forward and save messages</h3> +<p>You can now save received messages to private notes and forward them to your contacts and groups. This is both more convenient than copy-pasting the messages, and also more private - you can forward files and preserve a disappearing file in your private notes without saving them outside of the app.</p> +<p>You can see and navigate to the original source of the message via the message information, but the recipient of the message can only see that it was forwarded, but not from which conversation - in this way you can show that the message was quoted from another source without revealing the source (<a href="https://en.wikipedia.org/wiki/Chatham_House_rule">Chatham House Rule</a>).</p> +<p><img src="https://simplex.chat/blog/images/20240426-forward1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-forward2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-forward3.png" width="288" /></p> +<h3 id="in-call-sounds-and-switching-sound-sources" tabindex="-1">In-call sounds and switching sound sources</h3> +<p>This was the most frequent request of the users who use SimpleX Chat for audio and video calls - to add sound indication to the connection progress, as happens in all other apps. This release added these sounds and also vibration when call connects and disconnects.</p> +<p>You can also switch between bluetooth headphones, speakerphone and earpiece via the new button in the call.</p> +<h3 id="network-management" tabindex="-1">Network management</h3> +<p>To reduce traffic and battery usage, this release made connection timeouts dependent on which network your device uses - timeouts will be larger when you are on mobile connection and smaller when on WiFi. It also makes connection attempts very infrequent when the device is not connected to network.</p> +<h3 id="customizable-shape-of-profile-images" tabindex="-1">Customizable shape of profile images</h3> +<p>To customizable the interface, you can now change the shapes of profile images to anything from squares with sharp corners to circles, as before, via the Appearance menu in the app Settings. The default shape of profile images is changed to squares with rounded corners.</p> +<p><img src="https://simplex.chat/blog/images/20240426-profile1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-profile2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240426-profile3.png" width="288" /></p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://simplex.chat/faq/index.html">Frequently asked questions</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>We are planning a 3rd party security audit for the protocols and cryptography design in July 2024, and also the security audit for an implementation in December 2024/January 2025, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Fri, 26 Apr 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html + + + The dangers of metadata in messengers + https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html + <h1 id="the-dangers-of-metadata-in-messengers" tabindex="-1">The dangers of metadata in messengers</h1> +<p><strong>Published:</strong> Apr 16, 2024</p> +<p><em>By <a href="https://mastodon.social/@alshafei">Esra'a al Shafei</a></em></p> +<p>In many countries around the world, phone numbers are attached to biometrics data and personal IDs. Telecommunications companies are either government owned or are heavily regulated, privately owned monopolies who comply with most government requests for backdoors or user data. The idea that today, we still need to give out our phone numbers as primary identifiers to be able to use the leading messaging apps should be frowned upon and actively challenged. It’s necessary to advocate for private alternatives in messaging that do not rely on user IDs of any kind - and yes, it’s possible.</p> +<p>Messaging is still not where it needs to be. Privacy is confused with security, when both are not synonymous, and there are major gaps in helping users understand the fundamental differences.</p> +<img src="https://simplex.chat/blog/images/20240416-whatsapp.jpg" class="float-to-right" width="38%" /> +<p>For example, while WhatsApp messages are <a href="https://faq.whatsapp.com/820124435853543">end-to-end encrypted</a>, let’s consider what you give up when you use it, per its own listings in app stores:</p> +<ul> +<li>App activity (app interactions, in-app search history, and other user-generated content)</li> +<li>Location</li> +<li>Financial information (user payment info and payment history)</li> +<li>Contacts and their phone numbers</li> +<li>Groups you’re a member of</li> +<li>When you use the app and how often you use it</li> +<li>Device and other IDs</li> +<li>Personal info (email address, user IDs, phone number)</li> +</ul> +<p>This is called <a href="https://en.wikipedia.org/wiki/Metadata">metadata</a>. It reveals a wealth of information about you and your connections, and in the hands of a centralized monopoly, this can and does get misused in incredibly dangerous ways. Once such metadata is logged, it can create very detailed profiles about who you are, everywhere you’ve been, and everyone you’ve ever spoken to. In settling for apps that normalize this while giving you the illusion of privacy in their marketing, we are doing ourselves a disservice by accepting this as the default. Collectively, we aren’t doing enough to protect ourselves and our social graph from this invasive overreach.</p> +<p>When stored, aggregated and analyzed, this metadata provides ample information that could potentially incriminate someone or be submitted to authorities. When WhatsApp and Facebook Messenger enabled end-to-end encryption for messages, of course it was a welcome and widely celebrated change. But it’s important to remember that not all end-to-end encryption utilizes the same standards, <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">some implementations are more secure</a> than others, so it’s something that shouldn’t necessarily be accepted at face value. More importantly: collecting and storing an obscene amount of metadata should invite global scrutiny, considering this data is often combined with whatever other information companies like Meta harvest about your identity (which is <a href="https://www.vox.com/recode/23172691/meta-tracking-privacy-hospitals">a lot</a>.)</p> +<img src="https://simplex.chat/blog/images/20240416-metadata.png" class="float-to-right" width="38%" /> +<p>This is one of the many reasons why we need to resist giving out our phone numbers just to access an app, especially to do something as personal and intimate as private messaging. Even though users can sometimes mask their numbers with a username, their identity on the app is still fundamentally tied to their phone number. App operators have access to this, as well as user contacts. Additionally, with a simple modification to the app's source code, the contacts may also gain access in some cases. This should raise more concerns about privacy, and it makes the need for anonymity difficult to achieve.</p> +<p>Everyone has a different threat model (and if you don’t yet, now is a good time to <a href="https://www.privacyguides.org/en/basics/threat-modeling/#creating-your-threat-model">create one</a>). For many users today, WhatsApp and other apps may be sufficient for their specific needs, especially in connecting with families and friends who are already on the app and unlikely to migrate elsewhere. If that suits your life and needs, and if you’re aware and consciously accept the risks, great.</p> +<p>But we also need to acknowledge that the world is becoming increasingly dangerous in the way AI is being used to <a href="https://www.forbes.com/sites/forbestechcouncil/2024/02/02/artificial-intelligence-the-new-eyes-of-surveillance/?sh=cd57bc214f27">supercharge surveillance</a>, and we need to be educated and aware of the risks this is already having on our lives and what it subjects others in your network to when you choose metadata-heavy apps as your primary form of communication. Having alternatives will always be important, even if it’s not what you default to for everyday messaging. Recognize who in your social circles might require the extra privacy, anonymity and security, so that you can play a role in protecting vulnerable individuals who need it most. The messaging app you choose implicates others as well, not just yourself, and while you personally may not require complete privacy, others might have their lives depend on it.</p> +<p>End-to-end encryption is a solid start, but it's just the beginning of our pursuit for true privacy and security. True privacy means that even when legal demands come knocking, there's no useful metadata to hand over. It's not enough to just protect the content of messages; we need consistent innovation in protecting metadata too.</p> +<p>Changing ingrained habits is tough, but your privacy is always worth the fight. Although giants like WhatsApp and Telegram may dominate global messaging for now, increasing concerns about data harvesting and AI-driven surveillance are fueling demand for alternatives. SimpleX Chat aims to be one of those strong alternatives, hence its radical focus on a decentralized framework with no user identifiers (in other words, nothing that uniquely identifies users on the protocol level to their contacts or to the relays) and extra optionality (self-hosting an <a href="https://simplex.chat/docs/server.html">SMP server</a> or <a href="https://simplex.chat/docs/xftp-server.html">XFTP server</a>, access via Tor, <a href="https://simplex.chat/docs/guide/chat-profiles.html">chat profiles</a> with incognito mode, etc.)</p> +<p>As of today, most messaging alternatives, including SimpleX, will have some limitations. But with the limited resources we have, we are committed to daily progress towards creating a truly private messenger that anyone can use while maintaining the features that users have come to know and love in messaging interfaces. We want to be the prime example of a messenger that achieves genuine privacy without compromising it for convenience. We need to be able to reliably move away from small and niche use cases to endorsing and enforcing global standards for privacy and making it accessible for all users regardless of their technical expertise.</p> +<p>We’re grateful for the users and <a href="https://github.com/simplex-chat/simplex-chat#help-us-with-donations">donors</a> who have been following along on this journey thus far and helping with feedback, anything from bug reports to identifying potential risks. Building in the open has always been a necessity for transparency and ongoing <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">auditability</a>, because we don’t want anyone to just take our word for it. <a href="https://github.com/simplex-chat">See for yourself</a> and engage in the discussions. We fully expect you to hold us accountable to our word.</p> + + + Tue, 16 Apr 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240416-dangers-of-metadata-in-messengers.html + + + Why I joined SimpleX Chat - by Esra'a al Shafei + https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html + <h1 id="why-i-joined-simplex-chat" tabindex="-1">Why I joined SimpleX Chat</h1> +<p><strong>Published:</strong> Apr 4, 2024</p> +<p><em>By <a href="https://mastodon.social/@alshafei">Esra'a al Shafei</a></em></p> +<p>Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, my decision to join SimpleX Chat may come as a surprise to some. But, as I step into this new chapter, I want to share the insights and convictions that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.</p> +<p>The nonprofit world has been my primary focus for decades. My team and I ran the platforms at <a href="http://majal.org/">Majal.org</a> with an extremely limited budget. We had to navigate many complexities and challenges that shadow the nonprofit model. And because we worked primarily in creating applications and tools, a recurring theme has been financial sustainability. Being a Bahrain-based entity for most of these years meant that the many communities we served were not in a position to provide contributions and we were not eligible for most foundation grants. This drastically limited our growth and the reliability of our apps. When we failed to raise sufficient funds or meet our target budgets, we often had to shutter certain applications, sometimes after spending more than 10 years building them.</p> +<p>With secure and private messaging, the stakes are even graver. Any failure to commit and resource/fund ongoing development, security patches, etc means lives can be at risk. I still believe in nonprofit models, and it’s why I continue to serve them through various volunteer roles. I do also believe that there is room for a mixture of models that, in the case of something as unique as SimpleX Chat, can serve as a fully open and transparent public interest technology while also having a profitable values-aligned company that can keep the lights on to continue developing, expanding, and improving the protocol, network and their reach.</p> +<p>I’m no stranger to writing about some VC models being <a href="https://mastodon.social/@alshafei/112125959080515656">corrupt</a>. Frankly, I also hold the view that some tech VCs are amongst the <a href="https://responsiblestatecraft.org/defense-tech/">most complicit</a> in egregious war crimes worldwide, or enabling the <a href="https://mastodon.social/@alshafei/112140566088322925">intrusive surveillance</a> we’re fighting against. So being part of a VC-funded venture is not a decision I take lightly. However, I have been following SimpleX Chat’s growth since early 2022 when I first met Evgeny at the Mozilla Festival. I appreciated the drive and Evgeny’s firm refusal to settle for the current models of private messaging. We share the belief that messaging is something we need to keep improving and that we must continue pushing its boundaries to make it even more private, secure, usable for groups, and, most importantly - fully decentralized. This is a major undertaking, and it requires funding to achieve. Candidly, I did worry about funding and sustainability because, at the time, SimpleX was still primarily funded by user contributions.</p> +<p>But even knowing this, I scrutinized SimpleX Chat for taking VC funding ($350K) from Village Global and questioned the individuals featured on its frontpage. I had to speak with Evgeny directly to learn who exactly from this fund was involved, how much power they wielded, if any, and if this changes the ethos of the company - all of which he is already making public. It was only after these discussions that I was comfortable to take a leap of faith and continue to use the app and vouch for its current and future offerings. It required me to question my own views on whether a VC-funded company can actually have major positive contributions to privacy as well as the open ecosystem.</p> +<img src="https://simplex.chat/blog/images/20240404-messsaging-apps.png" class="float-to-right" width="50%" /> +<p>The web has a long history of <a href="https://www.engadget.com/from-its-start-gmail-conditioned-us-to-trade-privacy-for-free-services-120009741.html">trading privacy</a> for “free” services. Traditionally, these services have also been centralized, closed-source, non-transparent, and profit-oriented. The companies behind these apps and services became prolific because of their disregard of privacy rights, which normalized lucrative surveillance capitalism. There is such an extensive global monopoly that in Africa, only 1 of the 5 biggest messaging apps in Africa isn't owned by Meta, notoriously known for spying not just through its own apps but even through <a href="https://qz.com/project-ghostbusters-facebook-meta-wiretap-snapchat-1851366814">its competitors</a>, – relentless, massive data harvesting that stretches far beyond its own walled gardens:</p> +<p>Some of the world’s top engineers often go to these companies because of the benefits and financial opportunities. We can question their ethics all day long, but we also need to question if the web would look significantly different if there were as many opportunities at privacy-first companies with purpose and strong, proven moral boundaries, set up in a way that can guarantee operational independence from any shareholders and VCs.</p> +<p>SimpleX could have taken the route of other companies in the privacy space, whether it’s Skiff which rushed to take a large amount of <a href="https://techcrunch.com/2022/03/30/skiff-series-a-encrypted-workspaces/">VC money</a> only to <a href="https://www.techradar.com/computing/cyber-security/skiff-gets-bought-by-notion-raising-privacy-concerns">shutter its doors</a> after an acquisition, leaving its users hanging with many unanswered questions, or giving up control of the company, which would puts its future solely in the hands of VCs with majority ownership. SimpleX aims to prevent this, and in fact has left money on the table to ensure that it does not occur. Had it not been for this information, I would not have joined, and I would have remained a user of the product, albeit a very cautious one, constantly wondering whether it will be sold or corrupted.</p> +<p>It’s worth noting that some private foundations operate on the VC model in supporting nonprofits, either by requiring Board seats or requesting that their funding be used towards very specific objectives not always in alignment with the organization’s values and mission. It’s also worth noting that <a href="https://www.engadget.com/2019-05-31-sex-lies-and-surveillance-fosta-privacy.html">some nonprofits</a> actually operate on the models of surveillance and censorship. Therefore, whether an organization or company is VC-backed or a nonprofit should not be the sole factor in deciding whether or not it is trustworthy. Actions are important, with full transparency being one of the most critical factors, and being fully open source being another to attract valid criticisms and audits to ensure any product or protocol lives up to its privacy and security promise. SimpleX Chat prides itself on being both transparent and open, on top of also being fully decentralized. If you’re new to it and eager to know more, you can start with <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md">this overview</a>.</p> +<p>Another important consideration is that the SimpleX network does have a plan that would rely on users' payments for specific or tailored services, and not on some other sources of revenue or funds (ads, etc.). Building anything that users would be willing to pay for requires substantially more time and resources, hence the VC route to establish a business model that doesn’t translate to the user being the product. But any business services need to be separate from SimpleX as a public interest technology. As outlined in this <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html">recent post</a>, I’ll be using my background in nonprofit governance structures to ensure that the SimpleX network protocols evolve under the stewardship of nonprofit entities in various jurisdictions, so that its continued evolution aligns more closely with the vision of community-driven, independent and decentralized governance. This would help create a necessary balance between different structures, in the same way many tech nonprofits also have for-profit subsidiaries to attract fee-for-service agreements to sustain their operations.</p> +<p>In summary: My decision to join Simplex Chat, despite my deep-rooted beliefs and skepticism towards VC funding, reflects a broader realization: that the fight for privacy, security, and decentralization in today’s web is multifaceted and sometimes requires us to depart from our comfort zones to explore sustainable paths for continuous growth and impact so that open source privacy tools and protocols are no longer “niche”, but universally accessible standards. As long as nothing in this journey compromises our moral principles and integrity, this will remain a very worthwhile goal to pursue.</p> + + + Thu, 04 Apr 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html + + + SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration + https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html + <h1 id="simplex-network-real-privacy-and-stable-profits-non-profits-for-protocols-v56-released-with-quantum-resistant-e2e-encryption-and-simple-profile-migration" tabindex="-1">SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration</h1> +<p><strong>Published:</strong> Mar 23, 2024</p> +<p>SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#community-and-business-interests-are-aligned">community and business interests are aligned</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#the-journey-to-the-decentralized-non-profit-protocol-governance">the journey to the decentralized non-profit protocol governance</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#welcome-esraa">welcome, Esra’a</a>!</li> +</ul> +<p>What's new in v5.6:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#quantum-resistant-end-to-end-encryption-beta">quantum resistant end-to-end encryption</a> (BETA) – enable it for the new contacts.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#use-the-app-during-the-audio-and-video-calls">use the app during the audio and video calls</a>.</li> +<li><a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html#migrate-all-app-data-to-another-device-via-qr-code">migrate all app data to another device via QR code</a>.</li> +</ul> +<p>There are many other improvements and fixes in this release:</p> +<ul> +<li>group admins can block a member for all other members.</li> +<li>filtering chats no longer includes muted chats with unread messages.</li> +<li>and more - see the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.6.0">release notes</a>.</li> +</ul> +<h2 id="simplex-network-deliver-real-privacy-via-a-profitable-business-and-non-profit-protocol-governance" tabindex="-1">SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance</h2> +<h3 id="community-and-business-interests-are-aligned" tabindex="-1">Community and business interests are aligned</h3> +<p>Some people in our users' community believe that there is a conflict between the business and the community interests. This view fails to see a bigger picture of how these interests are aligned. I wrote a blog post about it <a href="https://www.poberezkin.com/posts/2023-10-31-why-privacy-impossible-without-venture-funding.html">here</a>. Our goal is to grow the network and the ecosystem while enriching all stakeholders involved, both the community and the business shareholders. This strategy relies on the strengths and opportunities of both the business and the decentralized network we build, with its vibrant community of individuals and organizations. It positions the business not as a controller but as a supporter of the community growth, resilience and sustainability.</p> +<p>By leveraging access to investment resources, its ability to provide stock-based incentives beyond salaries, operating as a business will satisfy users' and community needs more effectively, ensuring the long-term viability and growth of the network, while remaining true to the mission. A purely nonprofit model with no avenue to sustain this growth is simply not possible. Sustainability requires profits, that is simply spending less than earning, as every responsible individual and organization should aim for, and these profits must be based on users' payments, and not on some other sources of revenue or funds. And building the software product that customers are willing to pay for requires substantial business investments. We will accomplish it while maintaining transparency and the commitment to keep SimpleX network and its protocols open and free to use.</p> +<h3 id="the-journey-to-the-decentralized-non-profit-protocol-governance" tabindex="-1">The journey to the decentralized non-profit protocol governance</h3> +<p>At the current early stage of network growth the protocols will benefit most from the rapid evolution and centralized design. Many protocols that decentralized their evolution too early failed to evolve and to adapt to the product requirements of the majority of users, causing them to stall in growth. Even the open web became possible only thanks to Netscape, a venture funded company, that developed browsers and web server software taking it upon themselves to rapidly evolve web specification to make it into a robust application platform as we now know it. It is very unlikely that it would have happened if it was managed by a nonprofit or community, in a decentralized way.</p> +<p>Once SimpleX network protocols stabilize and reach the required maturity, we plan to transition its governance to several new nonprofit entities, ensuring its continued evolution aligns more closely with our vision of community-driven, independent and transparent governance. We and our investors believe that this is a win-win strategy. It both maximizes the business value, by creating a product built on protecting privacy and users' trust - a model that we see as the only viable path forward. It also maximizes the value created for the user community.</p> +<h3 id="welcome-esraa" tabindex="-1">Welcome, Esra’a!</h3> +<p>To help us deliver these goals, Esra’a Al Shafei joined SimpleX Chat team - we are excited to welcome her!</p> +<p>Esra'a is a longtime privacy and human rights advocate from Bahrain. She is the founder of <a href="http://majal.org/">Majal.org</a>, a network of platforms that amplify under-reported and marginalized voices in the Middle East and North Africa. She is also the co-founder of the <a href="https://numun.fund/">Numun Fund</a>, the first dedicated fund for women-led tech in the Global South. Esra’a is currently the Vice Chair of the Board at the <a href="https://wikimediafoundation.org/">Wikimedia Foundation</a>, the nonprofit which hosts Wikipedia. She is also on the Board of the <a href="https://www.torproject.org/">Tor Project</a>, developers of one of the world’s strongest tools for privacy and freedom online. Previously, she served on the Board of <a href="https://www.accessnow.org/">Access Now</a>, an international nonprofit dedicated to an open and free Internet.</p> +<p>In her own words: <em>&quot;Privacy and security have been the center of my work as a human rights advocate for the last 20 years in one of the most surveilled countries in the world where staying safe remains a burden. Our privacy is our dignity. It is something that belongs to us and something we should treasure - as people, as companies, as governments. Despite messaging being the most intimate aspect of our digital lives, the leading protocols in this space are centralized and we deserve a web that operates on the core principles of genuine privacy and security in a fully decentralized framework. SimpleX network will play a critical role towards that vision.&quot;</em></p> +<p>Executing the plan towards decentralized nonprofit protocol governance will be Esra’a’s primary responsibility. Our primary objective with this plan is to ensure that no single entity can control or have unrestricted ownership of the protocols, so it can maintain its integrity.</p> +<h2 id="whats-new-in-v56" tabindex="-1">What's new in v5.6</h2> +<h3 id="quantum-resistant-end-to-end-encryption-beta" tabindex="-1">Quantum resistant end-to-end encryption (BETA)</h3> +<p>Adding post-quantum resistance to the double ratchet end-to-end encryption algorithm in SimpleX Chat is a major upgrade to messaging protocols, and it creates the security against the future quantum computers.</p> +<p>I wrote in detail in the previous post about various properties of end-to-end encryption and how exactly quantum resistance is implemented in SimpleX Chat - currently SimpleX Chat has <a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">the most secure end-to-end encryption design</a> against the present and future attacks.</p> +<p>We plan to perform a security audit of this design and implementation later this year.</p> +<p>Post-quantum encryption is currently added as opt-in and has to be separately enabled to be active for the new contacts, and, additionally, can be enabled for the existing contacts.</p> +<p><img src="https://simplex.chat/blog/images/20240314-pq1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq3.png" width="288" /></p> +<p><strong>To enable quantum resistance for the new conversations</strong>:</p> +<ul> +<li>open the app settings (tap user avatar in the top left corner).</li> +<li>scroll down to <em>Developer tools</em> and open them.</li> +<li>enable <em>Show developer options</em> toggle.</li> +<li>now you will see <em>Post-quantum E2EE</em> toggle - enable it as well.</li> +</ul> +<p>Now all new contacts you add to the app will use quantum resistant Signal double ratchet algorithm.</p> +<p>Once you have enabled it for the new contacts, you can also <strong>enable it for some of the existing contacts</strong>:</p> +<ul> +<li>open the chat with the contact you want to upgrade to be quantum resistant.</li> +<li>tap contact name above the chat.</li> +<li>tap Allow PQ encryption.</li> +<li>exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.</li> +</ul> +<p>We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.</p> +<h3 id="use-the-app-during-the-audio-and-video-calls" tabindex="-1">Use the app during the audio and video calls</h3> +<p><img src="https://simplex.chat/blog/images/20240323-call1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240323-call2.png" width="220" class="float-to-left" /></p> +<p>Since we added the audio and video calls in 2022 a lot of work was done to improve the stability of calls. One of the usability downsides until this release was that it was impossible to use the app during the call.</p> +<p>This version solved this problem - now you can return back to the app without interrupting the call and use any of the app functions - for example, you can send the messages or files to the person you are in the call with. If this is a video call, you will continue seeing your contact in a small picture-in-picture view.</p> +<h3 id="migrate-all-app-data-to-another-device-via-qr-code" tabindex="-1">Migrate all app data to another device via QR code</h3> +<p>We always believed that cross-platform data portability is very important for any software. Users own their data, and they should have a way to export it from any software they use. So from the version of SimpleX Chat <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#database-export-and-import">released in July 2022</a> it was possible to export the database as a self-contained file, including all contacts, messages and files, and import it on a new device.</p> +<p><em>&quot;How can I migrate my data to another device?&quot;</em> was one of the most frequent user questions, but until this release this process was <a href="https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html">quite complex</a>, requiring too many steps, and most non-technical users were not willing to try it, as even though it was reliable, it appeared risky.</p> +<p>This release made the app data migration very simple, see the steps below.</p> +<p><strong>Start the migration on the source device</strong></p> +<p><img src="https://simplex.chat/blog/images/20240323-migrate-from1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from4.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-from5.png" width="170" /></p> +<p>On the device you migrate your app data from, follow these steps:</p> +<ul> +<li>choose <em>Migrate to another device</em>,</li> +<li>if necessary, set the database passphrase (initially, the database is encrypted with a random passphrase), or, if it's already set, verify it - for security and to ensure that the archive will be usable on the new device,</li> +<li>tap <em>Archive and upload</em> to and upload the app data in chunks to the XFTP servers configured in the app,</li> +<li>the app will show the QR code that should be scanned from the new device.</li> +</ul> +<p><strong>Migrate data to the target device</strong></p> +<p><img src="https://simplex.chat/blog/images/20240323-migrate-to1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to4.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20240323-migrate-to5.png" width="170" /></p> +<p>On the device you migrate your data to, follow these steps:</p> +<ul> +<li>on the first app page choose <em>Migrate from another device</em>,</li> +<li>scan the QR code shown on the source device,</li> +<li>once the archive downloads, enter the database passphrase and tap <em>Open chat</em>,</li> +</ul> +<p><strong>Finalize migration on the source device</strong></p> +<img src="https://simplex.chat/blog/images/20240323-migrate-from6.png" width="170" class="float-to-left" /> +<p>When the chat starts on the target device, make sure to tap <em>Finalize migration</em> and then <em>Delete database</em> on the source device.</p> +<p>The database cannot be used on two devices at the same time, doing so would make it impossible to decrypt the received messages. This is a security measure - the break-in recovery property of double ratchet algorithm.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 23 Mar 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html + + + SimpleX Chat v5.6 (beta): adding quantum resistance to Signal double ratchet algorithm + https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html + <h1 id="simplex-chat-v56-beta-adding-quantum-resistance-to-signal-double-ratchet-algorithm" tabindex="-1">SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm</h1> +<p><strong>Published:</strong> Mar 14, 2024</p> +<p>This is a major upgrade for SimpleX messaging protocols, we are really proud to present the results of the hard work of our whole team on the <a href="https://en.wikipedia.org/wiki/Pi_Day">Pi day</a>.</p> +<p>This post also covers various aspects of end-to-end encryption, compares different messengers, and explains why and how quantum-resistant encryption is added to SimpleX Chat:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#why-do-we-need-end-to-end-encryption">Why do we need end-to-end encryption?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#why-is-encryption-even-allowed">Why is encryption even allowed?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#end-to-end-encryption-security-attacks-and-defense">End-to-end encryption security: attacks and defense.</a> +<ol> +<li>Compromised message size - mitigated by padding messages to a fixed block size.</li> +<li>Compromised confidentiality - mitigated by repudiation (deniability).</li> +<li>Compromised message keys - mitigated by forward secrecy.</li> +<li>Compromised long-term or session - mitigated by break-in recovery.</li> +<li>Man-in-the-middle attack - mitigated by two-factor key exchange.</li> +<li>&quot;Record now, decrypt later&quot; attacks - mitigated by post-quantum cryptography.</li> +</ol> +</li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#how-secure-is-end-to-end-encryption-in-different-messengers">How secure is encryption in different messengers?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#adding-quantum-resistance-to-signal-double-ratchet-algorithm">Adding quantum resistance to Signal double ratchet algorithm.</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#when-can-you-start-using-quantum-resistant-chats">When can you start using quantum resistant chats?</a></li> +<li><a href="https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html#next-for-post-quantum-crypto---all-direct-chats-small-groups-and-security-audit">Next for post-quantum crypto - all direct chats, small groups and security audit.</a></li> +</ul> +<h2 id="why-do-we-need-end-to-end-encryption" tabindex="-1">Why do we need end-to-end encryption?</h2> +<p>The objective of end-to-end encryption is to make any potential attackers, such as traffic observers or communication providers who pass the messages between senders and recipients, unable to recover <em>any</em> message content or meaningful information about the messages, even if these attackers possess very advanced computing and mathematical capabilities.</p> +<p>While human eyes are unable to see any difference between simply scrambled and encrypted messages, the difference between unreadable scrambling and unbreakable encryption can be as huge as just a few seconds to unscramble a message on an average laptop and more time than the Universe existed required to break the encryption on the most powerful computer in the world.</p> +<p>Achieving the latter requires a lot of mathematical precision in both the cryptographic algorithms and in how they are used, and effectively makes encrypted messages indistinguishable from random noise, without any discoverable patterns or statistical irregularities that a computer could use to break the message encryption any faster than it it would take to try every possible combination of bits in the key.</p> +<p>End-to-end encryption is an important component of our individual and business security, privacy and sovereignty. Having our private communications protected from any observers is both the natural condition and our inalienable human right.</p> +<p>It's very sad to see the same people who keep their financial affairs private to protect from financial crimes, lock their doors to protect from thieves, and curtain their windows to protect from the occasional prying eyes, when it comes to protecting their personal lives from the data criminals say &quot;we don't care about privacy, we have nothing to hide&quot;. Everybody's safety depends on keeping their affairs and relations private, not visible to a vast and ruthless data gathering machines, that abuse our data for commercial gain, without any regard to our interests or even <a href="https://nmdoj.gov/press-release/attorney-general-raul-torrez-files-lawsuit-against-meta-platforms-and-mark-zuckerberg-to-protect-children-from-sexual-abuse-and-human-trafficking/">the safety of our families and children</a>.</p> +<h2 id="why-is-encryption-even-allowed" tabindex="-1">Why is encryption even allowed?</h2> +<img src="https://simplex.chat/blog/images/20240314-djb.jpg" class="float-to-right" /> +<p>If encryption is such a powerful tool to protect our lives, it also can be used to conceal crimes, so why the governments don't consider it similar to arms, and don't heavily regulate its use?</p> +<p>Prior to 1996 the cryptography was considered munition, and its export from the United States was controlled under this category, <a href="https://cr.yp.to/export/1995/0303-eff.txt">alongside flamethrowers and B-1 bombers</a>. When <a href="https://en.wikipedia.org/wiki/Daniel_J._Bernstein">Daniel J. Bernstein</a> (DJB), then a student of Mathematics at University of California, Berkeley, wanted to publish the paper and the source code of his Snuffle encryption system, the Office of Defense Trade Controls of the Department of State (DOS) after more than a year of correspondence requested that DJB registers as the arms dealer.</p> +<p>In 1995 DJB represented by the Electronic Frontier Foundation brought a case against the DOS to overturn cryptography restrictions. The ruling in the case declared that the export control over cryptographic software and related technical data constitute <a href="https://cr.yp.to/export/1996/1206-order.txt">an impermissible infringement on speech in violation of the First Amendment</a>. This decision resulted in regulatory changes, reducing controls on encryption exports, particularly for open-source algorithms. The case continued until 2003, when it was put on hold after the commitment from the US government not to enforce any remaining regulations.</p> +<p>This case is very important for the whole industry, as to this day we can freely create and use open-source cryptography without export control restrictions. It also shows the importance of engaging with the system and challenging its views in an open dialogue, rather than either blindly complying or violating regulations.</p> +<p>DJB role for cryptography and open-source goes beyond this case – many cryptographic algorithms that are considered to be the most advanced, and many of which we use in SimpleX Chat, were designed and developed by him:</p> +<ul> +<li>Ed25519 cryptographic signature algorithm we use to authorize commands to the servers.</li> +<li>NaCL library with cryptobox and secretbox constructions that combine X25519 Diffie-Hellman key agreement with Salsa20 encryption and Poly1305 authentication. We use cryptobox to encrypt messages in two of three encryption layers and secretbox to encrypt files.</li> +<li>Streamlined NTRU Prime algorithm for quantum resistant key agreement that we used in the protocol for linking mobile app with desktop, and now added to Signal double ratchet algorithm, as explained below.</li> +</ul> +<p>Without DJB's work the world would have been in a much worse place privacy- and security-wise.</p> +<p>Daniel, we are really grateful for the work you did and continue doing. Thank you, and congratulations on the International Mathematics Day!</p> +<h2 id="end-to-end-encryption-security-attacks-and-defense" tabindex="-1">End-to-end encryption security: attacks and defense</h2> +<p>End-to-end encryption is offered by many messaging apps and protocols, but the security of different implementations are not the same. While many users know about the importance of forward secrecy - the quality of end-to-end encryption that preserves security of the encryption of the past messages, even if the keys used to encrypt some of the messages were compromised - there are many other qualities that protect from different attacks. Below there is the overview of these attacks and the properties of end-to-end encryption schemes that mitigate these attacks.</p> +<h3 id="1-compromised-message-size-mitigated-by-padding-messages-to-a-fixed-block-size" tabindex="-1">1. Compromised message size - mitigated by padding messages to a fixed block size</h3> +<p>While the content encryption is the most important, concealing the actual message size is almost as important for several reasons:</p> +<ul> +<li>attacker able to observe even approximate message sizes can use these sizes as an additional signal for machine learning to de-anonymise the users and to categorize the relationships between the users.</li> +<li>if a messenger conceals the routing of the messages to hide the transport identities (IP addresses) of senders and recipients, message sizes can be used by traffic observers to confirm the fact of communication with a much higher degree of certainty.</li> +</ul> +<p>The only effective mitigation to these attacks is to pad all messages to a fixed size. Using space-efficient schemes like Padme, or padding to encryption block size is ineffective for mitigating these attacks, as they still allow differentiating message sizes.</p> +<p>To the best of our knowledge, the only messengers other than SimpleX Chat that pad all messages to a fixed packet size are Cwtch and no longer developed <a href="https://github.com/agl/pond">Pond</a> - SimpleX design can be seen as an evolution of Pond design.</p> +<h3 id="2-compromised-confidential-messages-mitigated-by-repudiation-deniability" tabindex="-1">2. Compromised confidential messages - mitigated by repudiation (deniability)</h3> +<p>Many users are very interested in having ability to irreversibly delete sent messages from the recipients devices. But not only would this ability violate data sovereignty of device owners, it is also completely ineffective, as the recipients could simply put the device offline or use a modified client app to ignore message deletion requests. While SimpleX Chat provides such features as <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">disappearing messages</a> and the ability to <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">irreversibly delete sent messages</a> provided both parties agree to that, these are convenience features, and they cannot be considered security measures.</p> +<p>The solution to that is well known to cryptographers - it is the quality of the encryption algorithms called &quot;repudiation&quot;, sometimes also called &quot;deniability&quot;. This is the ability of the senders to plausibly deny having sent any messages, because cryptographic algorithms used to encrypt allow recipients forging these messages on their devices, so while the encryption proves authenticity of the message to the recipient, it cannot be used as a proof to any third party.</p> +<p>Putting it all in a simpler language - a sender can claim that the recipient forged messages on their device, and deny ever having sent them. The recipient will not be able to provide any cryptographic proof. This quality makes digital conversation having the same qualities as private off-the-record conversation - that's why the family of algorithms that provide these qualities are called off-the-record (OTR) encryption.</p> +<p>Repudiation is still a rather new concept - the first off-the-record algorithms were proposed in 2004 and were only offered to a wide range of users in Signal messenger. This concept is still quite badly understood by users and society, and yet to have been used as the defense in any public court cases, as legal systems evolve much slower than technology. In high profile cases repudiation can be used as an effective evidence for the defense.</p> +<p>Repudiation in messaging systems can be undermined by adding cryptographic signature to the protocol, and many messengers that use OTR encryption algorithms do exactly that, unfortunately. SimpleX Chat does not use signature in any part of client-client protocol, but the signature is currently used when authorizing sender's messages to the relays. v5.7 will improve deniability by enabling a different authorization scheme that will provide full-stack repudiation in all protocol layers.</p> +<h3 id="3-compromised-message-keys-mitigated-by-forward-secrecy" tabindex="-1">3. Compromised message keys - mitigated by forward secrecy</h3> +<p>The attacker who obtained or broke the keys used to encrypt individual messages, may try to use these keys to decrypt past or future messages. This attack is unlikely to succeed via message interception, and it is likely to require breaking into the device storage. But in any case, if the key was broken or obtained in some other way it's important that this key cannot be used to decrypt other messages - this is achieved by forward secrecy.</p> +<p>This property is well understood by the users, and most messengers that focus on privacy and security, with the exception of Session, provide forward secrecy as part of their encryption schemes design.</p> +<h3 id="4-compromised-long-term-or-session-mitigated-by-break-in-recovery" tabindex="-1">4. Compromised long-term or session - mitigated by break-in recovery</h3> +<p>This attack is much less understood by the users, and forward secrecy does not protect from it. Arguably, it's almost impossible to compromise individual message keys without compromising long-term or session keys. So the ability of the encryption to recover from break-in (attacker making a copy of the device data without retaining the ongoing access) is both very important and pragmatic - break-in attacks are simpler to execute on mobile devices during short-term device access than long-term ongoing compromise.</p> +<p>Out of all encryption algorithms known to us only <em>Signal double ratchet algorithm</em> (also referred to as <em>Signal algorithm</em> or <em>double ratchet algorithm</em>, which is not the same as Signal messaging platform and protocols) provides the ability for the encryption security to recover after break-ins attacks. This recovery happens automatically and transparently to the users, without them doing anything special or even knowing about break-in, by simply sending messages. Every time one of the communication parties replies to another party message, new random keys are generated and previously stolen keys become useless.</p> +<p>Double ratchet algorithm is used in Signal, Cwtch and SimpleX Chat. But Signal app by allowing to use the same profile on multiple devices compromises the break-in recovery function of Signal algorithm, as explained in <a href="https://eprint.iacr.org/2021/626.pdf">this paper</a>. Because of break-in recovery you cannot use SimpleX Chat profile on more than one device at the same time - the encryption scheme rotates the long term keys, randomly, and keys on another device become useless, as they would become useless for the attacker who stole them. Security always has some costs to the convenience.</p> +<h3 id="5-man-in-the-middle-attack-mitigated-by-two-factor-key-exchange" tabindex="-1">5. Man-in-the-middle attack - mitigated by two-factor key exchange</h3> +<p>Many people incorrectly believe that security of end-to-end encryption cannot be broken by communication provider. But end-to-end encryption is only as secure as key exchange. While any intermediary passing the keys between senders and recipients cannot recover the private keys from the public keys, they can simply replace the passed public keys with their own and then proxy all communication between the users having full access to the original messages. So instead of having an end-to-end encrypted channel, users would have two half-way encrypted channels - between users and their communication intermediary.</p> +<p>Pictures below illustrate how this attack works for RSA encryption.</p> +<h4 id="1-alice-sends-the-key-to-bob-eg-via-p2p-network-or-via-the-messaging-server" tabindex="-1">1) Alice sends the key to Bob (e.g. via p2p network or via the messaging server).</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm1.jpg" alt="Public key is shared" /></p> +<h4 id="2-now-bob-can-send-encrypted-messages-to-alice-he-believes-they-are-secure" tabindex="-1">2) Now Bob can send encrypted messages to Alice - he believes they are secure!</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm2.jpg" alt="Message is encrypted" /></p> +<h4 id="3-but-the-key-could-have-been-intercepted-and-substituted-by-tom-the-attacker-or-a-service-provider" tabindex="-1">3) But the key could have been intercepted and substituted by Tom (the attacker, or a service provider).</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm3.jpg" alt="Key is intercepted and replaced" /></p> +<h4 id="4-now-the-attacker-can-read-the-messages-without-alice-and-bob-knowing" tabindex="-1">4) Now the attacker can read the messages without Alice and Bob knowing.</h4> +<p><img src="https://simplex.chat/blog/images/20240314-mitm4.jpg" alt="End-to-end encryption is compromised" /></p> +<p>The attack on Diffie-Hellman (or on quantum-resistant) key exchange, when both parties send their public keys (or public key and ciphertext), requires the attacker to intercept and replace both keys, but the outcome remains the same - if all communication is passed via a single channel, as it is usually the case with communication services, then any attacker that has inside access to the service can selectively compromise some of the conversations. Two years ago I wrote the post about this <a href="https://www.poberezkin.com/posts/2022-12-07-why-privacy-needs-to-be-redefined.html#e2e-encryption-is-not-bulletproof">vulnerability of end-to-end encryption to MITM attacks</a>.</p> +<p>All known mitigations of this attack require using the secondary communication channel to ensure that the keys have not been substituted. The most secure approach is to make user's key (or key fingerprint) a part of the user's address or connection link, thus making two-factor key exchange non-optional. This approach is used in Session, Cwtch and SimpleX Chat.</p> +<p>A less secure approach is to provide users an optional way to compare security codes - this is what is done by Signal, Element and many other messengers. The problem with this post-key-exchange verification is that it is optional, and is usually skipped by the majority of the users. Also, this security code can change because the user changed the device, or as a result of the attack via the service provider. When you see in the client app the notification that the security code changed, it's pointless to ask in the same messenger whether the device was changed, as if it were an attack, the attacker would simply confirm it. Instead, the security code needs to be re-validated again via another channel. A good security practice for the users would be to warn their communication partners about the intention to switch the device in advance, before the security code is changed.</p> +<h3 id="6-record-now-decrypt-later-attacks-mitigated-by-post-quantum-cryptography" tabindex="-1">6. &quot;Record now, decrypt later&quot; attacks - mitigated by post-quantum cryptography.</h3> +<p>This is the idea based on the assumption that commercially viable quantum computers will become available during the next 10 years, and then they can use time-efficient <a href="https://en.wikipedia.org/wiki/Shor%27s_algorithm">Shor's algorithm</a> developed in 1994 to break asymmetric encryption with quantum computer (symmetric encryption is not vulnerable to this algorithm).</p> +<p>Post-quantum cryptography, or encryption algorithms that are resistant to quantum computers, has been the area of ongoing research for several decades, and there are some algorithms that <em>might</em> protect from quantum computers. It's important to account for these limitations:</p> +<ul> +<li><em>none of the post-quantum algorithms are proven to be secure</em> against quantum or conventional computers. They are usually referred to as &quot;believed to be secure&quot; by the researchers and security experts. There is continuous research to break post-quantum algorithms, and to prove their security, and many of these algorithms are broken every year, often by conventional computers.</li> +<li>because of the lack of proofs or guarantees that post-quantum cryptography delivers on its promise, these algorithms can only be used in hybrid encryption schemes to augment conventional cryptography, and never to replace it, contrary to some expert recommendations, as DJB explains in this <a href="https://blog.cr.yp.to/20240102-hybrid.html">blog post</a>.</li> +<li>they are much more computationally expensive and less space efficient, and the encryption schemes have to balance their usability and security.</li> +<li>many of post-quantum algorithms have known patent claims, so any system deploying them accepts the risks of patent litigation.</li> +<li>the silver lining to these limitations is that the risk of appearance of commercially viable quantum computers in the next decade may be exaggerated.</li> +</ul> +<p>So, to say it provocatively, post-quantum cryptography can be compared with a remedy against the illness that nobody has, without any guarantee that it will work. While there is a reasonable hope that it <em>might</em> work, so it's not exactly a <em>snake oil</em>, these limitations and risks have to be much better communicated to the end users than they are.</p> +<img src="https://simplex.chat/blog/images/20240314-datacenter.jpg" width="400" class="float-to-right" /> +<p>Does it mean that post-quantum cryptography is useless and should be ignored? Absolutely not. The risks of &quot;record now, decrypt later&quot; attacks are real, particularly for high profile targets, including millions of people - journalists, whistle-blowers, freedom-fighters in oppressive regimes, and even some ordinary people who may become targets of information crimes. Large scale collection of encrypted communication data is ongoing, and this data may be used in the future. So having the solution that <em>may</em> protect you (post-quantum cryptography), as long as it doesn't replace the solution that is <em>proven</em> to protect you (conventional cryptography), is highly beneficial in any communication solution, and has already been deployed in many tools and in some messengers.</p> +<h2 id="how-secure-is-end-to-end-encryption-in-different-messengers" tabindex="-1">How secure is end-to-end encryption in different messengers?</h2> +<p>This comparison may be incorrect in some of the columns. We apologize if some of the points are incorrect, please let us know about any mistakes so we can amend them!</p> +<p>The main objective here is to establish the framework for comparing the security of end-to-end encryption schemes, and to highlight any areas for improvement, not to criticize any implementations.</p> +<p><img src="https://simplex.chat/blog/images/20240314-comparison.jpg" alt="Messengers comparison" /></p> +<p><sup>1</sup> Repudiation in SimpleX Chat will include client-server protocol from v5.7 or v5.8. Currently it is implemented but not enabled yet, as its support requires releasing the relay protocol that breaks backward compatibility.</p> +<p><sup>2</sup> Post-quantum cryptography is available in beta version, as opt-in only for direct conversations. See below how it will be rolled-out further.</p> +<p>Some columns are marked with a yellow checkmark:</p> +<ul> +<li>when messages are padded, but not to a fixed size (Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes).</li> +<li>when repudiation does not include client-server connection. In case of Cwtch it appears that the presence of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.</li> +<li>when 2-factor key exchange is optional (via security code verification).</li> +<li>when post-quantum cryptography is only added to the initial key agreement and does not protect break-in recovery.</li> +</ul> +<h2 id="adding-quantum-resistance-to-signal-double-ratchet-algorithm" tabindex="-1">Adding quantum resistance to Signal double ratchet algorithm</h2> +<p>We have been exploring post-quantum cryptography since early 2022, when SimpleX Chat was first released, and we did not want to be pioneers here - cryptography is critically important to make it right.</p> +<p>We hoped to adopt the algorithm that will be standardized by NIST, but the standardization process turned out to be hugely disappointing, and the ML-KEM (Kyber) algorithm that was accepted as a standard was modified to remove an important hashing step (see the lines 304-314 in <a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf">the published spec</a>)), that mitigates the attacks via a compromised random numbers generator, ignoring strong criticism from many expert cryptographers, including DJB (see <a href="https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/WFRDl8DqYQ4">this discussion</a> and <a href="https://csrc.nist.gov/files/pubs/fips/203/ipd/docs/fips-203-initial-public-comments-2023.pdf">the comments NIST received</a>). To make it even worse, the calculation of security levels of Kyber appears to have been done incorrectly, and overall, the chosen Kyber seems worse than rejected NTRU according to <a href="https://blog.cr.yp.to/20231003-countcorrectly.html">the analysis by DJB</a>.</p> +<p>We also analyzed the encryption schemes proposed in Tutanota in 2021, and another scheme adopted by Signal last year, and published the design of <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/rfcs/2023-09-30-pq-double-ratchet.md">quantum resistant double ratchet algorithm</a> that we believe provides better security than these schemes:</p> +<ul> +<li>unlike Tutanota design, it augments rather than replaces conventional cryptography, and also avoids using signatures when the new keys are agreed (ratchet steps).</li> +<li>unlike other messengers that adopted or plan to adopt ML-KEM, we used Streamlined NTRU Prime algorithm (specifically, strnup761) that has no problems of ML-KEM, no known patent claims, and seems less likely to be compromised than other algorithms - it is exactly the same algorithm that is used in SSH. You can review the comparison of <a href="https://ntruprime.cr.yp.to/warnings.html">the risks of various post-quantum algorithms</a>.</li> +<li>unlike Signal design that only added quantum resistance to the initial key exchange by replacing X3DH key agreement scheme with post-quantum <a href="https://signal.org/docs/specifications/pqxdh/">PQXDH</a>, but did not improve Signal algorithm itself, our design added quantum-resistant key agreements inside double algorithm, making its break-in recovery property also quantum resistant.</li> +</ul> +<p>The we could make break-in recovery property of Signal algorithm quantum-resistant, and why, probably, Signal didn't, is because irrespective of the message size SimpleX Chat uses a fixed block size of 16kb to provide security and privacy against any traffic observers and against messaging relays. So we had an extra space to accommodate additional ~2.2kb worth of keys in each message without any additional traffic costs.</p> +<p>In case when the message is larger than the remaining block size, e.g. when the message contains image or link preview, or a large text, we used <a href="https://en.wikipedia.org/wiki/Zstd">zstd compression</a> to provide additional space for the required keys without reducing image preview quality or creating additional traffic - our previously inefficient JSON encoding of chat messages was helpful in this case.</p> +<image src="./images/20240314-kem.jpg" alt="Double KEM agreement" width="500" class="float-to-right"> +<p>The additional challenge in adding sntrup761 was that unlike Diffie-Hellman key exchange, which is symmetric (that is, the parties can share their public keys in any order and the shared secret can be computed from two public keys), sntrup761 is interactive key-encapsulation mechanism (KEM) that requires that one party shares its public key, and another party uses it to encapsulate (which is a fancy term for &quot;encrypt&quot; - that is why it has asterisks in the image) a random shared secret, and sends it back - making it somewhat similar to RSA cryptography. But this asymmetric design does not fit the symmetric operation of Signal double ratchet algorithm, where both sides need to generate random public keys and to compute new shared secrets every time messaging direction changes for them. So to achieve that symmetry we had to use two KEM key agreements running in parallel, in a lock-step fashion, as shown on the diagram. In this case both parties generate random public keys and also use the public key of another party to encapsulate the random shared secret. Effectively, this design adds a double quantum-resistant key agreement to double ratchet algorithm steps that provide break-in recovery.</p> +<h2 id="when-can-you-start-using-quantum-resistant-chats" tabindex="-1">When can you start using quantum resistant chats?</h2> +<p><img src="https://simplex.chat/blog/images/20240314-pq1.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq2.png" width="288" /> <img src="https://simplex.chat/blog/images/20240314-pq3.png" width="288" /></p> +<p>Quantum resistant double ratchet algorithm is already available in v5.6 (beta) of SimpleX Chat as an optional feature that can be enabled for the new and, separately, for the existing direct conversations.</p> +<p>The reason it is released as opt-in is because once the conversation is upgraded to be quantum resistant, it will no longer work in the previous version of the app, and we see this ability to downgrade the app if something is not working correctly as very important for the users who use the app for critical communications.</p> +<p><strong>To enable quantum resistance for the new conversations</strong>:</p> +<ul> +<li>open the app settings (tap user avatar in the top left corner).</li> +<li>scroll down to <em>Developer tools</em> and open them.</li> +<li>enable <em>Show developer options</em> toggle.</li> +<li>now you will see <em>Post-quantum E2EE</em> toggle - enable it as well.</li> +</ul> +<p>Now all new contacts you add to the app will use quantum resistant double ratchet algorithm.</p> +<p>Once you have enabled it for the new contacts, you can also <strong>enable it for some of the existing contacts</strong>:</p> +<ul> +<li>open the chat with the contact you want to upgrade to be quantum resistant.</li> +<li>tap contact name above the chat.</li> +<li>tap Allow PQ encryption.</li> +<li>exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.</li> +</ul> +<h2 id="next-for-post-quantum-crypto-all-direct-chats-small-groups-and-security-audit" tabindex="-1">Next for post-quantum crypto - all direct chats, small groups and security audit</h2> +<p>We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.</p> +<p>We will also be adding quantum resistance to small groups up to 10-20 members. Computing cryptographic keys is much slower, in comparison, and it would be very inefficient (and completely unnecessary) for large public groups.</p> +<p>We have also arranged a 3rd party cryptographic review of our protocol and encryption schemes design for June/July 2024 - it will cover the additions to SimpleX protocols since <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the previous security audit</a> in November 2022, including <a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html">XFTP protocol</a> we use for file transfers and quantum resistant Signal double ratchet algorithm we just released in this beta version.</p> +<p>In November 2024 we will be conducting further implementation audit, with double the scope of our 2022 audit.</p> +<p>Security audits are very expensive, as they require employing exceptionally competent engineers and cryptographers, and it does stretch our budgets - so any donations to help us cover the costs would be hugely helpful.</p> +<p>That's it for now!</p> +<p>Thank you for helping us improve the app, and look forward to your feedback.</p> +<h2 id="simplex-network" tabindex="-1">SimpleX network</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donates to SimpleX Chat!</p> +<p>As I wrote, we are planning a 3rd party security audit for the protocols and cryptography design, and also for an app implementation, and it would hugely help us if some part of this $50,000+ expense is covered with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX network based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> +</image> + + Thu, 14 Mar 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html + + + SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. + https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html + <h1 id="simplex-chat-free-infrastructure-from-linode-v55-released-with-private-notes-group-history-and-a-simpler-ux-to-connect" tabindex="-1">SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.</h1> +<p><strong>Published:</strong> Jan 24, 2024</p> +<p><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#simplex-chat-infrastructure-on-linode">SimpleX Chat infrastructure on Linode</a>:</p> +<ul> +<li>Free infrastructure.</li> +<li>SimpleX servers in Linode Marketplace.</li> +<li>High capacity messaging servers.</li> +</ul> +<p>What's new in v5.5:</p> +<ul> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#private-notes">private notes</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#group-history">group history</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#simpler-ux-to-connect-to-other-users">simpler UX to connect to other users</a></li> +<li><a href="https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html#message-delivery-stability-and-other-improvements">message delivery stability and other improvements</a></li> +</ul> +<p>Also, we added Hungarian (only Android) and Turkish interface languages, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>SimpleX Chat Android app is now available in 20 languages!</p> +<h2 id="simplex-chat-infrastructure-on-linode" tabindex="-1">SimpleX Chat infrastructure on Linode</h2> +<p>We chose Linode as our hosting provider as and they have been consistently reliable, cheaper than alternatives, with excellent support and great documentation.</p> +<p>When Linode was acquired by Akamai, we were a bit nervous about how it may affect service quality. So far it's been working out quite well.</p> +<p>As the usage of SimpleX network was growing, so did our hosting costs, and from being really small they started to become significant, particularly as we didn't yet manage to optimize the servers last year.</p> +<p>Linode helped - we're really excited to announce that Akamai decided to support SimpleX Chat growth by accepting it into their <a href="https://www.linode.com/linode-for-startups/">Linode Rise startup program</a>.</p> +<p>Thanks to this program:</p> +<ul> +<li> +<p>we received free infrastructure for the first year up to $10,000 per month, no strings attached. It already saved us some money, and gave us enough time to optimize the servers - the latest version of the servers are much less costly to operate with the current traffic, and can support a much larger traffic within this limit. In the year 2 of the program we will receive 50% discount with unlimited traffic, and in year 3 - 25% discount.</p> +</li> +<li> +<p>Linode Marketplace now includes <a href="https://www.linode.com/marketplace/apps/simplex-chat/simplex-chat/">SimpleX Chat messages and file servers</a> - you can get free $100 credits for the first 2 months and run your own servers in just a few clicks, and use them in SimpleX Chat apps. Anybody can submit their application to Linode marketplace, but dedicated support we have from Linode team via this program made it simpler.</p> +</li> +<li> +<p>Akamai solution engineers are helping us to design high capacity server solution, free of charge, so that a single host can provide horizontally scalable capacity for messaging, allowing for a much larger number of concurrent users on a single server address. Initially we considered using HAProxy, and the latest proof of concept uses OpenResty - a fork of Nginx with Lua script engine - to route requests from a single host to multiple SMP relays, reducing an overhead for the clients that would be configured with a smaller number of higher capacity servers. This project is still in progress, there will be more details as we roll it out.</p> +</li> +</ul> +<h2 id="whats-new-in-v55" tabindex="-1">What's new in v5.5</h2> +<h3 id="private-notes" tabindex="-1">Private notes</h3> +<p><img src="https://simplex.chat/blog/images/20240124-notes1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-notes2.png" width="220" class="float-to-left" /></p> +<p><em>&quot;Where do I put notes for myself?&quot;</em> was a very common support question. There was a workaround - you could create an empty group, just with yourself, and use it to save notes, but it was not very convenient, and you could accidentally add members there.</p> +<p>This version has a more convenient and private alternative - the Private notes. It looks like an ordinary conversation where you can put text messages, links with previews, and any media and files, but they are not sent anywhere - they are stored locally, only on your device, with encrypted files.</p> +<p>You can access the Private notes created in mobile app from desktop app too, by linking a mobile and desktop apps - the feature <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html">added in the previous version</a>. It allows to conveniently share files between the devices without sending them over the Internet.</p> +<h3 id="group-history" tabindex="-1">Group history</h3> +<p><img src="https://simplex.chat/blog/images/20240124-history1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-history2.png" width="220" class="float-to-left" /></p> +<p>In the previous version, when users joined groups, they only saw an empty conversation, and the notifications of being connected to other members. This version allows group admins sending recent group history to the new members - this option is enabled by default for new groups, and can be enabled for the existing groups in the preferences. So now new members can join the conversation as soon as they join.</p> +<p>This does not mean that these messages are stored on any servers - the admin member that adds a new member to the group sends these messages directly when a new member joins. Groups are still fully decentralized, do not have any identity on the network, and fully private - only their members know they exist.</p> +<p>That is, unless a group owner decides to make it public. Groups can be registered in <a href="https://simplex.chat/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">SimpleX groups directory</a> to be discovered by the new members - group directory is also improved.</p> +<h3 id="simpler-ux-to-connect-to-other-users" tabindex="-1">Simpler UX to connect to other users</h3> +<p><img src="https://simplex.chat/blog/images/20240124-connect1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20240124-connect2.png" width="220" class="float-to-left" /></p> +<p>SimpleX platform has no user accounts or identities, and while it improves metadata privacy, it also makes it harder to understand how to connect to other people, particularly for the new users who are not invited by the existing users.</p> +<p>This version simplifies this interface by allowing to connect via the received link just by pasting the address into the search bar, as is common in many wallet apps and some other decentralized messengers. We also improved the interface of creating invitation links.</p> +<p>We will continue working on improving and simplifying user interface throughout the year. Please send us any feedback and suggestions to the team's address available in the app.</p> +<h3 id="message-delivery-stability-and-other-improvements" tabindex="-1">Message delivery stability and other improvements</h3> +<p>One of the long standing issues was that message reception could get stuck in some rare occasions, and only get resumed once the app is fully restarted. As Android app includes an always-on notification service that runs in background, full restart should be done via the app settings.</p> +<p>This version fixed many issues with message delivery stability and also added some diagnostics to identify any other cases when message delivery may stop. These fixes should also reduce battery usage, particularly on slow internet connections.</p> +<p>Other improvements in this version:</p> +<ul> +<li>you can now reveal secret messages by tapping. To send a secret message wrap in &quot;#&quot; characters, e.g. &quot;#password#&quot;.</li> +<li>you can delete the last user profile, simplifying account deletion. If you have <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html">hidden user profiles</a>, they won't be deleted in this case, and will be accessible again once you create a new profile.</li> +</ul> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Wed, 24 Jan 2024 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html + + + SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. + https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html + <h1 id="simplex-chat-v54-link-mobile-and-desktop-apps-via-quantum-resistant-protocol-and-much-better-groups" tabindex="-1">SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups.</h1> +<p><strong>Published:</strong> Nov 25, 2023</p> +<p><strong>What's new in v5.4:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol">Link mobile and desktop apps via secure quantum-resistant protocol</a>. +<ul> +<li>⚡️ Quick start - how to use it.</li> +<li>How does it work?</li> +<li>🤖 Connecting to remote CLI.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#better-groups">Better groups</a>. +<ul> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#faster-to-join-with-more-reliable-message-delivery">Faster to join and more reliable</a>.</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#new-group-features">New group features</a>: +<ul> +<li>create groups with incognito profile,</li> +<li>block group members to reduce noise,</li> +<li>prohibit files and media in a group.</li> +</ul> +</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#better-calls">Better calls</a>: faster to connect, with screen sharing on desktop.</li> +</ul> +<p>There are many <a href="https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html#other-improvements">other improvements</a> and fixes in this release:</p> +<ul> +<li>profile names now allow spaces.</li> +<li>when you delete contacts, they are optionally notified.</li> +<li>previously used and your own SimpleX links are recognized by the app.</li> +<li>and more - see the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.4.0">release notes</a>.</li> +</ul> +<h2 id="link-mobile-and-desktop-apps-via-secure-quantum-resistant-protocol" tabindex="-1">Link mobile and desktop apps via secure quantum-resistant protocol</h2> +<p>This release allows to use chat profiles you have in mobile app from desktop app.</p> +<p>This is only possible when both devices are connected to the same local network. To send and receive messages mobile app has to be connected to the Internet.</p> +<h3 id="quick-start-how-to-use-it" tabindex="-1">⚡️ Quick start - how to use it</h3> +<p><strong>On desktop</strong></p> +<p>If you don't have desktop app installed yet, <a href="https://simplex.chat/downloads/index.html">download it</a> and create any chat profile - you don't need to use it, and when you create it there are no server requests sent and no accounts are created. Think about it as about user profile on your computer.</p> +<p>Then in desktop app settings choose <em>Link a mobile</em> - it will show a QR code.</p> +<p><img src="https://simplex.chat/blog/images/20231125-desktop1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-desktop4.png" width="510" /></p> +<p><strong>On mobile</strong></p> +<p>In mobile app settings choose <em>Use from desktop</em>, scan the QR code and verify session code when it appears on both devices - it should be the same. Verifying session code confirms that the devices are connected directly via a secure encrypted connection. There is an option to verify this code on subsequent connections too, but by default it is only required once.</p> +<p><img src="https://simplex.chat/blog/images/20231125-mobile1.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile1a.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile2.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile3.png" width="170" /> <img src="https://simplex.chat/blog/images/arrow.png" width="24" /> <img src="https://simplex.chat/blog/images/20231125-mobile4.png" width="170" /></p> +<p>The devices are now paired, and you can continue using all mobile profiles from desktop.</p> +<p>If it is an Android app, you can move the app to background, but iOS app has to remain open. In both cases, while you are using mobile profiles from desktop, you won't be able to use mobile app.</p> +<p>The subsequent connections happen much faster - by default, the desktop app broadcasts its session address to the network, in encrypted form, and mobile app connects to it once you choose <em>Use from desktop</em> in mobile app settings.</p> +<h3 id="how-does-it-work" tabindex="-1">How does it work?</h3> +<p>The way we designed this solution avoided any security compromises, and the end-to-end encryption remained as secure as it was - it uses <a href="https://simplex.chat/docs/glossary.html#double-ratchet-algorithm">double-ratchet algorithm</a>, with <a href="https://simplex.chat/docs/glossary.html#forward-secrecy">perfect forward secrecy</a>, <a href="https://simplex.chat/docs/glossary.html#post-compromise-security">post-compromise security</a> and deniability.</p> +<p>This solution is similar to WhatsApp and WeChat. But unlike these apps, no server is involved in the connection between mobile and desktop. The connection itself uses a new SimpleX Remote Control Protocol (XRCP) based on secure TLS 1.3 and additional quantum-resistant encryption inside TLS. You can read XRCP protocol specification and threat model in <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2023-10-25-remote-control.md">this document</a>. We will soon be <a href="https://github.com/simplex-chat/simplex-chat/blob/master/docs/rfcs/2023-09-30-pq-double-ratchet.md">augmenting double ratchet</a> to be resistant to quantum computers as well.</p> +<p>The downside of this approach is that mobile device has to be connected to the same local network as desktop. But the upside is that the connection is secure, and you do not need to have a copy of all your data on desktop, which usually has lower security than mobile.</p> +<p>Please note, that the files you send, save or play from desktop app, and also images you view are automatically saved on your desktop device (encrypted by default except videos). To remove all these files you can unlink the paired mobile device from the desktop app settings – there will be an option soon allowing to remove the files without unlinking the mobile.</p> +<h3 id="connecting-to-remote-simplex-cli" tabindex="-1">🤖 Connecting to remote SimpleX CLI</h3> +<p><em>Warning</em>: this section is for technically advanced users!</p> +<p>If you run SimpleX CLI on a computer in another network - e.g., in the cloud VM or on a Raspberry Pi at home while you are at work, you can also use if from desktop via SSH tunnel. Below assumes that you have remote machine connected via SSH and CLI running there - you can use <code>tmux</code> for it to keep running when you are not connected via ssh.</p> +<p>Follow these steps to use remote CLI from desktop app:</p> +<ol> +<li>On the remote machine add the IP address of your desktop to the firewall rules, so that when CLI tries to connect to this address, it connects to <code>localhost</code> instead: <code>iptables -t nat -A OUTPUT -p all -d 192.168.1.100 -j DNAT --to-destination 127.0.0.1</code> (replace <code>192.168.1.100</code> with the actual address of your desktop, and make sure it is not needed for something else on your remote machine).</li> +<li>Also on the remote machine, run Simplex CLI with the option <code>--device-name 'SimpleX CLI'</code>, or any other name you like. You can also use the command <code>/set device name &lt;name&gt;</code> to set it for the CLI.</li> +<li>Choose <em>Link a mobile</em> in desktop app settings, note the port it shows under the QR code, and click &quot;Share link&quot;.</li> +<li>Run ssh port forwarding on desktop computer to let your remote machine connect to desktop app: <code>ssh -R 12345:127.0.0.1:12345 -N user@example.com</code> where <code>12345</code> is the port on which desktop app is listening for the connections from step 3, <code>example.com</code> is the hostname or IP address of your remote machine, and <code>user</code> is some username on remote machine. You can run port forwarding in the background by adding <code>-f</code> option.</li> +<li>On the remote machine, run CLI command <code>/connect remote ctrl &lt;link&gt;</code>, where <code>&lt;link&gt;</code> is the desktop session address copied in step 3. You should run this command within 1 minute from choosing <em>Link a mobile</em>.</li> +<li>If the connection is successful, the CLI will ask you to verify the session code (you need to copy and paste the command) with the one shown in desktop app. Once you use <code>/verify remote ctrl &lt;code&gt;</code> command, CLI can be used from desktop app.</li> +<li>To stop remote session use <code>/stop remote ctrl</code> command.</li> +</ol> +<h2 id="better-groups" tabindex="-1">Better groups</h2> +<h3 id="faster-to-join-with-more-reliable-message-delivery" tabindex="-1">Faster to join, with more reliable message delivery</h3> +<p>We improved the protocols for groups, by making joining groups much faster, and also by adding message forwarding. Previously, the problem was that until a new member connects directly with each existing group member, they did not see each other messages in the group. The problem is explained in detail in <a href="https://www.youtube.com/watch?v=7yjQFmhAftE&amp;t=1104s">this video</a> at 18:23.</p> +<p>With v5.4, the admin who added members to the group forwards messages to and from the new members until they connect to the existing members. So you should no longer miss any messages and be surprised with replies to messages you have never seen once you and new group members upgrade.</p> +<h3 id="new-group-features" tabindex="-1">New group features</h3> +<p><img src="https://simplex.chat/blog/images/20231125-group1.png" width="220" class="float-to-left" /> <img src="https://simplex.chat/blog/images/20231125-block.png" width="220" class="float-to-left" /></p> +<p><strong>Create groups with incognito profile</strong></p> +<p>Previously, you could only create groups with your main profile. This version allows creating groups with incognito profile directly. You will not be able to add your contacts, they can only join via group link.</p> +<p><strong>Block group members to reduce noise</strong></p> +<p>You now can block messages from group members that send too many messages, or the messages you don't won't to see. Blocked members won't know that you blocked their messages. When they send messages they will appear in the conversation as one line, showing how many messages were blocked. You can reveal them, or delete all sequential blocked messages at once.</p> +<p><strong>Prohibit files and media in a group</strong></p> +<p>Group owners now have an option to prohibit sending files and media. This can be useful if you don't won't any images shared, and only want to allow text messages.</p> +<h2 id="better-calls" tabindex="-1">Better calls</h2> +<p>Calls in SimpleX Chat still require a lot of work to become stable, but this version improved the speed of connecting calls, and they should work for more users.</p> +<p>We also added screen sharing in video calls to desktop app.</p> +<h2 id="other-improvements" tabindex="-1">Other improvements</h2> +<p>This version also has many small and large improvements to make the app more usable and reliable.</p> +<p>The new users and group profiles now allow spaces in the names, to make them more readable. To message these contacts in CLI you need to use quotes, for example, <code>@'John Doe' Hello!</code>.</p> +<p>When you delete contacts, you can notify them - to let them know they can't message you.</p> +<p>When you try to connect to the same contact or join the same group, or connect via your own link, the app will recognize it and warn you, or simply open the correct conversation.</p> +<p>You can find the full list of fixed bugs and small improvements in the <a href="https://github.com/simplex-chat/simplex-chat/releases/tag/v5.4.0">release notes</a>.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 25 Nov 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html + + + SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups with directory service + https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html + <h1 id="simplex-chat-v53-released-desktop-app-local-file-encryption-and-improved-groups" tabindex="-1">SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups</h1> +<p><strong>Published:</strong> September 25, 2023</p> +<p><strong>What's new in v5.3:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#multiplatform-desktop-app">new desktop app!</a>!</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#group-directory-service-and-other-group-improvements">directory service and other group improvements</a>.</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#encrypted-local-files-and-media-with-forward-secrecy">encrypted local files and media with forward secrecy</a>.</li> +<li><a href="https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html#simplified-incognito-mode">simplified incognito mode</a>.</li> +</ul> +<p>There are a lot of other improvements and fixes in this release:</p> +<ul> +<li>improved app responsiveness and stability.</li> +<li>app memory usage is reduced by 40%.</li> +<li>new privacy settings: show last messages &amp; save draft.</li> +<li>fixes: +<ul> +<li>bug preventing group members connecting (it will only help the new connections).</li> +<li>playing videos on full screen<sup>**</sup>.</li> +<li>screen reader for messages<sup>**</sup>.</li> +<li>reduced background crashes<sup>**</sup>.</li> +</ul> +</li> +</ul> +<p>Also, we added 6 new interface languages: Arabic<sup><em></em></sup>, Bulgarian, Finnish, Hebrew<sup></sup>, Thai and Ukrainian - thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>* Android app.</p> +<p>** iOS app.</p> +<h2 id="multiplatform-desktop-app" tabindex="-1">Multiplatform desktop app</h2> +<img src="https://simplex.chat/blog/images/simplex-desktop-light.png" width="640" /> +<p>Thanks a lot to everybody who was testing the desktop app since July – it really helped to make it stable!</p> +<p>To use desktop app you need to <strong>create a new profile</strong>. As SimpleX platform has no user accounts, it's not as simple as for centralized apps to access the same profile from two devices.</p> +<p>The next app version will allow using your mobile profile from desktop app. For now, as a workaround, you can join groups from both mobile and desktop devices, and use small groups instead of direct conversations.</p> +<p>When you start the app first time, you will be offered to <strong>set database passphrase</strong> – you have to memorize it, as there is no way to recover it. If you skip it, a random passphrase will be generated and stored on your desktop device as plaintext (unencrypted) – you can change it later.</p> +<p>Other limitations of the desktop app:</p> +<ul> +<li>you cannot send voice messages.</li> +<li>there is no support for calls yet.</li> +</ul> +<p>You can download the desktop app for Linux and Mac via <a href="https://simplex.chat/downloads/index.html">downloads page</a>. Windows version will be available soon.</p> +<h2 id="group-directory-service-and-other-group-improvements" tabindex="-1">Group directory service and other group improvements</h2> +<img src="https://simplex.chat/blog/images/20230925-directory.png" width="330" class="float-to-left" /> +<p>Directory service provides a way to search for public groups submitted by the users. To use it, you need to connect to it via SimpleX Chat, as you would connect to any other contact, and type some words to search.</p> +<p>You can also create and register your group, with some limitations explained <a href="https://simplex.chat/docs/directory.html">here</a>.</p> +<p>Other group improvements in this release:</p> +<ul> +<li> +<p>you can send delivery receipts to the groups up to 20 members.</p> +</li> +<li> +<p>if the group settings allow it, you can send direct messages to group members even after you deleted the contact.</p> +</li> +<li> +<p>connections between members are made faster, and the bug that prevented the connections in some cases is fixed in this release.</p> +</li> +</ul> +<p>The next release will reduce the time it takes to send messages to the group, especially when there are many members or when you have a slow device storage.</p> +<h2 id="encrypted-local-files-and-media-with-forward-secrecy" tabindex="-1">Encrypted local files and media with forward secrecy</h2> +<img src="https://simplex.chat/blog/images/20230925-encrypted.png" width="330" class="float-to-left" /> +<p>All messages, files and media sent via SimpleX Chat were always end-to-end encrypted from the very beginning. SimpleX Chat uses double-ratchet algorithm with encrypted message headers, for the best possible meta-data protection.</p> +<p>You contacts, groups and messages are stored in the local database on your device, and this database was encrypted from <a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html">v4.0 released a year ago</a>.</p> +<p>But until this version all files and media in the app storage were not encrypted, and when you exported the chat archive, they were unencrypted there as well.</p> +<p>From v5.3 all files and media (except videos, for now) are encrypted with a random symmetric key - in many cases they are encrypted before they are written to the storage. Local file encryption can be disabled via Privacy &amp; Security settings, for example, if you need to access the files from the storage outside of the app.</p> +<p>In addition to the videos that are stored unencrypted, there are other rare scenarios when the received files may be unencrypted in this release. Files have an open or closed lock icons to indicate whether they were encrypted locally. These limitations will be addressed in the next release. In any case, all files and media are always sent end-to-end encrypted, without any exceptions.</p> +<p>The keys used to encrypt files locally are associated with the messages and stored in the encrypted database. If you delete a message with the attached file or media, the key will be irreversibly deleted as well. Even if an attacker gains access to your database passphrase later and to the copy of the encrypted file, they won't be able to decrypt the file.</p> +<p>This approach provides forward secrecy for locally stored files, unlike file encryption schemes used in some other apps when the same passphrase is used for all files.</p> +<h2 id="simplified-incognito-mode" tabindex="-1">Simplified incognito mode</h2> +<img src="https://simplex.chat/blog/images/20230925-incognito.png" width="330" class="float-to-left" /> +<p>Incognito mode was <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html">added a year ago</a> to improve anonymity of your profile, but it was confusing for some users - it was a global setting, but it only affected the new connections.</p> +<p>It is now simpler to use - you can decide whether to connect to a contact or join a group using your main profile at a point when you create an invitation link or connect via a link or QR code.</p> +<p>When you are connecting to people you know you usually want to share your main profile, and when connecting to public groups or strangers, you may prefer to use a random profile.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Mon, 25 Sep 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html + + + SimpleX Chat v5.2 released: message delivery receipts + https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html + <h1 id="simplex-chat-v52-released-message-delivery-receipts" tabindex="-1">SimpleX Chat v5.2 released: message delivery receipts</h1> +<p><strong>Published:</strong> July 22, 2023</p> +<p><strong>What's new in v5.2:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#message-delivery-receipts">message delivery receipts</a> – with opt-out per contact!</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#filter-favorite-and-unread-chats">filter favorite and unread chats</a>.</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#more-usable-groups">more usable groups</a>: +<ul> +<li>view full original replied message in info.</li> +<li>share your address with your contacts and group members via your chat profile.</li> +<li>search new and existing members.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#stability-improvements">stability improvements</a>: +<ul> +<li>keep your connections working after restoring from backup.</li> +<li>restart app (Android) or reconnect servers (iOS).</li> +<li>more reliable switching of the receiving address.</li> +<li>more stable message delivery.</li> +</ul> +</li> +<li>other improvements: +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#better-disappearing-messages">better disappearing messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#prohibit-message-reactions">prohibit message reactions</a>.</li> +</ul> +</li> +</ul> +<p><strong>Platform evolution:</strong></p> +<ul> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#problems-of-public-groups">problems of public groups</a>: +<ul> +<li>why not all messages are received.</li> +<li>how to cope with these problems.</li> +<li>when will public groups be more usable.</li> +</ul> +</li> +<li><a href="https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html#what-about-read-receipts">what about read receipts?</a></li> +</ul> +<h2 id="whats-new-in-v52" tabindex="-1">What's new in v5.2</h2> +<h3 id="message-delivery-receipts" tabindex="-1">Message delivery receipts</h3> +<img src="https://simplex.chat/blog/images/20230722-receipts.png" width="330" class="float-to-left" /> +<p>Most messaging apps add two ticks to sent messages – the first one to show that the message is accepted by the server, and the second – that it is delivered to the recipient's device. It confirms that the network is functioning, and that the message is not lost or delayed. SimpleX Chat now has this feature too!</p> +<p>In some cases it may compromise recipients' privacy, as they show that the recipient is online, so we made sending delivery receipts optional – it can be disabled separately for each chat profile or contact. For the new chat profiles this feature is enabled by default.</p> +<p>To avoid compromising your privacy, sending delivery receipts is disabled for all your existing chat profiles. The first time you start the app after the update, you will be offered to enable them for all <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">visible profiles</a>, and they can be enabled later via Privacy and Security settings.</p> +<h3 id="filter-favorite-and-unread-chats" tabindex="-1">Filter favorite and unread chats</h3> +<img src="https://simplex.chat/blog/images/20230722-filter.png" width="288" class="float-to-left" /> +<p>You can now mark your contacts and groups as <em>favorite</em>, to be able to find them faster. With filter enabled, you will only see favorite chats, chats that contain unread messages and also any unaccepted group invitations and contact requests.</p> +<h3 id="more-usable-groups" tabindex="-1">More usable groups</h3> +<p>Active SimpleX Chat users know how broken the current group experience is, and that we plan some major overhaul of the groups protocol – more on that below. In the meanwhile, we added some simple features that make groups in their current state a bit more usable.</p> +<h4 id="what-is-this-in-reply-to" tabindex="-1">What is this in reply to?</h4> +<img src="https://simplex.chat/blog/images/20230722-quoted.png" width="330" class="float-to-left" /> +<p>A major problem is that you can see replies to the messages you've not seen before - this would happen both when you just join the group, and didn't connect to most other members, and also when other new members join the group and they didn't yet connect to you – so literally all the time, and the bigger the group gets, the worse it becomes. While this problem cannot be solved without major group protocol changes, at least there is now ability to see the original message that was replied to via the message information.</p> +<h4 id="how-to-connect-to-this-member" tabindex="-1">How to connect to this member?</h4> +<img src="https://simplex.chat/blog/images/20230722-search.png" width="330" class="float-to-left" /> +<p>To simplify direct connections with other group members, you can now share your SimpleX address via your chat profile, and group members can send you a contact request even if the group does not allow direct messages.</p> +<h4 id="how-to-find-a-member-in-the-list" tabindex="-1">How to find a member in the list?</h4> +<p>Large member lists (and also the long lists of contacts, if you have many of them) become hard to scroll through, so now there is a search in both lists.</p> +<h3 id="stability-improvements" tabindex="-1">Stability improvements</h3> +<p>This version fixes many long-standing problems with the message delivery, failed connections with group members (that also contributed to group fragmentation), and reduces traffic in groups (beta users experienced a traffic spike because of this fix, but it doesn't affect the final v5.2 release). It's not the end of the road to making SimpleX Chat as stable as mainstream messengers, but it is a big improvement.</p> +<p>Please report the cases when messages are not delivered – delivery receipts should help with that.</p> +<h4 id="messages-failed-to-decrypt-problem-solved" tabindex="-1">Messages failed to decrypt? Problem solved!</h4> +<p>Previously, a growing number of users had the issue when after restoring the chat database from backup, messages from some contacts failed to decrypt and were showing an error in the app.</p> +<p>This happens due to double ratchet protocol protecting the integrity of end-to-end encryption after the compromise - <a href="https://simplex.chat/docs/glossary.html#post-compromise-security">post-compromise security</a>. The protocol logic does not allow to use the old version of the database to decrypt the message.</p> +<p>v5.2 added the extension to the messaging protocol allowing to negotiate the new ratchet keys in such cases - both with the contacts and the group members. This requires a user action, and it resets the security code verification status for this contact or member – you need to verify it again to have the additional protection from <a href="https://simplex.chat/docs/glossary.html#man-in-the-middle-attack">man-in-the-middle attacks</a>.</p> +<p>The negotiation of the new ratchet keys still happens via the end-to-end encrypted messages, as the protocol has two layers of end-to-end encryption, so it cannot be compromised by the messaging relays.</p> +<p>You may still lose connection if you or your contact changed the receiving address after you made the backup, so make sure to make a new backup after any receiving address changes.</p> +<h4 id="reconnect-the-servers" tabindex="-1">Reconnect the servers</h4> +<p>While v5.2 solved many message delivery issues, there may be some others, but they are usually resolved with app restart. It was difficult to fully restart Android app, as there is a continuosly running background service for notifications that doesn't restart with the app. Now Android app has both Restart and Shutdown buttons that take background service into account.</p> +<p>On iOS you can now pull down the list of conversations to reconnect to all relays without restarting the app.</p> +<h3 id="better-disappearing-messages" tabindex="-1">Better disappearing messages</h3> +<p>You can now send a separate disappearing message if the chat preferences allow them, but do not have any time to disappear enabled – this applies both to groups and to contacts. You can also set the time to disappear up to 12 months.</p> +<h3 id="prohibit-message-reactions" tabindex="-1">Prohibit message reactions</h3> +<p>While most people like message reactions, some conversations make them inappropriate - you can disable them now.</p> +<h2 id="platform-evolution" tabindex="-1">Platform evolution</h2> +<h3 id="problems-of-public-groups" tabindex="-1">Problems of public groups</h3> +<p>As I wrote above, the major problem is that not all messages are received by all members, or, at least, they may be substantially delayed. Additional problems are various scenarios when the list of members gets out of sync for different members.</p> +<p>How to cope with these problems?</p> +<p>It really helps to only use one link shared with the members to join the group - the one created by the client that is most frequently online, ideally always online. This is sometimes confusing, as any group admin can create another group link, and share it with the members, and if this admin is not online, the new member won't be able to join.</p> +<p>We will add new group features to manage fragmentation - there will be an option to fix the connection with the member that you failed to connect to by passing the link out-of-band. This can be particularly helpful for stable groups of 20-50 people where it's important to see all messages.</p> +<p>In the long term, the only way to make groups usable is to move to a new design. We considered several options.</p> +<h4 id="why-not-hosted-groups-with-mls" tabindex="-1">Why not hosted groups with MLS?</h4> +<p>Initially, we considered the design with the dedicated servers, potentially self-hosted, that host groups. This design would require adopting MLS (or similar) protocol for group-wide key agreement. Unfortunately, this design is not sufficiently resilient and easier to censor than decentralized design. Also, MLS protocol is very complex to implement, requires a centralized component, and reduces forward secrecy. So we decided against this approach.</p> +<h4 id="why-not-fully-decentralized-groups" tabindex="-1">Why not fully decentralized groups?</h4> +<p>We also <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/docs/rfcs/2023-05-02-groups.md">considered</a> rumour-mongering protocol, where all members are equal and participate in message dissemination. The problem with this approach is that it adds a lot of traffic for all members, even those who mostly read messages. Also, it still requires establishing a fully connected graph, and with large groups it becomes prohibitively expensive and unreliable, given that many members join public groups for a limited time.</p> +<h4 id="members-host-the-groups" tabindex="-1">Members host the groups</h4> +<p>We are now considering a middle-ground - the design where the owners and admins host the group, synchronising the state between them, receiving and re-broadcasting the messages between all members. This puts a higher burden on these members, but these clients can be hosted in the cloud, and also group owners have a larger incentive to maintain group integrity. At the same time, this design is better for the rest of the group members, as they don't need to establish connections with all other members, only with a limited number of &quot;hosting&quot; members, and it also better protects their privacy, due to the lack of direct connections between most members.</p> +<p>This approach avoids the need for a group-wide key agreement protocol, as hosting members are expected to have access to all content anyway, so pair-wise ratchets are sufficient. At the same time the content remains end-to-end encrypted, and protected from the outsiders.</p> +<p>This approach also simplifies moderation - the message that needs to be removed simply won't reach the members before it is moderated (in case of automatic or policy-based moderation).</p> +<p>Discovery and content search in such groups will be provided via a dedicated discovery server that will participate in the group, provide an always-online client, and also automatic content moderation functionality - a possible approach to moderation is <a href="https://simplex.chat/blog/https%3A//github.com/simplex-chat/simplex-chat/blob/stable/simplex-chat/docs/rfcs/2023-05-22-groups-moderation.md">described here</a>.</p> +<p>We really look forward to your feedback on this design.</p> +<h3 id="what-about-read-receipts" tabindex="-1">What about read receipts?</h3> +<p>We have an approximately equal number of users who ask us to add receipts, and those who ask not to add them, even as optional.</p> +<p>While read receipts provide some convenience to the message senders, they introduce a lot of stress for the recipients.</p> +<p>As one of the users in the group wrote it: &quot;The existence of read receipts in other platforms is exhausting and is often a source of undue stress. I have to make a decision to read something and let someone know that I have read something and decided not to respond or merely didn't have the time to respond. The outcome of that is a complex social negotiation with non-theoretical social fallout as a consequence. All in all, it's an invasion of privacy of being able to read things at the pace of the individual as opposed to the pace dictated by others... Most people don't need a read receipt, so leave it to a group of individuals to decide if having read receipts make sense to them for their workflow&quot;.</p> +<p>Also read <a href="https://neilalexander.dev/2021/04/09/read-receipts-typing-notifs">this post</a> about the damage from read receipts and other invasive features, like typing and presense notifications.</p> +<p>There is also no discounting that the presense of read receipts functionality, even as opt-in, creates a social pressure to enable them, with the same consequences – there are many scenarios when they become non-optional in some relationships. So many users belive, and we share this view, that it is better not to have these features at all. We will be re-assessing this view.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 22 Jul 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html + + + SimpleX Chat v5.1 released: message reactions and self-destruct passcode + https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html + <h1 id="simplex-chat-v51-released-message-reactions-and-self-destruct-passcode" tabindex="-1">SimpleX Chat v5.1 released: message reactions and self-destruct passcode</h1> +<p><strong>Published:</strong> May 23, 2023</p> +<p>What's new in v5.1:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#message-reactions">message reactions</a> 🚀</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#improved-messages">improved messages</a>: +<ul> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#voice-messages-up-to-5-minutes-better-quality-playback-control">voice messages up to 5 minutes</a>.</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#disappearing-messages-choose-any-time">custom time to disappear</a>.</li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#message-editing-history">message editing history</a>.</li> +</ul> +</li> +<li>new design and <a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#customize-and-share-color-themes">customizable themes</a> that you can share!<sup>*</sup></li> +<li><a href="https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html#self-destruct-passcode">self-destruct passcode</a></li> +</ul> +<p>There are lots of small improvements and fixes in this release:</p> +<ul> +<li>setting to disable audio/video calls per contact.</li> +<li>group welcome message visible in a group profile - add the link to join the group there.</li> +<li>fixes for sending files.</li> +<li>configurable SOCKS proxy host and port<sup>*</sup>.</li> +<li>improved calls on lock screen<sup>*</sup>.</li> +<li>locale-dependent formatting of time and date<sup>*</sup>.</li> +</ul> +<p>Also, we added Japanese and Portuguese (Brazil)<sup>*</sup> interface languages, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">our users and Weblate</a>.</p> +<p>* These features are available in the Android version only.</p> +<h2 id="message-reactions" tabindex="-1">Message reactions</h2> +<img src="https://simplex.chat/blog/images/20230523-reactions.png" width="288" class="float-to-left" /> +<p>No idea why it took us so long to add them – finally we have them, and they are great.</p> +<p>We didn't like the view of other messengers plagued by 40 different reactions on a message, and we were not quite sure what can be done about it, so we initially decided to limit available reactions to just 6: thumbs up 👍, down 👎, smile 😀, tear 😢, heart ❤️ and rocket 🚀. But unlike some other messengers, we don't limit the reactions to just one per message - you can put up to 3.</p> +<p>You can add them via the menu, or just by tapping the reaction already on the message.</p> +<p>The next app version will allow prohibiting the reactions per conversation, as you asked. Some groups work better with more substantive responses.</p> +<h2 id="improved-messages" tabindex="-1">Improved messages</h2> +<h3 id="voice-messages-up-to-5-minutes-better-quality-playback-control" tabindex="-1">Voice messages: up to 5 minutes, better quality, playback control</h3> +<img src="https://simplex.chat/blog/images/20230523-voice.png" width="288" class="float-to-left" /> +<p>Since <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#instant-voice-messages">v4.3</a> voice messages were sent in small 16kb chunks, so we had to limit them to 30-40 seconds for better user experience, as sending larger files would require the sender to be online.</p> +<p>With the new XFTP protocol that allows sending files up to 1gb it is now possible to increase the message size - we decided to limit it at 5 min, increasing their quality 2x (the bitrate is increased from 16 to 32kbps). We also added a slider to control the playback.</p> +<h3 id="disappearing-messages-choose-any-time" tabindex="-1">Disappearing messages: choose any time!</h3> +<p><img src="https://simplex.chat/blog/images/20230523-disappearing1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230523-disappearing2.png" width="288" /></p> +<p>Since <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">v4.4</a> disappearing messages were only configurable for the whole conversation, with a limited choice of allowed times between 30 seconds and 1 month.</p> +<p>This version allows to configure the time for messages to disappear more granularly, in the range from 1 second to 3 months. You can also set a different time to disappear when you send the message (hold the Send button), as long as disappearing messages are enabled in the conversation.</p> +<h3 id="message-editing-history" tabindex="-1">Message editing history</h3> +<img src="https://simplex.chat/blog/images/20230523-info.png" width="288" class="float-to-left" /> +<p>I <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">wrote previously</a> why we decided to require the recipient concent before the messages can be fully deleted by the sender - in short, it is to support recipient's data sovereignty and prevent the possibility of offensive messages being removed without any trace. By default, when the sender deletes the message it is marked as deleted, rather than fully deleted, and you can reveal the original message.</p> +<p>You've found the workaround for it of course - it's enough to simply edit the message to hide the original content. This version adds a visible message editing history, together with other detailed information about when the message was sent, received or deleted, that wasn't visible in the conversation.</p> +<h2 id="customize-and-share-color-themes" tabindex="-1">Customize and share color themes</h2> +<img src="https://simplex.chat/blog/images/20230523-theme.png" width="288" class="float-to-left" /> +<p>Android app now allows choosing between three color themes - Light, Dark and SimpleX (a dark blue theme). You can customize any theme by setting 9 different colors used in the app, including titles, menus, accent colors and colors for sent and received messages.</p> +<p>You can share your theme with other users by exporting it to a file and sending to them. You can also <a href="https://simplex.chat/docs/themes.html">contribute your favorite themes</a> to our GitHub repository.</p> +<h2 id="self-destruct-passcode" tabindex="-1">Self-destruct passcode</h2> +<img src="https://simplex.chat/blog/images/20230523-self-destruct.png" width="288" class="float-to-left" /> +<p>This is something many of you asked before - when asked to enter the app passcode under duress, to be able to enter a special self-destruct code that would remove the app data. This feature is offered in many security tools, and now you can configure it in SimpleX Chat as well.</p> +<p>To enable it:</p> +<ul> +<li>go to app Settings &gt; Privacy &amp; security &gt; SimpleX Lock.</li> +<li>switch lock mode to Passcode and, if necessary, enable lock – Self-destruct passcode will become available.</li> +<li>enable it, enter the main passcode and then enter and confirm self-destruct passcode.</li> +<li>optionally, you can set the new display name of the profile that will be created after the data was wiped. If it is left blank, a new empty profile will have a random name.</li> +</ul> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 23 May 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html + + + SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb + https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html + <h1 id="simplex-chat-vision-and-funding-v50-released-with-videos-and-files-up-to-1gb" tabindex="-1">SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb.</h1> +<p><strong>Published:</strong> Apr 22, 2023</p> +<p>SimpleX Chat vision and funding:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#why-is-it-a-commercial-company">why is it a commercial company?</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#how-is-it-funded-and-what-is-the-business-model">how is it funded and what is the business model?</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#what-is-next">what is next?</a></li> +</ul> +<p>What's new in v5.0:</p> +<ul> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#send-videos-and-files-up-to-1gb">send videos and files up to 1gb</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#app-passcode">app passcode independent from system authentication</a></li> +<li><a href="https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html#networking-improvements">networking improvements</a></li> +</ul> +<p>Also, we added Polish interface language, thanks to <a href="https://github.com/simplex-chat/simplex-chat#help-translating-simplex-chat">the users' community and Weblate</a>.</p> +<p>SimpleX Chat apps are now available in 10 languages!</p> +<h2 id="simplex-chat-vision-and-funding" tabindex="-1">SimpleX Chat vision and funding</h2> +<h3 id="why-is-it-a-commercial-company" tabindex="-1">Why is it a commercial company?</h3> +<p>It was a big decision: whether SimpleX Chat should be a non-profit project or an open-source project led by a commercial company.</p> +<p>During the last 25 years of the Internet, commercial companies have shown a much higher ability to innovate than non-profit organizations. One of the most inspiring examples is NetScape that created the Web as we know it - not only as the destination to access information, but also as an application platform, inventing cookies, SSL and JavaScript, that to this day remain the main building blocks for all web applications.</p> +<p>While SimpleX Chat Ltd is a commercial company, SimpleX Chat software is and will remain open-source. We believe that this way we will create much more value both for the end users, and also for the shareholders and the employees of the company.</p> +<p>Many large tech companies prioritizing value extraction over value creation earned a bad reputation for all businesses, particularly in the communities that value decentralization and privacy. But commercial objectives do not have to result in exploitation. Our goal is to build a new kind of communication network, and also an application platform, that is private by design, fully decentralized and not owned by any single entity, where SimpleX Chat Ltd is one of many organizations that operate the network. I shared my thoughts about how the Internet and privacy might evolve in the interview in <a href="https://optoutpod.com/episodes/s3e02-simplexchat/">Opt Out Podcast</a>.</p> +<h3 id="how-is-it-funded-and-what-is-the-business-model" tabindex="-1">How is it funded and what is the business model?</h3> +<p>We started working full-time on the project in 2021 when <a href="https://www.linkedin.com/in/portmanwills/">Portman Wills</a> and <a href="https://www.linkedin.com/in/peterbriffett/">Peter Briffett</a> (the founders of <a href="https://wagestream.com/en/">Wagestream</a> where I led the engineering team) supported the company very early on, and several other angel investors joined later. In July 2022 SimpleX Chat raised a pre-seed funding from the VC fund <a href="https://www.villageglobal.vc/">Village Global</a> - its co-founder <a href="https://www.villageglobal.vc/team/ben-casnocha">Ben Casnocha</a> was very excited about our vision of privacy-first fully decentralized messaging and community platform, both for the individual users and for the companies, independent of any crypto-currencies, that might grow to replace large centralized platforms, such as WhatsApp, Telegram and Signal.</p> +<blockquote> +<p>Edit: please see the comment from Ben Casnocha about this investment in <a href="https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html">our post from August 14, 2024</a>.</p> +</blockquote> +<p>Overall we raised from our investors approximately $370,000 for a small share of the company to allow the project team working full time for almost two years, funding product design and development, infrastructure, and also <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the security assessment by Trail of Bits</a>. A large part of this money is not spent yet.</p> +<p>The project was hugely supported by the users as well - collectively, <a href="https://github.com/simplex-chat/simplex-chat#help-us-with-donations">you donated</a> over $25,000. Without these donations the investment we raised would not be possible, because we believe that voluntary user donations can sustain the project in the long term – it already covers all infrastructure costs. There are only two ways an Internet service can exist - either users are paying for it, or the users data becomes the product for the real customers, as happened with many large Internet companies. In the latter case the users are losing much more money than they are saving by giving away their privacy and the rights to the content they create on the centralized platforms.</p> +<p>Going forward we plan to keep the basic usage of the platform free, and at the same time we will be providing the benefits to the project sponsors. For example, there will be additional app icons and user profile badges. There also will be higher file transfer limits – currently we don't limit it at all, only limiting the file size, but it's unlikely to be sustainable. In any case, the app will remain highly usable for everyone for free, and fully open-source. Several other apps are already being developed based on our app core, leading to a fully decentralized network.</p> +<h3 id="what-is-next" tabindex="-1">What is next?</h3> +<p>Our goals for the next 1-2 years are to make the messaging network:</p> +<ul> +<li>more reliable and resilient, by adding redundancy into the message delivery and delivery receipts,</li> +<li>more private, by automating rotation of the servers used to deliver messages and by adding delivery relays to better protect IP addresses of the users,</li> +<li>more usable by adding and improving the functions users are expecting in messengers, and also adding some unique functions, like we did with <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">incognito mode</a>, <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#live-messages">live messages</a> and <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">hidden profiles</a>.</li> +</ul> +<p>One major initiative we will kick-off this year is the support for large, fully decentralized and private communities and groups not hosted on any servers – something that no Internet platform achieved so far in as private and efficient way as we plan to build it.</p> +<p>To accelerate product development and growth we will be raising a seed funding this year, both from the VCs and angel investors, and we also might offer our users an opportunity to participate in the crowd funding round on the same terms as other investors, allowing to both support the project and to benefit from its future growth. <a href="https://simplex.chat/#join-simplex">Subscribe to our updates</a> not to miss it, connect to the team in SimpleX Chat and <a href="https://github.com/simplex-chat/simplex-chat#join-user-groups">join users' groups</a>.</p> +<h2 id="whats-new-in-v50" tabindex="-1">What's new in v5.0</h2> +<h3 id="send-videos-and-files-up-to-1gb" tabindex="-1">Send videos and files up to 1gb!</h3> +<img src="https://simplex.chat/blog/images/20230422-video.png" width="288" class="float-to-left" /> +<p>In the beginning of March <a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html">we released servers and command-line utility to send and receive files via XFTP protocol</a> - a very private and secure protocol that sends end-to-end encrypted files in chunks, protecting meta-data better than any alternatives we know of.</p> +<p>Now this protocol is fully integrated in SimpleX Chat, and all files except small voice messages are sent using this protocol (small voice messages are sent as usual messages). Not only it is much faster than before - with the fast Internet connection I can send 25Mb file in 3 seconds and 1gb file in 2 minutes (for most users it's capped at the available Internet bandwidth), it has two other major advantages making it more usable:</p> +<ul> +<li>the file sent to a group has to be uploaded only once, regardless of the group size.</li> +<li>once the file is uploaded (it will have the tick), you no longer need to be online for your contact (or group members) to be able to receive it.</li> +</ul> +<p>As for the metadata privacy, it has similar guarantee to SimpleX Messaging Protocol. The files are sent via TLS 1.2/1.3, with the same server identity verification, TLS channel binding and upload authorization as used with SMP servers. But the file metadata is protected even if TLS is compromised, as there are no identifiers and ciphertext in common in server received and sent traffic, allowing to correlate only by sending and receiving time. Correlating by time becomes less efficient as the server traffic grows.</p> +<p>We also added the ability to send videos in the chat, so they can be played right in the conversation or on full screen without leaving the app – thanks to the efficient and fast file transfer they are very usable.</p> +<p>We also plan to add support for longer and higher quality voice messages, and also for sending full resolution images in the next versions.</p> +<h3 id="app-passcode" tabindex="-1">App passcode</h3> +<p><img src="https://simplex.chat/blog/images/20230422-passcode1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230422-passcode2.png" width="288" /></p> +<p>While we do think that app passcode does not increase security too much, compared with device passcode or biometric protection, there are cases when it may be preferable, and also many users really wanted that it is added.</p> +<p>Now you can choose whether to use faster and more convenient system biometric authentication or to use a separate app passcode. You can choose which one to use when it is first offered, or switch later in the settings.</p> +<h3 id="networking-improvements" tabindex="-1">Networking improvements</h3> +<img src="https://simplex.chat/blog/images/20230422-socks.png" width="288" class="float-to-left" /> +<p>Two small improvements to the app networking capabilities were added in this version.</p> +<p>Firstly, you can now make your self-hosted servers available on IPv6 addresses, and the app supports them as well. Please bear in mind that older clients won't be able to connect to you if you use IPv6 address, and also that some ISPs do not provide IPv6 addresses to their users, in which case they would also not be able to connect if IPv6 address is used. To allow connections in these cases you should make your servers available on some domain name that resolves to both IPv4 and IPv6 addresses, and use this domain name in the server address.</p> +<p>Secondly, Android client now supports configuring host and port of the SOCKS proxy, allowing to use apps other than Orbot and also to run SOCKS proxy in the local network, to save mobile device battery.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 22 Apr 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html + + + SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. + https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html + <h1 id="simplex-chat-v46-with-hidden-profiles-community-moderation-improved-audiovideo-calls-and-reduced-battery-usage" tabindex="-1">SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage.</h1> +<p><strong>Published:</strong> Mar 28, 2023</p> +<h2 id="whats-new-in-v46" tabindex="-1">What's new in v4.6</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#armv7a-32-bit-and-android-8-support">ARMv7a and Android 8+ support</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#hidden-chat-profiles">hidden chat profiles</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#group--community-moderation">group / community moderation</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#group-welcome-message">group welcome message</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#improved-audiovideo-calls">improved audio/video calls</a></li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#reduced-battery-usage">reduced battery usage</a>.</li> +<li><a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#smp-server-monitoring">SMP server monitoring: status bot and page</a></li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html#chinese-and-spanish-interface---you-can-choose-the-language-via-the-app">Chinese and Spanish interface languages</a>, thanks to the users' community and Weblate!</p> +<h3 id="armv7a-32-bit-and-android-8-support" tabindex="-1">ARMv7a (32 bit) and Android 8+ support!</h3> +<p>It increases the number of supported Android devices twice - now most of your friends should be able to install SimpleX Chat. SimpleX Chat still doesn't support Android 7 and erlier versions.</p> +<p>If you install the app from GitHub or F-Droid you need to choose the correct APK, Play Store will provide it automatically.</p> +<h3 id="hidden-chat-profiles" tabindex="-1">Hidden chat profiles</h3> +<p><img src="https://simplex.chat/blog/images/20230328-hidden-profiles1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230328-hidden-profiles2.png" width="288" />    <img src="https://simplex.chat/blog/images/20230328-hidden-profiles3.png" width="288" /></p> +<p>For a long time the main way to protect SimpleX Chat app from people who have access to your phone was device authentication - it is requested when you open the app (and some of its sensitive functions).</p> +<p>Many users asked to allow setting the app password or PIN independently from the device PIN, as some other apps do. But it did not seem a good enough solution - if somebody has your device PIN, then in most cases they can also ask you to provide the app PIN as well.</p> +<p>So instead of having an app password, that reduces convenience and doesn't improve security too much, we did what we think could be better. You can now create hidden chat profiles, that are not visible anywhere in the app, and do not show any notifications, until you enter a correct passphrase. If multiple profiles are hidden with the same passphrase they will all show in the list when you enter it.</p> +<p>It's important to remember that these hidden profiles are still stored locally on your device, so if somebody has access to your chat database (they need to know database passphrase, that is independent from device PIN or profile passphrases) or to chat console in the app, they will be able to access these profiles data and reset their passwords. We are considering how chat console can be better protected - e.g., by requiring a separate password or by providing an option to remove it from the UI permanently - tell us what you think.</p> +<h3 id="group-community-moderation" tabindex="-1">Group / Community moderation</h3> +<p>Initially we did not design SimpleX Chat to support communities - our focus has always been maximum privacy and security.</p> +<p>SimpleX Chat supports small and fully decentralized groups, that are not hosted anywhere. But many users want to participate in and to discover communities. Since we added support for group links, the groups we created to let users test the app started to grow, and many other communities of over 100 people emerged.</p> +<p>We are already observing some less-than-friendly messages and undesirable content that is not welcome in some communities. So this version adds features allowing to moderate groups.</p> +<p>Firstly, group admins and owners can revoke members rights to send messages to the group by assigning members an &quot;observer&quot; role, and also make this role default for users joining via a group link.</p> +<p>Secondly, group admins can now delete messages sent by other members (excluding the messages sent by the group owners). &quot;Moderate&quot; action in the message menu will either mark the message as deleted or delete it irreversibly for all members, as set in group preferences by the owners.</p> +<p>These features will allow group owners to decide their own rules. More robust moderation tools are coming later when we build support for large communities.</p> +<h3 id="group-welcome-message" tabindex="-1">Group welcome message</h3> +<p>Group owners can now set a welcome message that will be shown to new members when they join the group via a group link.</p> +<h3 id="improved-audiovideo-calls" tabindex="-1">Improved audio/video calls</h3> +<img src="https://simplex.chat/blog/images/20230328-call2.png" width="288" /> +<p>Prior to this version audio and video calls in iOS app were very limited – they only worked while the app was in foreground. This version fully re-implemented audio/video calls in iOS – it now uses native WebRTC library instead of web view. These calls are still end-to-end encrypted, and compatible with the calls in the previous versions of the app, both on iOS and on Android platforms.</p> +<p>Where allowed by App Store policy, the calls on iOS now use Apple's native interface for calls CallKit, that allows to accept calls from the lock screen, prevents call interruption by incoming phone calls and optionally allows to include calls in the phone call history - the last option needs to be enabled separately.</p> +<p>Calls on Android were also improved – they now support bluetooth headphones, allow changing volume in video calls and support proximity sensor during the audio call, to prevent accidental interruption when you hold the phone close to your ear.</p> +<h3 id="reduced-battery-usage" tabindex="-1">Reduced battery usage</h3> +<p>We know that battery usage of SimpleX Chat is suboptimal, and we are committed to reduce it. Unfortunately, there is no simple change that we could make to solve this problem, it requires many systematic improvements and fixes.</p> +<p>One of the big issues, particularly in large groups, was inefficient retry strategy for sending messages in cases when the receiving message queue (mailbox) was out of capacity.</p> +<p>This version increases the maximum retry period for &quot;out-of-capacity&quot; scenario to 1 hour, and also preserves this retry period in the database. So, if previously before the message expired in 48 hours there were up to ~2800 delivery attempts and up to ~45Mb wasted traffic per recipient (depending on how frequently the app was restarted), now there will be only ~50 retries, resulting in not more than 0.8Mb of traffic - up to 56x traffic reduction when sending messages to the large groups.</p> +<p>This issue might not have affected you at all, and also solving it won't reduce overall traffic/battery usage by that factor - there are other inefficiences we will be addressing. But if you actively sent messages to large groups you should observe a substantial reduction of battery and traffic consumption.</p> +<p>Please share your experience. If the battery usage is still suboptimal, please share your usage statistics - they can be requested in chat console with <code>/get stats</code> command - it will return the aggregated number of network operations, per server, since the app was started. Please note that these statistics include the addresses of the servers you connect to, so if you want to keep them private, please redact them. You can also reset usage statistics with <code>/reset stats</code> command.</p> +<h3 id="smp-server-monitoring" tabindex="-1">SMP server monitoring</h3> +<p>If you use preset servers in SimpleX Chat you can now see when we do any maintenance or when the server is down either by <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FShQuD-rPokbDvkyotKx5NwM8P3oUXHxA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA6fSx1k9zrOmF0BJpCaTarZvnZpMTAVQhd3RkDQ35KT0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion">connecting to status bot via the app</a> or by visiting a <a href="https://status.simplex.chat/">status page</a>. Status bot always sends automatic messages before the server is restarted for maintenance, but in case of downtime if the same server is down that you use to receive the messages from the bot, you may miss them - check the status page in this case.</p> +<h3 id="chinese-and-spanish-interface-you-can-choose-the-language-via-the-app" tabindex="-1">Chinese and Spanish interface - you can choose the language via the app!</h3> +<p>Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Chinese and Spanish and more are in progress.</p> +<p>You can <a href="https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps">contribute the translation</a> of the apps to your language too!</p> +<p>The app now supports 8 languages in addition to English - Czech, German, Spanish, French, Italian, Dutch, Russian and Chinese. You can now choose the language via the app settings (Appearance page), independently from the system settings.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment</a>.</p> +<p><a href="https://simplex.chat/#how-simplex-works">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/#why-ids-bad-for-privacy">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Visit our <a href="https://simplex.chat/">website</a> to learn more.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 28 Mar 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230328-simplex-chat-v4-6-hidden-profiles.html + + + SimpleX File Transfer Protocol - a new protocol for sending large files efficiently, privately and securely. + https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html + <h1 id="simplex-file-transfer-protocol-a-new-protocol-for-sending-large-files-efficiently-privately-and-securely" tabindex="-1">SimpleX File Transfer Protocol – a new protocol for sending large files efficiently, privately and securely.</h1> +<p><strong>Published:</strong> Mar 1, 2023</p> +<ul> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#%E2%9A%A1%EF%B8%8F-quick-start-send-a-file-with-xftp-cli-in-3-simple-steps">Quick start: how to send a file using XFTP CLI</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#whats-the-problem">What's the problem</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#why-didnt-we-just-use-some-existing-solution">Why didn't we just use some existing solution?</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#what-is-xftp-and-how-does-it-work">What is XFTP and how does it work?</a></li> +<li><a href="https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html#what-is-next">What is next?</a></li> +</ul> +<h2 id="quick-start-send-a-file-with-xftp-cli-in-3-simple-steps" tabindex="-1">⚡️ Quick start: send a file with XFTP CLI in 3 simple steps</h2> +<p>Download XFTP binary for Linux from <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v5.0.0-beta.3">the release</a> – you need the file <code>xftp-ubuntu-20_04-x86-64</code> - rename it as <code>xftp</code>.</p> +<p><strong>Step 1</strong>: To send the file:</p> +<pre><code class="language-bash">xftp send filename.ext +</code></pre> +<p>You can also send the file that can be received by multiple recipients using <code>-n</code> option:</p> +<pre><code class="language-bash">xftp send filename.ext -n 10 +</code></pre> +<p><strong>Step 2</strong>: Pass file description(s) (files <code>rcvN.xftp</code>) to the recipient(s) securely, e.g. send it as a file via SimpleX Chat.</p> +<p><strong>Step 3</strong>: To receive the file:</p> +<pre><code class="language-bash">xftp recv rcvN.xftp +</code></pre> +<p>The sender also delete all file chunks from the relays before they expire in 48 hours with this command:</p> +<pre><code class="language-bash">xftp del ./filename.ext/snd.xftp.private +</code></pre> +<br /> +<h2 id="whats-the-problem" tabindex="-1">What's the problem?</h2> +<p>If you are using SimpleX Chat apps you know that support of sending files and images is not very good, and sending videos and large files is simply impossible. There are currently these problems:</p> +<ul> +<li>the sender has to be online for file transfer to complete, once it was confirmed by the recipient.</li> +<li>when the file is sent to the group, the sender will have to transfer it separately to each member, creating a lot of traffic.</li> +<li>the file transfer is slow, as it is sent in small chunks - approximately 16kb per message.</li> +</ul> +<p>As a result, we limited the supported size of files in the app to 8mb. Even for supported files, it is quite inefficient for sending any files to large groups.</p> +<h2 id="why-didnt-we-just-use-some-existing-solution" tabindex="-1">Why didn't we just use some existing solution?</h2> +<p>We really hoped to find some existing open-source solution that we could integrate with SimpleX Chat.</p> +<p>We decided not to use torrent-like or any other P2P solutions because of their lack of privacy, challenging legality in some jurisdictions and, in many cases, because they are inefficient in groups.</p> +<p>We reviewed several S3-compatible solutions (e.g., <a href="https://github.com/minio/minio">minio</a>, <a href="https://git.deuxfleurs.fr/Deuxfleurs/garage">garage</a>, <a href="https://github.com/seaweedfs/seaweedfs">SeaweedFS</a>), but they all require the development of a separate service layer, making them unusable as standalone services and harder to deploy for the users who want to self-host the file transfer service. As a side note, the solution that we developed can still be composed with S3-compatible storage for higher capacity servers with some privacy/efficiency trade-offs.</p> +<p>We also looked at a few independent implementations of file sharing, with some ad-hoc protocols (e.g., <a href="https://github.com/ceph/ceph">ceph</a> and <a href="https://framagit.org/fiat-tux/hat-softwares/lufi">lufi</a>), but neither seemed sufficiently mature, and also not as private as we would like.</p> +<p>So after a lot of searching we decided to design and implement a new protocol for file transfers, that both solved the problems above, and provided a higher level of metadata privacy than any other file transfer solution has.</p> +<h2 id="what-is-xftp-and-how-does-it-work" tabindex="-1">What is XFTP and how does it work?</h2> +<pre><code> Sender Internet XFTP relays Internet Recipient +---------------------------- | ----------------- | ------------------- | ------------ | ---------- + | | | | + | | (can be self-hosted) | | + | | +---------+ | | + chunk 1 ----- HTTP2 over TLS ------ | XFTP | ---- HTTP2 / TLS ----- chunk 1 + |---&gt; SimpleX File Transfer Protocol (XFTP) --&gt; | Relay | ---&gt; XFTP -------------&gt;| + | --------------------------- +---------+ ---------------------- | + | | | | | | + | | | | | v + +----------+ | | +---------+ | | +-------------+ + | Sending | ch. 2 ------- HTTP2 / TLS ------- | XFTP | ---- HTTP2 / TLS ---- ch. 2 | Receiving | +file ---&gt; | XFTP | ------&gt; XFTP ----&gt; | Relay | ---&gt; XFTP ------&gt; | XFTP | ---&gt; file + | Client | --------------------------- +---------+ ---------------------- | Client | + +----------+ | | | | +-------------+ + | | | | | ^ + | | | +---------+ | | | + | ------- HTTP2 / TLS ------- | XFTP | ---- HTTP2 / TLS ---- | + |-------------&gt; XFTP ----&gt; | Relay | ---&gt; XFTP -------------&gt;| + chunk N --------------------------- +---------+ --------------------- chunk N + | | (store file chunks) | | + | | | | + | | | | +</code></pre> +<p>XFTP stands for SimpleX File Transfer Protocol. Its design is based on the same ideas and has some of the qualities of SimpleX Messaging Protocol, that is used in SimpleX Chat:</p> +<ul> +<li>recipient cannot see sender's IP address, as the file fragments (chunks) are temporarily stored on multiple XFTP relays.</li> +<li>file can be sent asynchronously, without requiring the sender to be online for file to be received.</li> +<li>there is no network of peers that can observe this transfer - sender chooses which XFTP relays to use, and can self-host their own.</li> +<li>XFTP relays do not have any file metadata - they only see individual chunks, with access to each chunk authorized with anonymous credentials (using Edwards curve cryptographic signature) that are random per chunk.</li> +<li>chunks have one of the sizes allowed by the servers - currently we allow 256kb, 1mb and 4mb chunks, so if you send, say 1gb file, to XFTP relays it will look indistinguishable from sending many small files, and they would only know that chunks are sent by the same user only via the transport information, but none of the relays will see all chunks. Also, once this feature is available in mobile apps you can use transport isolation per chunk, when each file fragment will be uploaded via a separate TCP connection (and Tor circuit, if you use Tor) – the CLI we released does not yet support per-chunk transport isolation.</li> +<li>each chunk can be downloaded by multiple recipients, but each recipient uses their own key and chunk ID to authorize access, and the chunk is encrypted by a different key agreed via ephemeral DH keys (NaCl crypto_box (SalsaX20Poly1305 authenticated encryption scheme ) with shared secret derived from Curve25519 key exchange) on the way from the server to each recipient. XFTP protocol as a result has the same quality as SMP protocol - there are no identifiers and ciphertext in common between sent and received traffic inside TLS connection, so even if TLS is compromised, it complicates traffic correlation attacks.</li> +<li>XFTP protocol also supports redundancy - each file chunk can be sent via multiple relays, and the recipient can choose the one that is available. The released CLI does not support redundancy though.</li> +<li>the file as a whole is encrypted with a random symmetric key using NaCl secret_box.</li> +</ul> +<p>So, how would any recipient know where to get all these file fragments from and how to put them back together into the original file? Normally, when you send a file via any file-sharing service it provides you a link that you can pass to the recipient. The link allows to download the original file, but it also provides the server a lot of file meta-data, that often includes file name and exact size, and in many cases the server also has access to a file content.</p> +<p>Instead of using a link, XFTP protocol includes a special format for a &quot;file description&quot; - it is a small text file containing the locations, access keys and digests for all file chunks, and also the encryption key and digest (SHA512) for the whole file. This file description does not contain the original file name or exact file size, so if it is used after the file fragments are expired or removed from XFTP relays, this information is not accessible.</p> +<p>CLI generates a separate file description for each intended recipient - you need to specify how many people you want to be able to receive this file. You can specify a larger number of recipients to avoid revealing the real number of recipients from XFTP relays. Mobile apps, when this protocol is integrated, will do it automatically, choosing some large random number of possible recipients, so while the relays will be able to observe how many people time the file was downloaded, they won't know how many intended recipients you had - sending to a group of 10 people and to 1 recipient can look the same to the relays.</p> +<p>File description is a security-sensitive file that contains private keys and chunk addresses necessary to receive the whole file, and also a symmetric key to decrypt the file. Therefore you must use a secure channel to send file description - e.g., it can be sent via SimpleX Chat. But once the recipient downloaded the file, CLI invalidates the file fragment addresses on relays and the same file description cannot be used again to download the file.</p> +<h2 id="what-is-next" tabindex="-1">What is next?</h2> +<p>We released and deployed several XFTP relays for you to experiment with (they are hardcoded in the XFTP CLI), and you can deploy your own relays either from <a href="https://github.com/simplex-chat/simplexmq/releases/tag/v5.0.0-beta.3">downloadable binary</a> or by compiling <a href="https://github.com/simplex-chat/simplexmq">the source code</a>. We also released XFTP CLI - it is available in the same release.</p> +<p>We are currently integrating support for sending large files using XFTP protocol into SimpleX Chat clients. SimpleX Chat v5.0 will have support for receiving files sent via XFTP protocol (you will be able to send a file description via a SimpleX Chat CLI app, so that mobile apps will be able to receive them as normal files, only much faster), and v5.1 will fully support for sending large files (up to 1gb) in the mobile apps.</p> +<p>We will also publish a formal specification for XFTP protocol and overview of its security qualities and threat model. For now you can learn more about the protocol design and motivations from this internal <a href="https://github.com/simplex-chat/simplexmq/blob/stable/rfcs/2022-12-26-simplex-file-transfer.md">XFTP protocol RFC</a>.</p> +<p>Using and sending files with the available XFTP CLI will hugely help us stabilizing both the protocol and implementations. What we really like about this design is that it is completely independent from SimpleX Chat - you can use it on its own, sending files and passing file descriptions to your contacts via any other messenger - e.g. via Signal, – without this messenger being able to observe that you are in fact sending a large file.</p> +<p>We did not yet decide whether we will be making a separate security audit of XFTP implementation, or if we combine it with the next security audit of SimpleX Chat. The latter seems more likely, as XFTP uses the same cryptographic primitives that were reviewed during <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">SimpleX Chat security assessment by Trail of Bits</a> in November 2022.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Wed, 01 Mar 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html + + + SimpleX Chat v4.5 released – with multiple chat profiles, message draft, transport isolation and Italian language! + https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html + <h1 id="simplex-chat-v45-released-with-multiple-user-profiles-message-draft-transport-isolation-and-italian-interface" tabindex="-1">SimpleX Chat v4.5 released – with multiple user profiles, message draft, transport isolation and Italian interface!</h1> +<p><strong>Published:</strong> Feb 4, 2023</p> +<h2 id="whats-new-in-v45" tabindex="-1">What's new in v4.5</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#multiple-chat-profiles">multiple chat profiles</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#message-draft">message draft</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation">transport isolation</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#reduced-battery-usage">reduced battery usage</a>.</li> +<li><a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#private-filenames">private filenames</a>.</li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#italian-interface">Italian interface</a>, thanks to the users' community and Weblate!</p> +<h3 id="multiple-chat-profiles" tabindex="-1">Multiple chat profiles</h3> +<p><img src="https://simplex.chat/blog/images/20230204-profiles1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230204-profiles2.png" width="288" /></p> +<p>Incognito mode added in v3.2 allows to share a random profile name with your new contacts. It is quite popular - more than half of users connecting to our support profile use it. In case when you just want a throw-away profile name that doesn't share any information about you it is more convenient that creating a new profile for each contact manually.</p> +<p>But there are many cases when a disposable profile is not good enough enough, and you want to create separate profiles - one for your family, another for work, yet one more for your online contacts that only know your pseudonym rather than your real name.</p> +<p>Previously this was only possible by using separate chat databases. This version adds a chat profile manager that allows you to create unlimited number of profiles, and very quickly switch them. All these profiles are connected at the same time.</p> +<p>When you delete profile you no longer need you have two options - either delete both profile data on the device and any message queues that this profile created on SMP servers (e.g., when it is more important to leave as few meta-data on the servers), or delete only profile data without making any network requests (when it is more important to delete all data from the device quickly).</p> +<p>While most app settings apply to all profiles, several settings are profile-specific.</p> +<p>You can separately set which SMP servers are used to create the new contacts in each profile (via Network settings). Please note: changing SMP servers in one profile won't affect other profiles, and all new profiles are created with preset servers.</p> +<p>You can also separately set the retention time for messages in each profile (via Database settings).</p> +<p>Also, you have a different contact address in each profile, and different Chat preferences.</p> +<p>All other settings are used for all profiles. While you may want to have different settings for different security levels, it is much better to use different devices in this case.</p> +<h3 id="message-draft" tabindex="-1">Message draft</h3> +<p><img src="https://simplex.chat/blog/images/20230204-draft1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230204-draft2.png" width="288" /></p> +<p>Previously, if you've closed the conversation with unsent message, this message was disappearing. While it might be better for privacy, there are several scenarios when it is very inconvenient:</p> +<ul> +<li>you need to compose the message from several parts that you copy from other conversations.</li> +<li>some messages arrives that you need to answer urgently, so you can leave unfinished message to return to it later.</li> +</ul> +<p>Both are now possible - the message you wrote, together with any attachments, and even a voice message you recorded, will remain available as draft until you either close the app or leave another message unfinished - while you can send the message in another chat without losing the current draft, there can be only one draft at a time.</p> +<h3 id="transport-isolation" tabindex="-1">Transport isolation</h3> +<img src="https://simplex.chat/blog/images/20230204-transport.png" width="288" /> +<p>Even when you create different chat profiles you are still connecting to your contacts via the same device. Transport isolation, by default, makes connections belonging to the same profile use different TCP sessions, so while the server sees the same IP address, it doesn't see it as the same client connection. If you are connecting via Tor using SOCKS proxy (e.g. Orbot app on Android) not only the app will use different TCP sessions, it will also use separate Tor circuits for connections from different profiles, preventing the servers and network observers seeing this as traffic coming from the same device.</p> +<p>There is an additional BETA option to use a separate transport connection for each contact and group member connection you have – it is available in Network settings if you enable dev tools. In case you have a large number of contacts or participate in large groups across all profiles in the app, you should not use this option, as it may create a lot of traffic and also can exceed the quota for TCP sockets. Also creating a lot of separate Tor circuits can be slow. We will be testing at which number of connections this option starts failing and by the time it's available without dev tools we will add some limits.</p> +<h3 id="reduced-battery-usage" tabindex="-1">Reduced battery usage</h3> +<p>Battery usage is one of the biggest complaints of SimpleX Chat users. The main reason for excess traffic is inefficient retry strategies for Network operations in these cases:</p> +<ul> +<li>the message queue capacity is exceeded - the app will keep retrying to send the message until there will be capacity.</li> +<li>the server is not available, e.g. if you connect to somebody via their server, and they later disable it. This case creates much less extra traffic than the first.</li> +</ul> +<p>This version makes retries for exceeded queue capacity 10x less frequent and adds SMP protocol extension that will allow to reduce retries even further by the next version. It works in the following way:</p> +<ul> +<li>when the sender encounters &quot;queue quota exceeded&quot; error, the sender stops trying to send the message.</li> +<li>the server also takes note of that error.</li> +<li>once recipient receives all messages from this queue, the server will notify the recipient that the sender had &quot;queue quota exceeded&quot; error.</li> +<li>the recipient will then send a special message to the sender client to instruct it that it can resume delivery.</li> +<li>the sender can still occasionally try sending the message, e.g. once every hours, but it won't need to retry once every few minutes as it does now.</li> +</ul> +<p>Reducing battery usage is our big priority - we expect to reduce it by at least 2-3x in the next few months.</p> +<h3 id="private-filenames" tabindex="-1">Private filenames</h3> +<p>When you send an image or voice message they are sent as files with filenames including timestamp. We didn't see it as a problem, as files are sent together with the message, and messages have server-side timestamps anyway. But the users pointed out that the timestamp we used was in the local timezone, and therefore leaked the country (or continent) where the user is located. A simple workaround was to reset timezone to UTC, and that is what most users who need to protect their location do anyway. But this version resolves it - these filenames now include UTC timezones – no workarounds are needed.</p> +<h3 id="italian-interface" tabindex="-1">Italian interface</h3> +<p>Thanks to our users' community and to Weblate providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds Italian and many more is in progress - Chinese, Japanese, Czech, Dutch, etc.</p> +<p>You can <a href="https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps">contribute the translation</a> of the apps to your language too!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/tree/master#help-us-with-donations">this section</a> for the ways to donate.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 04 Feb 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html + + + SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language! + https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html + <h1 id="simplex-chat-v44-released-with-disappearing-messages-live-messages-connection-security-verification-and-french-language" tabindex="-1">SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language!</h1> +<p><strong>Published:</strong> Jan 3, 2023</p> +<h2 id="whats-new-in-v44" tabindex="-1">What's new in v4.4</h2> +<ul> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#disappearing-messages">disappearing messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#live-messages">&quot;live&quot; messages</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#connection-security-verification">connection security verification</a>.</li> +<li><a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#animated-images-and-stickers">animated images and stickers</a> – now on iOS too.</li> +</ul> +<p>Also, we added <a href="https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html#french-language-interface">French language interface</a>, thanks to the users' community and Weblate!</p> +<h3 id="disappearing-messages" tabindex="-1">Disappearing messages</h3> +<p><img src="https://simplex.chat/blog/images/20230103-disappearing1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230103-disappearing2.png" width="288" /></p> +<p>It is now possible to send the messages that will be deleted from both sender and recipient device after set time – for the sender from the time they were sent, and for the recipient - from the time they were read.</p> +<p>Unlike in most other messengers, it requires agreement of both sides, not just the sender decision. I <a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">wrote previously</a> why we believe it is wrong to allow the senders to delete their messages without recipient consent, and the same logic applies here – if you want to send the message that will disappear after some time, your contact should be ok with that too.</p> +<p>In group conversations disappearing messages can be enabled by the group owners, by default they are disabled.</p> +<h3 id="live-messages" tabindex="-1">&quot;Live&quot; messages</h3> +<img src="https://simplex.chat/blog/images/20230103-live.png" width="288" /> +<p>Pressing &quot;bolt&quot; button before you start typing the message will start a &quot;live&quot; message. Now, as you type it, it will be updated for all recipients every several seconds, including only complete words. To finish the message you need to press &quot;checkmark&quot; button.</p> +<p>You can also start a live message after you started typing or after you chose the image – long-press send button and then press &quot;Send live message&quot;.</p> +<h3 id="connection-security-verification" tabindex="-1">Connection security verification</h3> +<img src="https://simplex.chat/blog/images/20230103-verification.png" width="288" /> +<p>SimpleX Chat design prevents the possibility of messaging servers substituting the key during the initial connection (man-in-the-middle attack) by requiring that the invitation link is passed via another channel. I wrote more about how MITM attack works in <a href="https://www.poberezkin.com/posts/2022-12-07-why-privacy-needs-to-be-redefined.html">this post</a>. But this other channel, however unlikely, could still have been compromised by an attacker to replace the invitation link you sent. That is the reason why we recommend sharing QR code in a video call – this is very complex for an attacker to replace it in this case.</p> +<p>This new feature allows you to verify, via yet another channel, that the connection is secure and the keys were not replaced. You can either scan the security code from your contact's app, or compare codes visually, or even read it in a voice call – if your and your contact's app have the same security code for each other then the connection is secure.</p> +<p>If you are sending direct messages to some group members then it might also be important to verify security of these connections, as in this case the invitations were exchanged via the member who added you or another member, and if this member's client was modified, they could have replaced the keys and the addresses, and intercept the entire conversation.</p> +<p>Regardless how connection is established, verifying the connection proves its security. Technically, this security code is the hash of associated data used in the end-to-end encryption, which in turn is taken by combining public keys from the initial key exchange.</p> +<h3 id="animated-images-and-stickers" tabindex="-1">Animated images and stickers</h3> +<p><img src="https://simplex.chat/blog/images/20230103-stickers1.png" width="288" />    <img src="https://simplex.chat/blog/images/20230103-stickers2.png" width="303" /></p> +<p>Android app supported GIFs and stickers for some time, now you can view and send them from iOS app as well, e.g. using GIPHY keyboard - you no longer need to choose between privacy and stickers. Just bear in mind, that third party keyboards can be insecure, so you should not be using them for typing sensitive information.</p> +<h3 id="french-language-interface" tabindex="-1">French language interface</h3> +<p>Thanks to our users' community and to <a href="https://weblate.org/en-gb/">Weblate</a> kindly providing a free hosting plan for SimpleX Chat translations we can now support more languages in the interface – this version adds French.</p> +<p>Please get in touch if you want to translate the interface into your language!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat#privacy-and-security-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see our <a href="https://simplex.chat/">website</a>.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in crypto-currencies.</li> +<li>Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt - Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>BCH address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2</li> +<li>please let us know, via GitHub issue or chat, if you want to create a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 03 Jan 2023 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20230103-simplex-chat-v4.4-disappearing-messages.html + + + SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. + https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html + <h1 id="simplex-chat-reviews-and-v43-released-with-instant-voice-messages-irreversible-deletion-of-sent-messages-and-improved-server-configuration" tabindex="-1">SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration.</h1> +<p><strong>Published:</strong> Dec 6, 2022</p> +<h2 id="simplex-chat-reviews" tabindex="-1">SimpleX Chat reviews</h2> +<p>Since we published <a href="https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html">the security assessment of SimpleX Chat</a> completed by Trail of Bits in November, several sites published the reviews and included it in their recommendations:</p> +<ul> +<li>Privacy Guides added SimpleX Chat to <a href="https://www.privacyguides.org/real-time-communication/#simplex-chat">the recommended private and secure messengers</a>.</li> +<li>Mike Kuketz – a well-known security expert – published <a href="https://www.kuketz-blog.de/simplex-eindruecke-vom-messenger-ohne-identifier/">the review of SimpleX Chat</a> and added it to <a href="https://www.messenger-matrix.de/">the messenger matrix</a>.</li> +<li>Supernova published <a href="https://supernovas.space/detailed_reviews.html#simplex">the review</a> and increased <a href="https://supernovas.space/messengers.html">SimpleX Chat recommendation ratings</a>.</li> +</ul> +<h2 id="whats-new-in-v43" tabindex="-1">What's new in v4.3</h2> +<ul> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#instant-voice-messages">instant voice messages!</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#irreversible-message-deletion">irreversible deletion of sent messages for all recipients</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#smp-servers-configuration-and-password">improved SMP server configuration and support for server passwords</a></li> +<li><a href="https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html#privacy-and-security-improvements">privacy and security improvements</a>: +<ul> +<li>protect app screen in recent apps and prevent screenshots</li> +<li>improved privacy and security of SimpleX invitation links in the app</li> +<li>optional Android app data backup</li> +<li>optionally allow direct messages between group members</li> +</ul> +</li> +</ul> +<h3 id="instant-voice-messages" tabindex="-1">Instant voice messages</h3> +<img src="https://simplex.chat/blog/images/20221206-voice.png" width="288" /> +<p>Voice messages, unlike normal files, are sent instantly, in the existing connection with your contact and without acceptance from the recipient. For this reason we limited the size of voice messages to ~92.5kb (an equivalent of 6 messages), that limits the duration to 30 seconds on iOS and to ~42 seconds on Android (the size is different because of different encoders), with an average sound quality. The voice messages are sent in MP4AAC format that is natively supported both on iOS and on Android, and you can play voice message files outside of SimpleX Chat app.</p> +<p>Users who do not want to receive voice messages can disable them, either globally, for all contacts, or for each contact independently. Please note that the global preference change will only affect the contacts where you shared your main profile (not incognito contacts) and where you didn't change the preference for the particular contact. Groups have a separate policy that allows disabling voice messages for all members (they are allowed by default). The owner can set this policy when creating a group or later, via Group preferences page.</p> +<h3 id="irreversible-message-deletion" tabindex="-1">Irreversible message deletion</h3> +<p><img src="https://simplex.chat/blog/images/20221206-deleted1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-deleted2.png" width="288" /></p> +<p>When you receive email, you have full confidence that the sender cannot delete their email from your mailbox after you received it. And it seems correct – in the end, this is your device, and nobody should be able to delete any data from it.</p> +<p>Most existing messengers made an opposite decision – the senders can irreversibly delete their messages from the recipients' devices after they were delivered, whether recipients agree to that or not. And it seems correct too - this is your message, you should be able to delete it, at least for a limited time; that the message is on the recipient device doesn't change your ownership of this message.</p> +<p>While both these statements appear correct, at least to some people, they simply cannot both be correct at the same time, as they contradict each other - either one or both of them must be wrong. This appears to be a very polarising subject, and <a href="https://mastodon.social/@simplex/109461879089268041">the polls</a> <a href="https://www.reddit.com/r/SimpleXChat/comments/zdam11/poll_irreversible_message_deletion_by_sender_what/">I made</a> <a href="https://twitter.com/epoberezkin/status/1599797374389727233">yesterday</a> <a href="https://www.linkedin.com/feed/update/urn:li:activity:7005564342502842368/">show it</a> - the votes are split evenly.</p> +<p>You may want to be able to delete your messages even after they are received to protect your privacy and security, and you want the communication product you use to enforce it. But you may also have many reason to disagree to the deletion of messages on your device for several different reasons:</p> +<ul> +<li>it may be a business context, and either your organisation policy or a compliance requirement is that every message you receive must be preserved for some time.</li> +<li>these messages may contain threat or abuse and you want to keep them as a proof.</li> +<li>you may have paid for the the message (e.g., it can be a consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation.</li> +</ul> +<p>Instead of taking any side in this choice, we decided to allow to change this behaviour either globally or separately for each contact or group. That makes SimpleX Chat unique, being suitable both for the communication contexts where email is traditionally used and in informal or privacy sensitive contexts, that would allow the senders to delete messages irreversibly, provided that the recipients agree to that.</p> +<p>In any case, the senders can never be 100% certain that the message is deleted from the recipient's device - recipient can be running a modified client that does not honour the conversation setting, and there is no way to ascertain which code your contact runs on their device.</p> +<p>If irreversible message deletion is not allowed in the conversation, the senders can still mark their messages as deleted, and it would show &quot;mark deleted&quot; placeholder in the conversation. The recipients can then both reveal the content of the original message and fully delete it on their devices.</p> +<h3 id="smp-servers-configuration-and-password" tabindex="-1">SMP servers configuration and password</h3> +<p><img src="https://simplex.chat/blog/images/20221206-server1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-server2.png" width="288" />    <img src="https://simplex.chat/blog/images/20221206-server3.png" width="288" /></p> +<p>When you self-host your own SMP server you may want to make it public so that anybody can use it to receive messages. But many users want to host their private servers, so that only they and their friends can use them to receive the messages.</p> +<p>v4.0 of SMP server and the new version of the apps adds support for server passwords. It is chosen randomly when you initialize the new server, and if you already have a server you can change it. Anybody can still message you, it doesn't require knowing the password, and the links you share do not include it, but to be able to receive the messages you need to know a server address that includes the password. In a way, it is similar to how basic authentication works in HTTP, and how browsers support the URIs with included credentials.</p> +<p>The new server configuration section now allows to test your servers before you start using them, and you can also share your server address via QR code, so that your friends or your team can use them too, without the need to copy paste the addresses.</p> +<p>You can read how to install and configure SMP servers in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md">this guide</a>.</p> +<h3 id="privacy-and-security-improvements" tabindex="-1">Privacy and security improvements</h3> +<h4 id="protect-app-screen" tabindex="-1">Protect app screen</h4> +<img src="https://simplex.chat/blog/images/20221206-protect.png" width="330" /> +<p>It is now enabled by default, but you can disable it via settings.</p> +<p>iOS app only hides the app screen in the recent apps, Android app in addition to that also prevents the screenshots.</p> +<p>This is not the security measure for the senders, and we made it optional, as the recipient could circumvent it anyway – this is for you to protect your app screen when you give your phone to somebody.</p> +<h4 id="privacy-and-security-of-simplex-invitation-links" tabindex="-1">Privacy and security of SimpleX invitation links</h4> +<p>Previously, when you sent somebody an invitation link, a contact address or a group link, they would take half a screen in the chat and they could open in the browser in some cases. Also, as these links are quire large, it is not easy to see if the page domain is maliciously replaced, what SMP server the connection would go through or what kind of link it is.</p> +<p>This version instead of showing the full link shows a short description, and it replaces a public web address with an internal URI scheme that the app uses (simplex:/) – such links open directly in the app. There is an option to show the full link, if you need it, and even to open it in the browser from the app, but in this case if this link is not using <a href="https://simplex.chat/">https://simplex.chat</a> website it will show as red to highlight it.</p> +<h3 id="optional-android-app-data-backup" tabindex="-1">Optional Android app data backup</h3> +<p>The previous version always backed up app data in the way it was configured by the system. Now you can override it from inside the app, preventing the backup even if it's enabled by the system settings. This version requires disabling it manually, we will make it disabled by default in the next release (v4.3.1).</p> +<h3 id="direct-messages-between-group-members" tabindex="-1">Direct messages between group members</h3> +<p>The new version does not allow them by default, but it can be enabled by group owners in the group settings when the group is created or at any later moment.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see the information on our <a href="https://simplex.chat/">new website</a> - it also answers all these questions.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in many crypto-currencies.</li> +<li>Monero address: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin address: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>Ethereum address: 0x83fd788f7241a2be61780ea9dc72d2151e6843e2</li> +<li>please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 06 Dec 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20221206-simplex-chat-v4.3-voice-messages.html + + + Security assessment by Trail of Bits, the new website and v4.2 released + https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html + <h1 id="security-assessment-by-trail-of-bits-the-new-website-and-v42-released" tabindex="-1">Security assessment by Trail of Bits, the new website and v4.2 released</h1> +<p><strong>Published:</strong> Nov 8, 2022</p> +<h2 id="security-assessment-by-trail-of-bits" tabindex="-1">Security assessment by Trail of Bits</h2> +<img src="https://simplex.chat/blog/images/20221108-trail-of-bits.jpg" width="240" /> +<p>When we first launched the app in March the response on Reddit was: <em>&quot;Have you been audited or should we just ignore you?&quot;</em>.</p> +<p>We have a growing number of enthusiasts using SimpleX Chat who can accept the security risks of unaudited system, but the users who depend on their security were patiently waiting until some independent experts review our codebase.</p> +<p><a href="https://www.trailofbits.com/about">Trail of Bits</a>, a US based security and technology consultancy whose clients include big tech companies, governmental agencies and major blockchain projects, had 2 engineers reviewing SimpleX Chat for one calendar week, specifically <a href="https://github.com/simplex-chat/simplexmq">simplexmq library</a> that is responsible for all cryptography and networking of SimpleX platform.</p> +<p>2 medium and 2 low severity issues were identified, all of which require a high difficulty attack to exploit – the attacker would need to have a privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit them. 3 of these issues are already fixed in v4.2.</p> +<p>In the course of the audit, Trail of Bits assessed the maturity of the <a href="https://github.com/simplex-chat/simplexmq">simplexmq library</a> across eight categories and found five of them to be strong or satisfactory.</p> +<p>Explained below is our understanding of the issues, as well as fixes implemented by the SimpleX Chat team after project completion. The full security review is available via <a href="https://github.com/trailofbits/publications/blob/master/reviews/SimpleXChat.pdf">Trail of Bits publications</a>.</p> +<p>We are hugely thankful to Trail of Bits and their engineers for the work they did, helping us identify these issues and supporting the ongoing efforts to make SimpleX Chat more secure.</p> +<h3 id="medium-severity-issues" tabindex="-1">Medium severity issues</h3> +<h4 id="x3dh-key-exchange-for-double-ratchet-protocol" tabindex="-1">X3DH key exchange for double ratchet protocol</h4> +<p>We made a mistake implementing X3DH key exchange - the key derivation function was not applied to the result of concatenation of three DH operations. The attack to exploit this mistake has high difficulty, as it would require compromising one of private keys generated by the clients, and also it would only affect forward secrecy until break-in recovery happens (after both sides sent some messages).</p> +<p>Please note that SimpleX does not perform X3DH with long-term identity keys, as the SimpleX protocol does not rely on long-term keys to identify client devices. Therefore, the impact of compromising a key will be less severe, as it will affect only the secrets of the connection where the key was compromised.</p> +<p>This issue is fixed in version 4.2 in <a href="https://github.com/simplex-chat/simplexmq/pull/548/files">this PR</a>, and if both clients are updated the key exchange will not have this vulnerability. Also, previously created connections should be secure as long as both sides sent the messages, but if you believe that your private key(s) could have been compromised (for example, if you used SimpleX Chat since before we added database encryption), we recommend that you create the new connections with your contacts, at least with the security-critical ones. Simply rotating the connection queue (manual queue rotation is added in version 4.2) will not be sufficient, as this rotation does not re-initialize the ratchets - this is something we will be adding in the future.</p> +<h4 id="keys-are-stored-in-unpinned-memory-and-not-cleared-after-their-lifetime" tabindex="-1">Keys are stored in unpinned memory and not cleared after their lifetime</h4> +<p>The problem here is that the memory with cryptographic keys can be swapped to the storage and potentially accessed by an attacker who has root-level access to the device (or the level of access required to access swap file of the application). So, if you are running SimpleX Chat on desktop you could improve its security by running it in an isolated container.</p> +<p>In our opinion, on mobile operating systems it is less severe as each application already runs in its own container, and applications do not share access to their swap areas (e.g., on Android swap is a <a href="https://developer.android.com/topic/performance/memory-management">compressed area in RAM</a> not accessible to other applications).</p> +<p>To exploit this issue an attacker needs to have a privileged system access to the device. Also, we believe <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/1993/01/gen-gc-for-haskell.pdf">Haskell generational garbage collection</a> makes the lifetime of unused memory lower than in other languages.</p> +<p>We will be addressing this issue in the near future, possibly by using library <a href="https://hackage.haskell.org/package/secure-memory-0.0.0.2">secure-memory</a> created by Kirill Elagin, an engineer at Serokell, or some other similar approach.</p> +<h3 id="low-severity-issues" tabindex="-1">Low severity issues</h3> +<h4 id="the-string-padding-function-is-incorrect-for-long-messages-and-the-string-unpadding-function-throws-exception-for-short-messages" tabindex="-1">The string padding function is incorrect for long messages, and the string unpadding function throws exception for short messages</h4> +<p>Both these issues are fixed in 4.2 in <a href="https://github.com/simplex-chat/simplexmq/pull/547/files">this PR</a>, with the additional unit tests, and we also validated that even before the fix the strings that would cause such exception were never passed to this function – The SimpleX Chat team could not find the possibility of the attack that would succeed because of this issue.</p> +<h3 id="whats-next" tabindex="-1">What's next</h3> +<p>There are areas of SimpleX Chat that were out of scope of this review, specifically:</p> +<ul> +<li>the chat protocol implementation and mobile UIs, as they includes no cryptography of networking (with the exception of Android app storing encrypted database passphrase and key exchange/encryption for WebRTC calls).</li> +<li>push notifications server that is used by iOS clients.</li> +</ul> +<p>We will be arranging to review these areas separately.</p> +<h2 id="the-new-website" tabindex="-1">The new website</h2> +<p>Our <a href="https://old-website.simplex.chat/">previous website</a> was created 2 years ago to present SimpleX idea, there was no SimpleX Chat at the time - we only had a prototype implementation of SimpleX Messaging Protocol server then.</p> +<p>A lot of people told us that our website didn't explain well enough who SimpleX Chat is for, what problems it solves, and how it is different from the alternatives. So, while we love to be focused on the chat application, we decided to make the new one.</p> +<p>We hope that our <a href="https://simplex.chat/">new website</a> better answers these questions. If you think something should be added/removed/changed - please let us know. Thank you!</p> +<h2 id="simplex-chat-v42-released" tabindex="-1">SimpleX Chat v4.2 released!</h2> +<p>New in this release:</p> +<ul> +<li>fixed 3 issues from the security audit!</li> +<li>group links - group admins can create the links for new members to join</li> +<li>auto-accept contact requests + configure whether to accept incognito and welcome message</li> +<li>small things: change group member role, mark chat as unread, send stickers and GIFs from Android keyboards.</li> +</ul> +<p>Beta features (enable Developer tools to try them):</p> +<ul> +<li>manually switch contact or member to another address / server (it has to be supported by both clients to work)</li> +<li>receive files faster (enable it in Privacy &amp; Security settings)</li> +</ul> +<h3 id="group-links" tabindex="-1">Group links</h3> +<p><img src="https://simplex.chat/blog/images/20221108-group1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221108-group2.png" width="288" /></p> +<p>It's been requested by many users - to be able to join a group via link. Because SimpleX Chat groups are fully decentralised, and there is no server-side state, joining via these links requires the participation of the link creator who has to be online to accept the group joining request.</p> +<p>The way it works under the hood is similar to how contact addresses work:</p> +<ol> +<li>Group admin or owner creates a long term address that is technically the same as a user address, but it is associated with a specific group.</li> +<li>The user that joins the group can identify that this link belongs to some group by an additional piece of data in the link - <code>{&quot;type&quot;: &quot;group&quot;, &quot;groupLinkId&quot;: &quot;some random string&quot;}</code>. The ID in this link does not represent a group identity, every time any user creates a new link for the same group, this ID will be different. This ID is used by the joining client to identify the group and automatically accept the invitation when it is received.</li> +<li>When admin receives a connection request, they automatically accept it and send invitation link to join the group.</li> +<li>The joining user compares the ID in the invitation with the ID in the link, and if they match – automatically accepts the invitation.</li> +</ol> +<p>After that it works as when joining via the manual invitation - the joining user will be establishing the connection with all existing members to be able to send messages to the group.</p> +<p>The link can be created via the group page, as shown on the picture.</p> +<p>We have several groups you can join to ask any questions or just to test the app:</p> +<ul> +<li> +<p><a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FWHV0YU1sYlU7NqiEHkHDB6gxO1ofTync%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAWbebOqVYuBXaiqHcXYjEHCpYi6VzDlu6CVaijDTmsQU%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22mL-7Divb94GGmGmRBef5Dg%3D%3D%22%7D">#SimpleX-Group</a>: a general group with more than a 100 members where you can ask any questions.</p> +</li> +<li> +<p>Several groups by countries/languages: <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FmIorjTDPG24jdLKXwutS6o9hdQQRZwfQ%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA9N0BZaECrAw3we3S1Wq4QO7NERBuPt9447immrB50wo%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22S8aISlOgkTMytSox9gAM2Q%3D%3D%22%7D">#SimpleX-DE</a> (German), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FlTWmQplLEaoJyHnEL1-B3f2PtDsikcTs%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA-hMBlsQjNxK2vaVhqW_UyAVtuoYqgYTigK4B9dJ9CGc%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22G0UtRHIn0TmPoo08h_cbTA%3D%3D%22%7D">#SimpleX-US</a> (US/English), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F11r6XyjwVMj0WDIUMbmNDXO996M_EN_1%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAXDmc2Lrj9WQOjEcWa0DeQHF3HcYOp9b68s8M_BJ7gEk%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22EZCeSYpeIBkaQwCcpcF00w%3D%3D%22%7D">#SimpleX-France</a>, <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FZSYM278L5WoZiApx3925EAjSXcsAVNVu%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA7RJ2wfT8zdfOLyE5OtWLEAPowj-q6F2HB0ExbATw8Gk%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22fsVoklNGptt7n-droqJYUQ%3D%3D%22%7D">#SimpleX-RU</a> (Russian), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FmP0LbswSbfxoVkkxiWE2NYnBCgZ9Snvj%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAVwZuSsw4Mf52EaBNdNI3RebsLm0jg65ZIkcmH9E5uy8%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22M9xIULUNZx51Wsa5Kdb0Sg%3D%3D%22%7D">#SimpleX-NL</a> (Netherlands/Dutch), <a href="https://simplex.chat/contact#/?v=1-2&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FaZ_wjh6QAYHB-LjyGtp8bllkzoq880u-%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA-_Wulzc3j16i7t77XJ5wgwxeW8_Ea8GxetMo7K4MgjI%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22QWmXdrFzIeMd2OoEPMFkBQ%3D%3D%22%7D">#SimpleX-IT</a> (Italian).</p> +</li> +</ul> +<p>You can join these groups either by opening these links in the app or by opening them in desktop browser and scanning QR code.</p> +<p>Let me know if you'd like to add some other countries to the list. Join via the apps to share what's going on and ask any questions!</p> +<h3 id="auto-accept-contact-requests" tabindex="-1">Auto-accept contact requests</h3> +<p><img src="https://simplex.chat/blog/images/20221108-address1.png" width="288" />    <img src="https://simplex.chat/blog/images/20221108-address2.png" width="288" /></p> +<p>When somebody connects to you via your long-term address you have to manually accept a connection request (it shows in blue color in the list of chats). The feature that we added in this release allows to configure the app to accept contact requests automatically, and also choose whether this contact should receive your main profile or a random incognito profile (independent of the current app setting), and add an optional auto-reply message.</p> +<p>This feature is useful if you publish your address on your webpage or social profile, and do not want to screen people who want to connect to you. You may want to send a standard welcome message, for example, if it is an online store, and you need to share any information with everybody who contacts you.</p> +<p>Our @simplex account that you connect to when you choose &quot;Connect to developers&quot; in the app used this feature for a long time, and now it is available to mobile app users.</p> +<h3 id="some-small-things" tabindex="-1">Some small things</h3> +<ol> +<li> +<p>Changing group member role is a very basic feature, but it was only added in this release.</p> +</li> +<li> +<p>You can now mark a conversation as unread, for example if you accidentally marked all messages as read and you want to review it later.</p> +</li> +<li> +<p>Send stickers and GIFs from Android keyboards, and, finally, the bug with backspace button is resolved as well.</p> +</li> +</ol> +<h3 id="change-your-delivery-address-beta" tabindex="-1">Change your delivery address (BETA)</h3> +<img src="https://simplex.chat/blog/images/20221108-switch-address.png" width="288" /> +<p>To manually switch any of your contacts (or a group member to a new server address) enable Developer tools and choose &quot;Change receiving address&quot; on the contact page. As long as they run a new version of the app and online, the switch should only take a few seconds.</p> +<p>That is a major improvement of metadata privacy of SimpleX protocols, because previously, while we didn't have user identifiers, the pairwise identifiers of messaging queues used to deliver messages were used for as long as the contact existed. Now these identifiers are temporary, and in a near future we will be adding automatic rotation of these delivery addresses.</p> +<p>It is also useful when you want to migrate message delivery to another server, for example, if you used SimpleX Chat default servers and now want to self-host your own. Or, maybe, you need to change the address of your server. Previously it would require creating new contacts and losing conversation histories, and now all you have to do is to change server configuration in the app, and when the change of the address is triggered (currently, only manually, and in the near future - automatically), your contacts will be migrated to a new server, without you doing anything - it only requires each party sending 2 messages to negotiate the reconnection, and it would also rotate the encryption keys used for the outer layer of E2E encryption.</p> +<h3 id="receive-images-and-small-files-faster-beta" tabindex="-1">Receive images and small files faster (BETA)</h3> +<img src="https://simplex.chat/blog/images/20221108-faster-images.png" width="288" /> +<p>From version 4.2 all files smaller than ~92kb (equal to 6 message blocks) will be sent in the same connection where you have the chat, and files smaller than ~231kb (the limit for image size) can also be optionally received via the same connection – the latter requires enabling &quot;Transfer images faster&quot; in Privacy &amp; security settings (it will be available after you enable Developer tools). There are two reasons why it is not on by default yet: 1) we wanted to ensure it is stable; 2) there is a small effect on metadata privacy of having a burst of traffic in the same connection where you are having the main conversation.</p> +<p>This functionality was created for the future voice messages, as they need to be sent without acceptance, so that the recipients can listen to them even when the sender is offline.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<p>Please also see the information on our <a href="https://simplex.chat/">new website</a> - it also answers all these questions.</p> +<h2 id="help-us-with-donations" tabindex="-1">Help us with donations</h2> +<p>Huge thank you to everybody who donated to SimpleX Chat!</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>Your donations help us raise more funds – any amount, even the price of the cup of coffee, makes a big difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a> - it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a> - it charges a commission, and also accepts donations in many crypto-currencies.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +<li>please let us know, via GitHub issue or chat, if you want to make a donation in some other cryptocurrency - we will add the address to the list.</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Tue, 08 Nov 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html + + + SimpleX Chat v4.0 with encrypted database is released + https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html + <h1 id="simplex-chat-v4-with-encrypted-local-database-is-released" tabindex="-1">SimpleX Chat v4 with encrypted local database is released</h1> +<p><strong>Published:</strong> Sep 28, 2022</p> +<h2 id="whats-new-in-v4" tabindex="-1">What's new in v4</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#local-chat-database-encryption">encrypted local chat database</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#self-hosted-webrtc-ice-servers">support for self-hosted WebRTC ICE servers</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#improved-stability-of-creating-new-connections">improved stability of creating new connections: more reliable groups, files and contacts</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#deleting-files-and-media">deleting files and media</a>.</li> +<li><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#for-developers---typescript-sdk-for-integrating-with-simplex-chat">For developers - TypeScript SDK for integrating with SimpleX Chat</a> (e.g., chat bots or chat assistants).</li> +<li>animated images in Android app.</li> +<li>disable messages per contact / group in terminal app (it is already supported in mobile apps).</li> +</ul> +<p>Also, this version adds German language to mobile apps UI - huge thanks to <a href="https://github.com/mlanp">Michael</a> who contributed them!</p> +<p>Other new features since v3:</p> +<ul> +<li>secret chat groups (see details in <a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#secret-chat-groups">v3.1 announcement</a> - they are fully decentralized, only their members know these groups exist.</li> +<li>accessing messaging servers via Tor with support for .onion server addresses (see details in <a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#access-messaging-servers-via-tor">v3.1</a> and <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">v3.2</a> announcements) - to protect users anonymity on the TCP transport level.</li> +<li>Incognito mode - sharing a random profile name with each new contact, to completely eliminate any shared data between them (see details in <a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">v3.2</a> announcement).</li> +<li>endless scrolling and search in chats.</li> +<li>reduced Android APK size for direct download and in F-Droid repo from 200 to 50Mb!</li> +</ul> +<p><a href="https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html#we-ask-you-to-help-us-pay-for-3rd-party-security-audit">Implementation audit is arranged for October</a>!</p> +<h3 id="local-chat-database-encryption" tabindex="-1">Local chat database encryption</h3> +<img src="https://simplex.chat/blog/images/20220928-passphrase.png" width="330" /> +<p>SimpleX Chat focus has always been on protecting messages in delivery, not when they are stored on the device. This release changes it - now all messages that you receive and send are stored on the device encrypted with <a href="https://github.com/sqlcipher/sqlcipher">SQLCipher</a>.</p> +<p><strong>Please note</strong>: If you are already using SimpleX Chat, your database will remain unencrypted until you enter the passphrase via the app settings. You have to remember the passphrase you choose, as there is no way to recover it if it is lost.</p> +<p>By default your passphrase will be stored securely on the device (in KeyChain on iOS or encrypted with the key stored in TPM, if available, on Android) - it is only accessible to the app, and only on one device. Storing passphrase is required for instant notifications to work. In this case, if you lose the passphrase, the app will continue to work, but you will not be able to change the passphrase and to migrate your user profile to another device.</p> +<p>For additional security of your messages you also have the option to remove the passphrase from the device. In this case you will need to enter the passphrase every time you start the app. The notifications will continue to work only while the app is in the background. For iOS it means that periodic and local notifications will work, but instant notifications will only show that there is a message available, but not message content or who it is from - you will need to open the app and enter the passphrase to see the messages. In this case, if you lose the passphrase, you will not be able to open the app or decrypt the database - so make sure you store it safely.</p> +<h3 id="self-hosted-webrtc-ice-servers" tabindex="-1">Self-hosted WebRTC ICE servers</h3> +<img src="https://simplex.chat/blog/images/20220928-ice-servers.png" width="330" /> +<p>You could make audio and video calls via SimpleX Chat WebRTC servers since <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#end-to-end-encrypted-audiovideo-calls">v3</a> - that meant that our servers could observe your IP addresses. This release adds configuration to use your own STUN/TURN servers, helping you protect your privacy.</p> +<p>See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/WEBRTC.md">this guide</a> to learn how to deploy your own <code>coturn</code> server and to configure the mobile apps to use it.</p> +<h3 id="improved-stability-of-creating-new-connections" tabindex="-1">Improved stability of creating new connections</h3> +<p>Secret groups made SimpleX Chat much more useful, but because SimpleX groups are completely decentralized and for them to work each member should connect to all other members, sometimes these connections fail and the group becomes fragmented - some members do not receive all messages. That was more common for larger groups, as the number of required member connections is O(n^2) of the group size.</p> +<p>The reason for that problem was that some network operations required for group connections were not retried. This release improves stability of all network operations - receiving messages, making new contact connections, receiving files and connecting to members in the groups you join.</p> +<h3 id="deleting-files-and-media" tabindex="-1">Deleting files and media</h3> +<img src="https://simplex.chat/blog/images/20220928-files-media.png" width="330" /> +<p>While the database with messages and all contacts is now encrypted, the files you receive and send are not (we are planning to improve it later). To protect the security of the files we have added an option to delete all files from the app storage - just make sure not to do it before the files you send are delivered to the recipients, or they won't receive them.</p> +<h3 id="for-developers-typescript-sdk-for-integrating-with-simplex-chat" tabindex="-1">For developers - TypeScript SDK for integrating with SimpleX Chat</h3> +<p>It's been quite some time since it's been possible to create a chat-bot using SimpleX Chat as a library - but you had to either write Haskell code or use foreign function interface in any other language.</p> +<p>With v4 we are announcing <a href="https://github.com/simplex-chat/simplex-chat/tree/stable/packages/simplex-chat-client/typescript">TypeScript SimpleX Chat Client SDK</a> that you can use to create any integrations with SimpleX Chat CLI.</p> +<p>You can run SimpleX Chat CLI as a local WebSockets server on any port, we use 5225 here:</p> +<pre><code class="language-bash">simplex-chat -p 5225 +</code></pre> +<p>Then you can create a JavaScript or TypeScript application that would connect to it and control it via a simple WebSocket API. TypeScript SDK defines all necessary types and convenience functions to use in your applications. See this <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/packages/simplex-chat-client/typescript/examples/squaring-bot.js">sample bot</a> and README page.</p> +<p>SimpleX Chat API allows you to:</p> +<ul> +<li>create and change user profile (although in most cases you would do it manually, via SimpleX Chat terminal app).</li> +<li>create and accept invitations or connect with the contacts.</li> +<li>create and manage long-term user address, accepting connection requests from the code or automatically.</li> +<li>create, join and manage groups - this can be used, for example, to connect two different people who connected to chat-bot.</li> +<li>send and receive files.</li> +</ul> +<p>Some possible applications you can create:</p> +<ul> +<li>peer-to-peer trading bots, that would connect people with matching buy/sell orders,</li> +<li>bots to access information,</li> +<li>language translation bots,</li> +<li>etc.</li> +</ul> +<p>As SimpleX Chat protocols provide strong encryption and authorization of the connections, you could use it not only in various communication scenarios, but also to remotely control any equipment where high level of security is required, for example:</p> +<ul> +<li>smart home automation,</li> +<li>network services,</li> +<li>remote deletion of application data,</li> +<li>etc.</li> +</ul> +<p>We are really looking forward to seeing what applications you create - please submit your ideas and implementations, we will publish the links on a separate page on the website and GitHub repository.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>We have already signed the agreement and paid for the security audit!</p> +<p>It is planned for October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.</p> +<p>This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.</p> +<p>Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.</p> +<p>Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +<li>Bitcoin wallet: 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Wed, 28 Sep 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220928-simplex-chat-v4-encrypted-database.html + + + SimpleX Chat v3.2 is released &mdash; meet Incognito mode, unique to Simplex Chat + https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html + <h1 id="simplex-chat-v32-is-released-meet-incognito-mode-unique-to-simplex-chat" tabindex="-1">SimpleX Chat v3.2 is released - meet Incognito mode, unique to Simplex Chat</h1> +<p><strong>Published:</strong> Sep 1, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#incognito-mode">Incognito mode</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#assign-names-to-your-contacts">assign names to your contacts</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#using-onion-server-addresses-with-tor">use .onion server addresses with Tor</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#endless-scrolling-and-search-in-chats">endless scrolling and search in chats</a></li> +<li><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#choose-accent-color-and-dark-mode">choose accent color and dark mode</a></li> +<li>disable notifications per contact / group</li> +<li>on Android: +<ul> +<li>swipe to reply</li> +<li>reduced APK size for direct download and in F-Droid repo from 200 to 50Mb!</li> +</ul> +</li> +</ul> +<p><a href="https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html#we-ask-you-to-help-us-pay-for-3rd-party-security-audit">Implementation audit is arranged for October</a>!</p> +<h3 id="incognito-mode" tabindex="-1">Incognito mode</h3> +<p><img src="https://simplex.chat/blog/images/20220901-incognito1.png" width="330" /> <img src="https://simplex.chat/blog/images/20220901-incognito2.png" width="330" /> <img src="https://simplex.chat/blog/images/20220901-incognito3.png" width="330" /></p> +<p><em>SimpleX is already private, so why do we need an incognito mode</em>, you may ask.</p> +<p>You indeed can choose a pseudonym as your main profile name, but there are several problems:</p> +<ul> +<li>many users want to have their real name as their main profile, so that their friends recognise them. SimpleX objective is to provide anonymity from the network operators, but not necessarily from your contacts.</li> +<li>even if you choose a pseudonym, it would be used for all your contacts. And if two of them meet, while they cannot prove they are talking to the same person, as they use different addresses in SimpleX network to send you the messages, they could <em>suspect it</em>.</li> +<li>any pseudonym you manually choose leaks some information about you, as it's not really random.</li> +</ul> +<p>You could also use multiple chat profiles - currently you can only switch between them via export/import, we will make it easier very soon! But there are problems with multiple profiles too:</p> +<ul> +<li>if you make many anonymous connections, each in its own user profile, you would end up having too many profiles - it is very inconvenient to manage.</li> +<li>sometimes, as your relationship with your contact evolves, you may want to share your main profile with them and have them among your friends - multiple profiles don't make it possible.</li> +</ul> +<p>So, the new Incognito mode allows having a new random name shared with each new contact, while having them all in the same user profile, and without the hassle of managing it manually. It's like a private mode in the browsers, where you can temporarily enable it when you connect to somebody you don't trust, and then disable it when connecting to the friend who knows you. It can be turned on via the app settings - see the pictures.</p> +<p>I don't know any other messenger with this feature, and I always wanted to have this mode, so we are really looking forward to your feedback about it!</p> +<h3 id="assign-names-to-your-contacts" tabindex="-1">Assign names to your contacts</h3> +<p>You can now change the name under which your contacts appear in the chats. This is particularly useful when somebody connected to you using a random name – you can change it to be related to the context of the connection.</p> +<h3 id="using-onion-server-addresses-with-tor" tabindex="-1">Using .onion server addresses with Tor</h3> +<p><img src="https://simplex.chat/blog/images/20220901-onion1.png" width="330" />   <img src="https://simplex.chat/blog/images/20220901-onion2.png" width="330" /></p> +<p>We have released support for using SOCKS proxy to access messaging servers via Tor, but previously the servers were still available via their public Internet addresses. It means that while your IP address was protected from the server, the whole Tor circuit could have been observed by some actors, and for some communication scenarios it is not desirable.</p> +<p>This release adds support for servers with multiple hostnames - all servers provided by SimpleX Chat now have dual addresses (one public and one .onion), and you can have your own servers available via two addresses as well - all you have to do is to install Tor client on your server and register its address with Tor. If you server has both public and .onion address, it is not really hidden, so you should enable HiddenServiceSingleHopMode to reduce the latency of connection - it protects anonymity of the people who connect to the server, but not of the server itself. The server address would include both its public and onion address, as you can see in the server addresses in the app (in the contacts pages) - you should use the same format for the addresses of your servers.</p> +<p>Both android and iOS app allow managing whether .onion addresses are used, and you can also enforce using .onion addresses - in this case the app will not connect to the server unless one of its hostname is .onion address. On Android, .onion addresses are used by default when SOCKS proxy is enabled.</p> +<h3 id="endless-scrolling-and-search-in-chats" tabindex="-1">Endless scrolling and search in chats</h3> +<p>Now you can access the full chat history via the app - it's embarrassing how long it took us to add it! And you can search the messages as well.</p> +<h3 id="choose-accent-color-and-dark-mode" tabindex="-1">Choose accent color and dark mode</h3> +<p>Many of you said that blue is the worst possible color, so you can now make the app buttons and links look like you want! My favourite colours are green and orange.</p> +<p>And you can choose dark or light mode independently of the system settings.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>Our great news is that we have already signed the agreement and paid for the security audit!</p> +<p>It is planned in October, and if there are no major issues we will publish this report straight away, otherwise - once we fix them.</p> +<p>This is a major expense for use - over $20,000 - I would really appreciate if you could help us cover some part of this cost with the donations.</p> +<p>Our promise to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We will be establishing a legal framework this year to ensure that it doesn't change if the ownership of SimpleX Chat Ltd changes at any future point.</p> +<p>Please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Thu, 01 Sep 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220901-simplex-chat-v3.2-incognito-mode.html + + + SimpleX Chat v3.1 is released &mdash; with secret groups and server access via Tor + https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html + <h1 id="simplex-chat-v31-is-released-with-secret-groups-and-server-access-via-tor" tabindex="-1">SimpleX Chat v3.1 is released - with secret groups and server access via Tor</h1> +<p><strong>Published:</strong> Aug 8, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#secret-chat-groups">secret chat groups</a>!</li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#access-messaging-servers-via-tor">access to messaging servers via Tor</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#advanced-network-settings">advanced network settings</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#published-chat-protocol">published chat protocol</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#new-app-icons">new app icons</a></li> +<li><a href="https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html#other-changes-since-v3">other changes since v3</a>: +<ul> +<li>optimized battery and traffic usage - up to 90x reduction!</li> +<li>two docker configurations for self-hosted SMP servers</li> +</ul> +</li> +</ul> +<h3 id="secret-chat-groups" tabindex="-1">Secret chat groups</h3> +<p><img src="https://simplex.chat/blog/images/20220808-group1.png" width="330" /> <img src="https://simplex.chat/blog/images/20220808-group2.png" width="330" /> <img src="https://simplex.chat/blog/images/20220808-group3.png" width="330" /></p> +<p>It's been <a href="https://simplex.chat/blog/20210914-simplex-chat-v0.4-released.html">nearly a year</a> since the users of SimpleX Chat terminal app started experimenting with the groups, and now it is available to mobile app users as well. Many bugs were fixed, the stability was improved, but there are both the features we need to add and the bugs we need to fix to make groups more useful - we really look forward to your feedback. You can send any suggestions via the app by choosing <code>Chat with the developers</code> via app Settings (or using <code>/simplex</code> command in the terminal app) – this would connect you to SimpleX team via its <a href="https://simplex.chat/contact#/?v=1&amp;smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D">fixed chat address</a>.</p> +<p>SimpleX network is decentralized, so how do groups work? Unlike Matrix or Signal that host the group profile and the list of group members on their servers, SimpleX servers have no information about the group's existence - only its members do. SimpleX network does not assign any globally unique identifiers to the group, there is only a local database identifier and the list of members stored on members' devices. A user has an independent connection to each member in a group. When a user sends a message to the group, the app sends this message independently to each member. You can read more about how groups work in <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/protocol/simplex-chat.md#sub-protocol-for-chat-groups">SimpleX Chat Protocol</a>.</p> +<p>But how can it scale, you might ask? It simply won't, and the current design for the groups is only suitable for relatively small groups of people who know each other well, definitely not larger than few hundred members – this design prioritized privacy and security of the group over its size or performance. For example, to send a message to the group of 100 members a user would need to send a total of ~1.6mb of data (as each message uses a fixed size block of 16kb). And if you were to send a 1mb file then it would also require sending it 100 times (provided each member accepts it).</p> +<p>What if you need to send many large files to group members? We will be developing a file hosting server where the users will be able to upload the file (or image) once, and only send the file link and credentials to all group members, without the need to send the actual file. A small hosting quota will be available to all users for free, paid for by donations, and for larger files or to increase the total quota the users would either have to pay a small hosting cost or to self-host this server – it will be available as an open-source code.</p> +<p>What if you need to have a large group - e.g. 100,000 members or more? We will be introducing SimpleX channels later this year, that can be both public and private. These channels would require a server to host them, either provided by SimpleX Chat or self-hosted - same as for a website. If this is a public channel it would be optionally accessible via the web browser as well, and it will be possible to embed it into any webpage.</p> +<p>Other group improvements we will add soon:</p> +<ul> +<li>manage notifications in each group independently.</li> +<li>search for messages - it is useful for direct conversations too, but more important for groups.</li> +</ul> +<h3 id="access-messaging-servers-via-tor" tabindex="-1">Access messaging servers via Tor</h3> +<p><img src="https://simplex.chat/blog/images/20220808-tor1.png" width="330" />   <img src="https://simplex.chat/blog/images/20220808-tor2.png" width="330" /></p> +<p>SimpleX protocols are focussed on protecting application-level meta-data – they don't have any user identifiers used by all other messaging platforms, instead relying on pairwise connection identifiers.</p> +<p>But there are scenarios when users need to protect their IP addresses from the servers and any network observers – this is best done by using Tor to access any network services.</p> +<p>This release allows to access SimpleX messaging servers via Tor on all platforms:</p> +<ul> +<li>terminal app beta supported it for a couple weeks now: to access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with <code>-x</code> option. See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md#access-messaging-servers-via-tor-beta">terminal app docs</a> for more information.</li> +<li>Android app supports access via Tor using Orbot SOCKS proxy. Once you install and start Orbot, you need to enable <code>Network &amp; Servers / Use SOCKS proxy</code> setting in the app to access SimpleX servers via Tor.</li> +<li>iOS app can also be used with Orbot iOS app (that is installed as a system-wide VPN provider). The only setting you might need to change is to increase network timeouts in the app - to do that you have to enable <code>Developer tools</code>, and then chose <code>Network &amp; Servers / Advanced network settings / Set timeouts for proxy</code>.</li> +</ul> +<p>Currently all servers are accessed via their public Internet addresses, and while users can self-host messaging servers on .onion addresses (as v3 hidden services), it would require both connected contacts to use Tor. We are planning to add support for dual server addresses very soon, to allow the same server to be accessed both via its public Internet address and via .onion address, so that users can access servers without exiting Tor (via .onion address), but their contacts can access the same servers without using Tor.</p> +<h3 id="advanced-network-settings" tabindex="-1">Advanced network settings</h3> +<p>To reduce traffic on slow networks we added network access settings. To use these settings, you need to first enable <code>Developer tools</code> and then choose <code>Network &amp; Servers / Advanced network settings</code>:</p> +<ul> +<li>if your connections to the servers are unstable, and you frequently see the spinners in the list of chats, please increase the connection and protocol timeouts - it should reduce the traffic, but it may also make the app a bit slower when your Internet connection is slow.</li> +<li>if your connection to the servers appears stable, but the traffic usage is high, please try disabling TCP keep-alive setting or increasing keep-alive idle period (<code>TCP_KEEP_IDLE</code>) and interval (<code>TCP_KEEP_INTVL</code>).</li> +</ul> +<p>Once we investigated how these settings affect traffic and user experience we will simplify them - huge thanks to everyone testing them and reporting any traffic issues.</p> +<h3 id="new-app-icons" tabindex="-1">New app icons</h3> +<img src="https://simplex.chat/blog/images/20220808-icons.png" width="330" /> +<p>Many users asked to allow customizing the app, this is just a start - you can now choose either light or dark icon option via <code>Appearance</code> settings.</p> +<p>More options to customize the app are coming - please let us know what are the most important.</p> +<h3 id="published-chat-protocol" tabindex="-1">Published chat protocol</h3> +<p>The <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/">low level SimpleX protocols</a> were published long time ago, and updated to reflect the evolution of the protocols, the high level chat protocol was not published before. The reason for that was to allow us to iterate it quickly, without committing to any of the decisions.</p> +<p>This is the <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/protocol/simplex-chat.md">first draft of SimpleX Chat Protocol</a> - let us know any questions or suggestions.</p> +<h3 id="other-changes-since-v3" tabindex="-1">Other changes since v3</h3> +<p>Since v3 release we also optimized battery and traffic usage - with up to 90x traffic reduction in some cases – and published two docker configurations for self-hosted SMP servers. Read more about it in the previous <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html">beta version announcement</a>.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>Some links to answer the most common questions:</p> +<p><a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html#the-first-messaging-platform-without-user-identifiers">How can SimpleX deliver messages without user identifiers</a>.</p> +<p><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">What are the risks to have identifiers assigned to the users</a>.</p> +<p><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#privacy-technical-details-and-limitations">Technical details and limitations</a>.</p> +<p><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#frequently-asked-questions">How SimpleX is different from Session, Matrix, Signal, etc.</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to donate via:</p> +<ul> +<li><a href="https://github.com/sponsors/simplex-chat">GitHub</a>: it is commission-free for us.</li> +<li><a href="https://opencollective.com/simplex-chat">OpenCollective</a>: it also accepts donations in crypto-currencies, but charges a commission.</li> +<li>Monero wallet: 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt</li> +</ul> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Mon, 08 Aug 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220808-simplex-chat-v3.1-chat-groups.html + + + SimpleX Chat v3.1-beta is released &mdash; improved battery/traffic usage + https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html + <h1 id="simplex-chat-v31-beta-is-released-improved-batterytraffic-usage" tabindex="-1">SimpleX Chat v3.1-beta is released - improved battery/traffic usage</h1> +<p><strong>Published:</strong> Jul 23, 2022</p> +<h2 id="whats-new" tabindex="-1">What's new</h2> +<ul> +<li>terminal app: <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#terminall-app-access-to-messaging-servers-via-socks5-proxy--tor">access to messaging servers via SOCKS5 proxy</a> (e.g., Tor).</li> +<li>mobile apps: <a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#mobile-apps-join-and-leave-chat-groups">join and leave chat groups</a>.</li> +<li><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#optimized-battery-and-traffic-usage---up-to-90x-reduction">optimized battery and traffic usage - up to 90x reduction!</a>.</li> +<li><a href="https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html#docker-configuration-for-self-hosted-smp-servers">two docker configurations for self-hosted SMP servers</a>.</li> +</ul> +<h3 id="terminall-app-access-to-messaging-servers-via-socks5-proxy-tor" tabindex="-1">Terminall app: access to messaging servers via SOCKS5 proxy / Tor</h3> +<img src="https://simplex.chat/blog/images/20220723-tor.jpg" width="480" /> +<p>While SMP protocol is focussed on protecting application-level meta-data by using pairwise connection identifiers instead of user identifiers (that are used by all other messaging platforms), there are scenarios when it is important for the users to protect their IP addresses from the servers - quite a few users have been somewhat disappointed that we didn't add it earlier.</p> +<p>This release of terminal app supports accessing the servers via Tor, but the servers themselves are still available on their usual addresses. We are planning to add .onion addresses (v3 hidden service) to all messaging servers we provide, and the users who self-host the servers will also be able to have dual servers addresses - so that one party in the conversation can access the servers via .onion address without necessarily requiring that the other party uses Tor as well.</p> +<p>To access SimpleX servers via Tor you need to install Tor proxy and run simplex-chat with <code>-x</code> option. See <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md#access-messaging-servers-via-tor-beta">terminal app docs</a> for more information.</p> +<p>As this is a beta release, to install it you need to use this command:</p> +<pre><code class="language-sh">curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/stable/install.sh | sh -s -- v3.1.0-beta.0 +</code></pre> +<h3 id="mobile-apps-join-and-leave-chat-groups" tabindex="-1">Mobile apps: join and leave chat groups</h3> +<p><img src="https://simplex.chat/blog/images/20220723-group-invite.png" width="330" /> <img src="https://simplex.chat/blog/images/20220723-group-accept.png" width="330" /> <img src="https://simplex.chat/blog/images/20220723-group-leave.png" width="330" /></p> +<p>Groups have been supported by SimpleX Chat core for a very long time, but there was no user interface in the mobile apps to use them - users had to use chat console to create groups, add members, and accept invitations.</p> +<p>This release allows accepting the invitations to join groups via mobile apps UI, making it much easier to create groups - only one user (a group owner) needs to use chat console, while all other groups members just need to tap a button in the UI to join or leave the group. Full group UI is coming in v3.1 in 1-2 weeks, but you can already start using groups today by installing beta-versions of mobile apps via <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight</a>, <a href="https://play.google.com/apps/testing/chat.simplex.app">Google PlayStore Beta</a> and <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK download</a>.</p> +<p>To manage groups via terminal app or via chat console in the mobile apps you have to use these commands:</p> +<ul> +<li>to create group: <code>/g &lt;group_name&gt; [&lt;description&gt;]</code></li> +<li>to add member (admin by default): <code>/a &lt;group_name&gt; &lt;contact_name&gt; [owner/admin/member]</code></li> +<li>to remove member from the group: <code>/rm &lt;group_name&gt; &lt;contact_name&gt;</code></li> +</ul> +<p>Accepting group invitations, leaving and deleting groups no longer requires using console commands.</p> +<h3 id="optimized-battery-and-traffic-usage-up-to-90x-reduction" tabindex="-1">Optimized battery and traffic usage - up to 90x reduction</h3> +<p>To reduce battery and traffic usage this release updated SMP protocol to allow batching multiple server commands (up to 90!) into one traffic block – provided both the server and the client are upgraded. It means that if you have 90 contacts (or group members) on one server, to subscribe to all messaging queues you now need to send only one 16kb block instead of ~1.5Mb of traffic (90 blocks). It also hides how many contacts you have from any attackers who observe your network.</p> +<p>You might notice that sending commands to multiple queues in one block would allow the server to correlate that all these queues belong to the same user, even though the current server implementation we use does not do it. But even without batching, as the commands are sent via the same TCP connection, this correlation was already possible, so compared with the previous version it has no downsides.</p> +<p>To mitigate the risk of servers correlating your messaging queues we will soon add an option to access each queue via a separate TCP connection, which will have to be used together with access via Tor (as otherwise the servers would still see the same IP address). While it will increase battery and traffic consumption, it will also provide the highest level of privacy.</p> +<h3 id="docker-configuration-for-self-hosted-smp-servers" tabindex="-1">Docker configuration for self-hosted SMP servers</h3> +<p>When we released SimpleX Chat v3 two weeks ago many users wanted to host messaging servers in docker containers. So, we are now offering <a href="https://github.com/simplex-chat/simplexmq/tree/stable/scripts/docker">two versions of docker configurations</a>:</p> +<ul> +<li>fast and convenient - it downloads SMP server binary from GitHub.</li> +<li>more secure - it builds SMP server from the source code.</li> +</ul> +<p>Let us know how it works for you!</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h3 id="the-first-and-the-only-messaging-platform-without-user-identifiers-of-any-kind-100percent-private-by-design" tabindex="-1">The first (and the only?) messaging platform without user identifiers of any kind - 100% private by design!</h3> +<p>To protect identities of users and their connections, instead of user identifiers visible to the servers and/or the network (that are used by all other messaging platforms), SimpleX Chat uses <a href="https://csrc.nist.gov/glossary/term/Pairwise_Pseudonymous_Identifier">pairwise identifiers</a> of connections between the users – there are two queues in each connection, each queue having 2 different identifiers to send and to receive the messages. It increases the number of used identifiers to the square of the number of users, making it more difficult (or impossible) to determine who is talking to whom. I <a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#why-having-users-identifiers-is-bad-for-the-users">wrote previously</a> why it is bad for the users' privacy to have any identifiers, even random numbers, associated with their profiles.</p> +<h3 id="if-simplex-has-no-user-identifiers-how-can-it-deliver-messages" tabindex="-1">If SimpleX has no user identifiers, how can it deliver messages?</h3> +<p>I wrote about it in <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 release announcement</a> and you can get more information about SimpleX platform objectives and technical design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">the whitepaper</a>.</p> +<h3 id="privacy-technical-details-and-limitations" tabindex="-1">Privacy: technical details and limitations</h3> +<p>SimpleX design follows &quot;defence in depth&quot; security principles having multiple overlapping defensive mechanisms to protect users privacy and security:</p> +<ul> +<li>TLS transport with server identity validation and channel binding, limited to the most secure cryptographic algorithms.</li> +<li>Three levels of encryption that both protect message content and meta-data, preventinc trafic correlation even if TLS is compromised: +<ul> +<li>end-to-end encryption in each messaging queue.</li> +<li>end-to-end encryption of the conversation using double-ratchet algorithms, that provides OTR messaging with forward secrecy and break-in recovery.</li> +<li>additional encryption layer between the server and message recipient, to prevent traffic correlation by ciphertext or any identifiers.</li> +</ul> +</li> +<li>Four levels of message padding to prevent any attack based on the content size - the TLS transport block is padded to a fixed 16kb size, and each of 3 encrypted envelopes is padded to a constant size before encryption as well.</li> +</ul> +<p>What we plan to add soon to further improve privacy and security:</p> +<ul> +<li>message queue rotation, so that pairwise identifiers become temporary, and your conversations move from server to server automatically.</li> +<li>access to the messaging servers via Tor v3 hidden services.</li> +<li>message mixing - adding latencies to message delivery, to protect against traffic correlation by message time.</li> +<li>using Tor v3 hidden service addresses for messaging servers.</li> +<li>passphrase-based local database encryption.</li> +</ul> +<p>SimpleX Chat <a href="https://github.com/simplex-chat/simplex-chat/blob/stable/README.md#privacy-technical-details-and-limitations">README page</a> has more details about it.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to <a href="https://github.com/sponsors/simplex-chat">donate via GitHub</a>, which is commission-free for us, or <a href="https://opencollective.com/simplex-chat">via OpenCollective</a>, that also accepts donations in crypto-currencies, but charges a commission.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Sat, 23 Jul 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html + + + SimpleX announces SimpleX Chat v3 &mdash; with encrypted calls and iOS push notifications + https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html + <h1 id="simplex-announces-simplex-chat-v3-with-encrypted-calls-and-ios-push-notifications" tabindex="-1">SimpleX announces SimpleX Chat v3 - with encrypted calls and iOS push notifications</h1> +<p><strong>Published:</strong> Jul 11, 2022</p> +<h2 id="new-in-version-3" tabindex="-1">New in version 3</h2> +<ul> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#instant-notifications-for-ios">instant notifications for iOS</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#end-to-end-encrypted-audiovideo-calls">end-to-end encrypted audio/video calls</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#database-export-and-import">database export and import</a></li> +<li><a href="https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html#protocol-privacy-and-performance-improvements">protocol privacy and performance improvements</a></li> +</ul> +<h3 id="instant-notifications-for-ios" tabindex="-1">Instant notifications for iOS</h3> +<p>I wrote previously about <a href="https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html#problem---users-expect-to-be-instantly-notified-when-messages-arrive">our design for iOS notifications</a> - this is now released. The app will offer to migrate the database when updated, and then you need to choose notifications mode – instant or periodic push notifications, or previously available periodic background refresh that does not use push notifications.</p> +<p>To deliver the notifications to iOS devices we use our notification server, as there is a single private key that Apple issues for the app. This server has minimal amount of information about your chat activity:</p> +<ul> +<li>it does not have the addresses of messaging queues used to send and receive messages - there is an additional address used for notification server to receive notifications from the messaging servers.</li> +<li>notifications themselves do not include message content or contacts, even in encrypted form - they only contain end-to-end encrypted metadata about the server and the queue that has available messages - so Apple servers cannot access the information about how many contacts you have or how frequently each of them messages you - they can only see the total number of notifications your device receives.</li> +<li>message senders do not connect to the notification server, so it cannot in any way correlate sent and received traffic across multiple devices.</li> +</ul> +<img src="https://simplex.chat/blog/images/20220711-notifications.png" width="480" /> +<p><strong>Please note</strong>: for periodic notifications to work the app has to be in the background - if the app is completely stopped (removed from the recent apps), it will not check the new messages and you will not receive notifications. Instant notifications work even when the app is completely stopped.</p> +<h3 id="end-to-end-encrypted-audiovideo-calls" tabindex="-1">End-to-end encrypted audio/video calls</h3> +<p>You can now call your contacts via WebRTC, connecting via SimpleX Chat relay servers or peer-to-peer, and in the near future you will be able to configure your own STUN/TURN servers used to establish the connection. The calls are end-to-end encrypted - the key is negotiated via the connection you already have with your contact in the chat, that is also used as a signalling layer for WebRTC - in most cases only three messages in total have to be sent by your and your contact's clients for the call to start, including the initial call invitation.</p> +<img src="https://simplex.chat/blog/images/20220711-call-in-progress.png" width="480" /> +<p>The calls are still quite limited, especially on iOS, - for example, you cannot continue the call while the app is in the background.</p> +<h3 id="database-export-and-import" tabindex="-1">Database export and import</h3> +<p>Quite a few users asked - <em>how can I move my chat profile to a new device</em>? SimpleX Chat v3 has a solution for that - you can now export chat database from one device and import it into another - even to another platform, e.g. you can move chat database from Android phone to iOS or to the terminal (console) client.</p> +<img src="https://simplex.chat/blog/images/20220711-database-chat-stopped.png" width="480" /> +<p>Some important limitations:</p> +<ul> +<li>you cannot run the same chat profile from two devices, neither at the same time nor in turns. You should only use the latest database version - every time you want to move it to another device you need to export a new chat archive from the device that was the latest to use it, and import it to the device where you want to use it next.</li> +<li>we plan to add internal database encryption soon, but currently it is stored on the device without encryption, and the exported archive is also not encrypted. You should store it securely, and encrypt it if you store it in the cloud or send via email.</li> +</ul> +<p>This feature can be useful in some other scenarios:</p> +<ul> +<li>managing multiple chat profiles - it's not very convenient, and a better support of multiple profiles is coming soon.</li> +<li>share access to the same profile with other people, as long as it is not used at the same time. For that use case it may be better to run SimpleX Chat terminal client in the cloud, as we do with our public account that you can connect to via the app.</li> +<li>preserve chat profile when you need to temporarily delete the app from your device.</li> +</ul> +<h3 id="protocol-privacy-and-performance-improvements" tabindex="-1">Protocol privacy and performance improvements</h3> +<p>Adding push notifications for iOS required SimpleX Messaging Protocol changes. We managed not just to keep the same level of meta-data privacy from passive observers, but to improve it - now all message meta-data that is passed from the server to the recipient is included into the same encrypted envelope as the message itself - as before, there is no identifiers or ciphertext in common inside TLS traffic between received and sent traffic of the server, and now there is no message timestamp inside TLS as well.</p> +<p>We also improved the protocol flow for establishing bidirectional connection between two users - it is substantially faster now, consuming much less network traffic and battery. It improves the time it takes to connect to your contacts and to start delivering images and files.</p> +<p>All these changes did not affect backward compatibility - if your contact has the previous version of the client, or you are connecting to a previous version of the server, the previous version of the protocol will be used - SimpleX has independent version negotiation in 4 protocol layers <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html#stable-protocol-implementation">since v1</a>, allowing us to evolve the protocols without any disruption to the users.</p> +<h2 id="simplex-platform" tabindex="-1">SimpleX platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h3 id="the-first-and-we-believe-the-only-messaging-platform-without-user-identifiers-of-any-kind-100percent-private-by-design" tabindex="-1">The first (and we believe the only) messaging platform without user identifiers of any kind - 100% private by design!</h3> +<p>To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the servers and the network – unlike any other messaging platform. Not only SimpleX doesn't use phone numbers or emails, as Signal and many other platforms, it also does not have any persistent identifiers to identify users - unlike many other messengers considered private - Session, Cwtch, Ricochet, Briar, Jami, etc., - all these platforms have global user identifiers, uniquely identifying their users and creating the risks of de-anonymising the users.</p> +<h3 id="why-having-users-identifiers-is-bad-for-the-users" tabindex="-1">Why having users' identifiers is bad for the users?</h3> +<p>When each user has a unique identifier on the platform, even if this is just a random number, e.g. as a Session ID, it creates risks that whoever gains access to the platform data can observe how the users are connected and how many messages are transmitted between them, and then correlate this information with the existing public social networks, determining the real identities of some users. Even with the most private messengers built on top of Tor network, having a persistent identity means that if you talk to two different users via the same profile they can prove that they communicate with the same person, as they would use the same address to send messages.</p> +<p>SimpleX platform avoids these risks by not having any user identity in its design - so even if you talk to two different people from the same chat profile, they would not be able to prove they are talking to the same person - only that user profiles look the same. And we are planning to add a feature allowing to have a different display name for each contact you connect to - quite a few users asked for it.</p> +<h3 id="how-does-it-work" tabindex="-1">How does it work</h3> +<p>Many people asked: <em>if SimpleX has no user identifiers, how can it deliver messages?</em></p> +<p>I wrote about it in <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 release announcement</a> and you can get more information about SimpleX platform objectives and technical design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">the whitepaper</a>.</p> +<h2 id="we-ask-you-to-help-us-pay-for-3rd-party-security-audit" tabindex="-1">We ask you to help us pay for 3rd party security audit</h2> +<p>I will get straight to the point: I ask you to support SimpleX Chat with donations.</p> +<p>We are prioritizing users privacy and security - it would be impossible without your support we were lucky to have so far.</p> +<p>We are planning a 3rd party security audit for the app, and it would hugely help us if some part of this $20000+ expense could be covered with donations.</p> +<p>Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations for the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure.</p> +<p>If you are already using SimpleX Chat, or plan to use it in the future when it has more features, please consider making a donation - it will help us to raise more funds. Donating any amount, even the price of the cup of coffee, would make a huge difference for us.</p> +<p>It is possible to <a href="https://github.com/sponsors/simplex-chat">donate via GitHub</a>, which is commission-free for us, or <a href="https://opencollective.com/simplex-chat">via OpenCollective</a>, that also accepts donations in crypto-currencies, but charges a commission.</p> +<p>Thank you,</p> +<p>Evgeny</p> +<p>SimpleX Chat founder</p> + + + Mon, 11 Jul 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html + + + SimpleX Chat v2.2 - the new privacy and security features + https://simplex.chat/blog/20220604-simplex-chat-new-privacy-security-settings.html + <h1 id="simplex-chat-v22-the-new-privacy-and-security-features" tabindex="-1">SimpleX Chat v2.2 - the new privacy and security features</h1> +<p><strong>Published:</strong> June 4, 2022</p> +<p>See <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 announcement</a> for more information about SimpleX platform and how it protects your privacy by avoiding user identities of any kind in its design - SimpleX, unlike any other messaging platform, has no identity keys or any numbers that identify its users.</p> +<h2 id="new-privacy-and-security-settings-in-version-22" tabindex="-1">New Privacy and Security settings in version 2.2</h2> +<img src="https://simplex.chat/blog/images/20220604-privacy-settings.png" width="480" /> +<h3 id="protect-your-chats" tabindex="-1">Protect your chats</h3> +<p>To protect your chats you can enable SimpleX Lock. Every time you open the chat after it was in the background for 30 second, you will need to pass biometric or pin code authentication to use the app (provided it is enabled for your device).</p> +<h3 id="save-data-and-avoid-sharing-you-are-online" tabindex="-1">Save data and avoid sharing you are online</h3> +<p>In case you want to save your mobile data or to avoid showing to your contacts that you are online, you can disable automatic image downloads. For many users it is more convenient to have images downloaded automatically, so it is enabled by default.</p> +<p>Low resolution image previews would still be shown, the senders have no way to see if you received them or not.</p> +<h3 id="avoid-visiting-websites-of-the-links-you-send" tabindex="-1">Avoid visiting websites of the links you send</h3> +<p>When you receive the links that include link previews, it is fully private - these previews are generated by the sender, and they do not expose your IP address in any way.</p> +<p>When you send the links, the app automatically downloads the link description and the picture from the website of the link. While it is convenient, it exposes your IP address to the website. To avoid it you can disable sending link previews.</p> +<h3 id="identify-any-lost-messages-in-the-chat" tabindex="-1">Identify any lost messages in the chat</h3> +<p>The app tracks the integrity of the messages you receive by cheching their sequential numbers and by validating that the hash of the previous message matches the hash included in the message – each conversation, effectively, is two blockchains that only you and your contact have access to.</p> +<p>In case some of the messages are lost, you would see it in the chat. It can happen because of one the following reasons:</p> +<ul> +<li>the messages have expired on the server after 30 days not being delivered.</li> +<li>the messages were removed when the server was restarted. We will add server redundancy later this year to avoid message loss in this case, for now if you see an indication that some messages were lost in the chat, you can check with your contact what it was.</li> +<li>some other app error. Please notify us via chat - we will investigate possible root causes.</li> +<li>the connection is compromised. This is very unlikely, but not an impossible scenario.</li> +</ul> +<h3 id="there-is-more" tabindex="-1">There is more</h3> +<p>You can discover additional features we are currently testing in Experimental Features - they will be announced later!</p> +<h2 id="more-information" tabindex="-1">More information</h2> +<p>See <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a> for information on how SimpleX protects the security of the messages.</p> +<p>Read about SimpleX design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">whitepaper</a>.</p> + + + Sat, 04 Jun 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220604-simplex-chat-new-privacy-security-settings.html + + + SimpleX Chat v2.1 - better conversation privacy + https://simplex.chat/blog/20220524-simplex-chat-better-privacy.html + <h1 id="simplex-chat-v21-better-conversation-privacy" tabindex="-1">SimpleX Chat v2.1 - better conversation privacy</h1> +<p><strong>Published:</strong> May 24, 2022</p> +<h2 id="new-in-version-21-clearing-conversations-without-deleting-contacts" tabindex="-1">New in version 2.1 - clearing conversations without deleting contacts</h2> +<p>In this version you can irreversibly delete individual messages after they were deleted by a sender, and also completely clear the conversation.</p> +<p>The only way to do it before this version was by deleting the contact, now you can keep the connection when you clear the conversation.</p> +<p><img src="https://simplex.chat/blog/images/20220524-clear-chat1.png" width="240" /> <img src="https://simplex.chat/blog/images/20220524-clear-chat2.png" width="240" /></p> +<p>See <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a> for information on how SimpleX protects the security of the messages.</p> +<p>See <a href="https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html">v2 announcement</a> for more information about SimpleX platform and how it works.</p> +<p>Read about SimpleX design in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">whitepaper</a>.</p> + + + Tue, 24 May 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220524-simplex-chat-better-privacy.html + + + SimpleX Chat v2.0 - sending images and files in mobile apps + https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html + <h1 id="simplex-chat-v20-sending-images-and-files-in-mobile-apps" tabindex="-1">SimpleX Chat v2.0 - sending images and files in mobile apps</h1> +<p><strong>Published:</strong> May 11, 2022</p> +<h2 id="new-in-version-20-sending-images-and-files-privately" tabindex="-1">New in version 2.0 - sending images and files privately</h2> +<p>To send image and files SimpleX Chat uses privacy-preserving system components, both in iOS and Android apps. We do not ask for permission to access multiple or selected files, as, for example, Signal and Telegram do - it compromises either privacy or convenience.</p> +<p>How does it work? The gallery and files are accessed from a system provided dialogue that runs in a separate process, and provides a temporary URI to access only one file selected by the user, only until the app is restarted.</p> +<p>To make file and images work for mobile apps we made a breaking change in SimpleX Chat core. The current version can exchange files with the previous version 1.6 of the terminal app, but not with the version before that.</p> +<p>In the mobile app, to send and receive files both devices must have version 2.0 installed - so please check it with your contacts. Receiving images works in the previous version, so even if your contacts did not yet upgrade the app, they should be able to receive the images.</p> +<h2 id="the-first-messaging-platform-without-user-identifiers" tabindex="-1">The first messaging platform without user identifiers</h2> +<p>To protect identities of users and their connections, SimpleX Chat has no user identifiers visible to the network – unlike any other messaging platform.</p> +<p>Many people asked: <em>if SimpleX has no user identifiers, how can it deliver messages?</em></p> +<p>To deliver mesages, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts. In the current version of the protocol each queue is used until the contact is deleted. Later this year we plan to add queue rotation to the client protocol, so that even conversations don't have long term identifiers visible to the network. This design prevents leaking any users metadata on the application level.</p> +<p>You define which server(s) to use <strong>to receive</strong> the messages, your contacts – the servers you use <strong>to send</strong> the messages to them. It means that every conversation is likely to use two different servers - one for each message direction.</p> +<p>Only client devices store user profiles, contacts, groups, and messages sent with <strong>2-layer end-to-end encryption</strong>.</p> +<p>Read more in <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">SimpleX whitepaper</a>.</p> +<h2 id="how-to-connect-with-your-contacts-in-simplex-chat" tabindex="-1">How to connect with your contacts in SimpleX Chat</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link or a QR code via the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<img src="https://simplex.chat/images/conversation.png" alt="Make a private connection" width="594" height="360" /> + + + Wed, 11 May 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220511-simplex-chat-v2-images-files.html + + + Instant notifications for SimpleX Chat mobile apps + https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html + <h1 id="instant-notifications-for-simplex-chat-mobile-apps" tabindex="-1">Instant notifications for SimpleX Chat mobile apps</h1> +<p><strong>Published:</strong> April 04, 2022</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-it-has-no-access-to-your-connections" tabindex="-1">SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections</h2> +<p>Since we released SimpleX Chat mobile apps couple of weeks ago we've had a lot of excitement from our users - nearly 2000 people downloaded the app after <a href="https://simplex.chat/blog/20220308-simplex-chat-mobile-apps.html">the announcement</a>!</p> +<p>Huge thanks to everybody who downloaded and connected to us via the chat - there were many great questions and suggestions, and on some days I spent most of the time chatting to our users :)</p> +<p>Since we released the app, we've added and released:</p> +<ul> +<li>support for iPhone 7.</li> +<li>configurable SimpleX servers.</li> +<li>message replies, editing and deletion.</li> +<li>profile images.</li> +<li>and, most importantly, private instant message notifications on Android devices - more on that below.</li> +</ul> +<h2 id="install-the-apps-and-make-a-private-connection" tabindex="-1">Install the apps and make a private connection!</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers. It is local to your devices, and it will be shared with your contacts only when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link or a QR code via the &quot;Add contact&quot; button in the app. You can show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel. Only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link the connection will be created and you can send end-to-end encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<p>See <a href="https://youtu.be/rZeVhsv_JAY">demo video</a> that shows how two users connect and send the first messages.</p> +<h2 id="why-we-are-doing-it" tabindex="-1">Why we are doing it</h2> +<p>We are building SimpleX Chat because we believe that privacy is a fundamental human right, and that protecting our personal network of contacts is even more important than the content of the messages - sharing this network can lead to various adverse consequences, from manipulating us into buying goods we don't need, manipulating election processes, and in some cases, prosecuting innocent people. For example, <a href="https://en.wikipedia.org/wiki/Mohamedou_Ould_Slahi">Mohamedou Ould Salahi</a> was detained in Guantanamo prison for 15 years after a single &quot;wrong&quot; phone call. His story is told in his memoir and in The Mauritanian movie.</p> +<h2 id="problem-users-expect-to-be-instantly-notified-when-messages-arrive" tabindex="-1">Problem - users expect to be instantly notified when messages arrive!</h2> +<p>Our first users realized that what we take for granted in messaging apps - instant message notifications - is missing in our first release of SimpleX Chat apps. Quite a few people thought that it was a bug, rather than a missing feature. Sorry to disappoint!</p> +<h2 id="why-cant-we-just-do-what-messenger-x-does" tabindex="-1">Why can't we just do what messenger X does?</h2> +<p>SimpleX Chat is the first and the only messenger we know of that operates without user identities of any kind. There are no phone numbers, emails, usernames, public keys, or any other addresses or identifiers to uniquely identify the users to the network or servers. That is why we say it is 100% private by design, and fundamentally different than other chat platforms.</p> +<p>Instead, SimpleX Chat assigns these identifiers to unidirectional message queues. What looks to SimpleX Chat users like contacts and groups [1], to SimpleX servers looks like an unorganized and unrelated collection of unidirectional message queues. Our servers do not know which queues belong to which users, contacts or groups. Even a single conversation can happen via two different servers (one for sent and another for received messages). This makes our personal network of contacts invisible to the servers.</p> +<p>But it also creates a problem for instant notifications - all push notification services require having a device token.</p> +<p>So, how can we operate without identities and still have instant notifications?</p> +<p>[1] yes, we have groups in our terminal app, and the UI to manage them is coming to mobile apps soon. Some users have already firgured out how to <a href="https://medium.com/@vsevolod.mineev/how-to-collaborate-across-multiple-devices-whilst-protecting-your-metadata-371af87d0ba0">create groups via chat console</a>.</p> +<h2 id="weve-cracked-it-for-android" tabindex="-1">We've cracked it for Android!</h2> +<p>After some research into how push notifications work on Android, and open-source alternatives to Google push notifications, we discovered how to avoid sharing device tokens with any servers.</p> +<p>We have implemented message reception as a background service (in Android terminology, a &quot;foreground service&quot; showing a notification icon when the service is running) following the same design as <a href="https://github.com/binwiederhier/ntfy-android">ntfy.sh</a> created by <a href="https://github.com/binwiederhier">Philipp Heckel</a>, who, in turn, credits the design to <a href="https://robertohuertas.com/2019/06/29/android_foreground_services/">the blog post by Roberto Huertas</a>. Big thanks to them!</p> +<p>How does it work? When the app is first started on an Android device, it starts the background service that keeps the TCP connections to the messaging servers open with almost no traffic (only doing periodic checks that connections still exist). It consumes only a few percents of battery per day, depending on how stable your internet connection is, and delivers message notifications as soon as messages arrive.</p> +<p>This service continues running when the app is switched off, and it is restarted when the device is restarted even if you don't open the app - so the message notifications arrive instantly every time. To maximize battery life, it can be turned off by switching off &quot;Private notifications&quot;. You will still receive notifications while the app is running or in the background.</p> +<p>So, for Android we can now deliver instant message notifications without compromising users' privacy in any way. The app version 1.5 that includes private instant notifications is now available on <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Play Store</a>, in our <a href="https://app.simplex.chat/">F-Droid repo</a> and via direct <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK</a> downloads!</p> +<p>Please let us know what needs to be improved - it's only the first version of instant notifications for Android!</p> +<h2 id="ios-notifications-require-a-server" tabindex="-1">iOS notifications require a server</h2> +<p>iOS is much more protective of what apps are allowed to run on the devices, and the solution that worked on Android is not viable on iOS.</p> +<p>We already have background refresh in the iOS app that periodically checks for new messages, and if you use the app every day it delivers notifications within 10 or 20 minutes. It is not instant, but it may be usable for some. If you use the app infrequently, however, this delay can become several hours, or your phone may stop checking for the new messages completely. This is not ideal!</p> +<p>The only solution known to us is using Apple's push notifications service (APN) to deliver push notifications.</p> +<p>We planned for it, so we added to <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 of SMP</a> (the protocol used by our servers) an extension allowing the client to subscribe to notifications from message queues, via separate queue addresses, and using separate cryptographic keys for each queue. This has to be enabled by the client for each queue separately. We haven't used this extension so far, and now we are building a SimpleX notification service based on it.</p> +<p>If the user enables push notifications, then for each contact the app would enable a notification subscription and pass credentials to the notification server together with the device token required to deliver push notifications to user's device.</p> +<p>The notification server will subscribe to these notifications from SMP servers. The notifications do not include any message content, only the signal that a message has arrived to the server. Notification server is only allowed to send 2-3 hidden notifications per hour to the device. The notification is end-to-end encrypted and contains information about which server has a message, so that the client can connect to the server, retrieve and decrypt the message, and show the notification to the users including sender name and the message content. None of this information is shared with any server.</p> +<p>If the user receives more than 2-3 messages per hour, the notification server can send additional visible notifications that would simply say &quot;you have a new message&quot;, and the user will have to open the app to receive and see these messages. We are also investigating whether we can use &quot;mutable-content&quot; notifications that allow doing some processing when the notification arrives before showing it to the users.</p> +<p>It is a substantial amount of development, we are aiming to release it later this month.</p> +<p>This design is a compromise between privacy and convenience. The notification server will have to have a device token to deliver notifications. Several things we did (or plan to do) to improve this compromise:</p> +<ol> +<li>The notification server will only store device tokens and queue addresses in memory, making it more complex for a potential attacker to access. If server has to be restarted, they would lose all configured notification subscriptions and the clients would have to create them again. We will program the clients to periodically check for the existence of notification subscriptions on the notification server.</li> +<li>The notificaiton server will not know the addresses of the messaging queues used to receive or send messages. A different address is used to subscribe to notifications. So while the notification server would have the knowledge of how many queues your device has (and on which servers), it still won't know who is sending you the messages.</li> +<li>We are also planning to split the logic of notification subscriptions and delivering notifications to the devices to two different servers. The server that subscribes to the notifications could be self-hosted, allowing you full control of how you deploy it. Only this server would know which messaging servers you use or how many messaging queues you have. The server that delivers notifications to the devices will be managed by SimpleX Chat as we have to authorize it with Apple's push notification service. This split will not be available in the first release. We plan to add it a bit later.</li> +</ol> +<p>So, with the notification servers added, our network design will look like this:</p> +<pre><code> User's iOS device Internet Servers +--------------------- | ------------------------ | ------------------------- + | | + | | (can be self-hosted now) ++--------------+ | | +----------------+ +| SimpleX Chat | -------------- TLS --------------- | SimpleX | +| client |------&gt; SimpleX Messaging Protocol (SMP) ---&gt; | Messaging | ++--------------+ ---------------------------------- | Server | + ^ | | | +----------------+ + | | | | | | + | | | | | S | T + | | | | | M | L + | | | | | P | S + | | | | | | + | | | | +----------------+ +----------------+ + | | -------------- TLS --------------- | SimpleX | | SimpleX | + | |-----------&gt; Notifications management ----&gt; | Notifications | ----&gt; | Push | + | ---------------------------------- | Subscriber | | Server | + | | | +----------------+ +----------------+ + | | | (can be self-hosted | + | | | in the future) | + | | | V + | -------------- TLS --------------- +-----------------+ + |----------------- Notification delivery &lt;----------------------------- | Apple PN server | + ---------------------------------- +-----------------+ + | | +</code></pre> +<p>Please let us know what you think about this design and about this privacy / usability trade-off:</p> +<ul> +<li>For you, is this an acceptable compromise, if you can choose to disable instant notifications?</li> +<li>Do you have any ideas about how this design could be improved upon?</li> +</ul> +<p>Thank you!</p> + + + Mon, 04 Apr 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html + + + SimpleX announces SimpleX Chat mobile apps for iOS and Android + https://simplex.chat/blog/20220308-simplex-chat-mobile-apps.html + <h1 id="simplex-announces-simplex-chat-mobile-apps-for-ios-and-android" tabindex="-1">SimpleX announces SimpleX Chat mobile apps for iOS and Android</h1> +<p><strong>Published:</strong> March 8, 2022</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-it-has-no-access-to-your-connections-graph" tabindex="-1">SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections graph</h2> +<p>We have now released iPhone and Android apps to <a href="https://apps.apple.com/us/app/simplex-chat/id1605771084">Apple AppStore</a> and <a href="https://play.google.com/store/apps/details?id=chat.simplex.app">Google Play Store</a>, <a href="https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk">APK for Android</a> is also available for direct download.</p> +<p><strong>Please note</strong>: the current version is only supported on iPhone 8+ and on Android 10+ - we are planning to add support for iPad and older devices very soon, and we will announce it on our <a href="https://www.reddit.com/r/SimpleXChat/">Reddit</a> and <a href="https://twitter.com/SimpleXChat">Twitter</a> channels - please subscribe to follow our updates there.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter.</p> +<p>We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">in SimpleX platform overview</a>.</p> +<h2 id="why-we-are-building-it" tabindex="-1">Why we are building it</h2> +<p>Evgeny (SimpleX Chat founder): I have been working on this platform for a long time to provide a place where all people can communicate freely with each other, without fear of persecution because of what they said and who they are connected with. Not sharing information about your connections is very important, particularly for people living in oppressive regimes. Because of the terrible conflict between Russia and Ukraine, people of both countries – I have friends and family there – could be at risk when sharing their opinions or just from being connected to people who were prosecuted. Every messenger app that knows who you are can end up sharing all of your connections with undesirable third parties, either as a result of a court order or as a result of attack - so even Signal, which has strong encryption, cannot protect your connection graph. I hope our messenger can help people living in the oppressive regimes to express their opinions without fear and risk of prosecution.</p> +<h2 id="huge-thanks-to-our-testers" tabindex="-1">Huge thanks to our testers!</h2> +<p>Thanks a lot to everybody who helped testing and improving the apps!</p> +<p>If you have a <a href="https://testflight.apple.com/join/DWuT2LQu">TestFlight version</a> installed you can continue using it.</p> +<p>We plan to keep it as stable as we can, and it will give you access to all new features 1-2 weeks earlier - it's limited to 10,000 users, so you can grab it while it's available. You can still communicate with people who use a public version – we are committed to maintaining backwards compatibility.</p> +<p>You can always migrate from a public App Store version to a TestFlight version. The opposite migration - from TestFlight to public version - is only possible when we have the same app versions released, as there are usually some database migrations that cannot be reversed. To migrate to public version you have to disable automatic updates on TestFlight, wait until public version catches up and then install it from App Store. In any case, it is safe installing the public version, but it might crash if you have a newer version from TestFlight - in this case you just need to re-install the app from TestFlight and install App Store version a bit later - you would not lose any of your data.</p> +<h2 id="its-not-all-new-our-core-code-has-been-used-for-a-long-time-by-a-few-thousand-people-in-our-terminal-app" tabindex="-1">It's not all new - our core code has been used for a long time by a few thousand people in our terminal app.</h2> +<p>The apps use the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 earlier this year:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption.</li> +<li>separate keys for each contact.</li> +<li>additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).</li> +<li>additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).</li> +</ul> +<p>You can read more technical details in our recent <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a>.</p> +<p>A big thank you to <a href="https://github.com/angerman">@angerman</a> for making it possible to compile our Haskell code to mobile platforms and getting it approved on app stores - it has been a non-trivial project, and it is still ongoing.</p> +<h2 id="install-the-apps-and-make-a-private-connection" tabindex="-1">Install the apps and make a private connection!</h2> +<p>Once you install the app, you can connect to anybody:</p> +<ol> +<li>Create your local chat profile - it is not shared with SimpleX servers, it is local to your devices, and it will be shared with your contacts when you connect.</li> +<li>To make a private connection, you need to create a one-time connection link / QR code via &quot;Add contact&quot; button in the app. You can either show the QR code to your contact in person or via a video call - this is the most secure way to create a connection - or you can share the link via any other channel - only one user can connect via this link.</li> +<li>Once another user scans the QR code or opens the app via the link (they also should create their profile first) the connection will be created and you can send e2e encrypted messages privately, without anybody knowing you are connected.</li> +</ol> +<h2 id="new-features-and-improvements-that-are-coming-soon" tabindex="-1">New features and improvements that are coming soon</h2> +<ul> +<li>push notification server. Currently the apps load messages in the background periodically, that can be quite infrequent on iOS if you don't open the app regularly. With push notifications you would know about the new messages instantly.</li> +<li>e2e encrypted audio and video calls via WebRTC.</li> +<li>export and import of the chat database.</li> +<li>&quot;reply to message&quot; - feature allowing you to quote the message you are replying to.</li> +<li>localization - we will let you know once you can contribute the translations to your languages.</li> +<li>configuring your servers in the apps - this will be released this week, both for iOS and Android. By default the apps are using SimpleX Chat servers, but you will be able to configure your own and still be connected to other users who use our app with our servers.</li> +<li>user profile images.</li> +<li>sending images and files - image preview will be sent via the servers, so it can be asynchronous, and large files/full resolution images via WebRTC, so both devices will have to be online.</li> +</ul> +<p>Please let us know what else you think is important and if you find any bugs.</p> + + + Tue, 08 Mar 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220308-simplex-chat-mobile-apps.html + + + SimpleX announces SimpleX Chat public beta for iOS + https://simplex.chat/blog/20220214-simplex-chat-ios-public-beta.html + <h1 id="simplex-announces-simplex-chat-public-beta-for-ios" tabindex="-1">SimpleX announces SimpleX Chat public beta for iOS</h1> +<p><strong>Published:</strong> Feb 14, 2022</p> +<h2 id="private-and-secure-chat-and-application-platform-public-beta-is-now-available-for-iphones-with-ios-15" tabindex="-1">Private and secure chat and application platform - <a href="https://testflight.apple.com/join/DWuT2LQu">public beta is now available</a> for iPhones with iOS 15.</h2> +<p>Our new iPhone app is very basic - right now it only supports text messages and emojis.</p> +<p>Even though the app is new, it uses the same core code as our terminal app, that was used and stabilized over a long time, and it provides the same level of privacy and security that has been available since the release of v1 a month ago:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption.</li> +<li>separate keys for each contact.</li> +<li>additional layer of E2E encryption in each message queue (to prevent traffic correlation when multiple queues are used in a conversation - something we plan later this year).</li> +<li>additional encryption of messages delivered from servers to recipients (also to prevent traffic correlation).</li> +</ul> +<p>You can read more details in our recent <a href="https://simplex.chat/blog/20220112-simplex-chat-v1-released.html">v1 announcement</a>.</p> +<h2 id="join-our-public-beta" tabindex="-1">Join our public beta!</h2> +<p>Install the app <a href="https://testflight.apple.com/join/DWuT2LQu">via TestFlight</a>, connect to us (via <strong>Connect to SimpleX team</strong> link in the app) and to a couple of your friends you usually send messages to - and please let us know what you think!</p> +<p>We would really appreciate any feedback to improve the app and to decide which additional features should be included in our public release in March.</p> +<p>Should it be:</p> +<ul> +<li>images,</li> +<li>link previews,</li> +<li>or maybe something else we couldn't think of.</li> +</ul> +<p>Please vote on the features you think are the most needed in our <a href="https://app.loopedin.io/simplex">app roadmap</a>.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter.</p> +<p>We aim to provide the best possible protection of messages and metadata. Today there is no messaging application that works without global user identities, so we believe we provide better metadata privacy than alternatives. SimpleX is designed to be truly distributed with no central server, and without any global user identities. This allows for high scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which is available for terminal (command line in Windows/Mac/Linux) and as iOS public beta - with Android app coming in a few weeks. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<p>SimpleX also allows people to host their own servers to have control of their chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages). It should be considered though that while self-hosting the servers provides more control, it may reduce meta-data privacy, as it is easier to correlate the traffic of servers with small number of messages coming through.</p> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">in SimpleX platform overview</a>.</p> + + + Mon, 14 Feb 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220214-simplex-chat-ios-public-beta.html + + + SimpleX announces SimpleX Chat v1 + https://simplex.chat/blog/20220112-simplex-chat-v1-released.html + <h1 id="simplex-announces-simplex-chat-v1" tabindex="-1">SimpleX announces SimpleX Chat v1</h1> +<p><strong>Published:</strong> Jan 12, 2022</p> +<h2 id="the-most-private-and-secure-chat-and-application-platform" tabindex="-1">The most private and secure chat and application platform</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a messaging application built on the SimpleX platform.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>There is currently no messaging application which respects user privacy and guarantees metadata privacy - in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v1" tabindex="-1">What's new in v1?</h2> +<h3 id="stable-protocol-implementation" tabindex="-1">Stable protocol implementation</h3> +<p>All releases from v1 onwards will be forwards and backwards compatible.</p> +<h3 id="message-encryption-has-been-completely-re-engineered-to-provide-forward-secrecy-and-recovery-from-break-in" tabindex="-1">Message encryption has been completely re-engineered to provide forward secrecy and recovery from break-in.</h3> +<p>SimpleX Chat v1 now uses:</p> +<ul> +<li><a href="https://www.signal.org/docs/specifications/doubleratchet/">double-ratchet</a> E2E encryption using AES-256-GCM cipher with <a href="https://www.signal.org/docs/specifications/x3dh/">X3DH key agreement</a> using 2 ephemeral Curve448 keys to derive secrets for ratchet initialization. These keys and secrets are separate for each contact, group membership and file transfer.</li> +<li>in addition to double ratchet, there is a separate E2E encryption in each message queue with DH key exchange using Curve25519 and <a href="https://nacl.cr.yp.to/index.html">NaCl crypto-box</a> - separate E2E encryption has been added to avoid having any cipher-text in common between message queues of a single contact (to prevent traffic correlation).</li> +<li>additional encryption of messages delivered from servers to recipients, also using Curve25519 DH exchange and NaCl crypto-box - to avoid shared cipher-text in sent and received traffic (also to prevent traffic correlation).</li> +</ul> +<h3 id="improved-user-and-server-authentication-and-transport" tabindex="-1">Improved user and server authentication and transport</h3> +<p>SimpleX now uses ephemeral Ed448 keys to sign and verify client commands to the servers. As before, these keys are different per message queue and do not represent a user's identity.</p> +<p>Instead of ad-hoc encrypted transport we now use TLS 1.2+ limited to the most performant and secure cipher with forward secrecy (ECDHE-ECDSA-CHACHA20POLY1305-SHA256), Curve448 groups and Ed448 keys.</p> +<p>Server identity is validated as part of TLS handshake - the fingerprint of offline server certificate is used as a permanent server identity which is included in server address, to protect against MITM attacks between clients and servers.</p> +<p>SimpleX also uses <a href="https://datatracker.ietf.org/doc/html/rfc5929#section-3">tls-unique channel binding</a> in each signed client command to the server to protect against replay attacks.</p> +<h3 id="changes-in-protocol-encoding" tabindex="-1">Changes in protocol encoding</h3> +<p>We switched from inefficient text-based low level protocol encodings, that simplified early development, to space and performance efficient binary encodings, reducing protocol overhead from circa 15% to 3.7% of transmitted application message size.</p> +<h2 id="learn-more-about-simplex" tabindex="-1">Learn more about Simplex</h2> +<p>Further details on platform objectives and technical design are available <a href="https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md">here</a>.</p> +<p>SimpleX Chat client can be used in the terminal on all major desktop platforms (Windows/Mac/Linux) and also on Android devices with <a href="https://github.com/termux">Termux</a>.</p> +<p>SimpleX also allows people to host their own servers and own their own chat data. SimpleX servers are exceptionally lightweight and require a single process with the initial memory footprint of under 20 Mb, which grows as the server adds in-memory queues (even with 10,000 queues it uses less than 50Mb, not accounting for messages).</p> +<h2 id="we-look-forward-to-you-using-it" tabindex="-1">We look forward to you using it!</h2> +<p>We look forward to your feedback and suggestions - via GitHub issues or via SimpleX Chat - you can connect to the team with <code>/simplex</code> command once you run the chat.</p> + + + Wed, 12 Jan 2022 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20220112-simplex-chat-v1-released.html + + + SimpleX announces SimpleX Chat v0.5 + https://simplex.chat/blog/20211208-simplex-chat-v0.5-released.html + <h1 id="simplex-announces-simplex-chat-v05" tabindex="-1">SimpleX announces SimpleX Chat v0.5</h1> +<p><strong>Published:</strong> Dec 08, 2021</p> +<h2 id="simplex-chat-is-the-first-chat-platform-that-is-100percent-private-by-design-simplex-no-access-to-your-connections-graph" tabindex="-1">Simplex Chat is the first chat platform that is 100% private by design - SimpleX no access to your connections graph</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v05" tabindex="-1">What's new in v0.5?</h2> +<h3 id="long-term-chat-addresses" tabindex="-1">Long-term chat addresses</h3> +<p>Users can now create long-term chat addresses that they can share with many people (e.g. in email signature, or online), so that any chat user can send them a connection request.</p> +<p>This is an ALPHA feature, and we have not yet added any protection against spam contact requests. However, if the address you created starts receiving spam connection requests, you can simply delete it without losing any of your accepted connections and create another address - as many times as you like!</p> +<h2 id="we-need-your-help" tabindex="-1">We need your help!</h2> +<p>We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!</p> +<p><strong>Please note:</strong> SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.</p> +<p>Our goal is to create a new kind of chat platform that lets you control your chat!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/rc0xkn/simplex_chat_the_first_chat_platform_that_is_100/">https://www.reddit.com/r/haskell/comments/rc0xkn/simplex_chat_the_first_chat_platform_that_is_100/</a></p> + + + Wed, 08 Dec 2021 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20211208-simplex-chat-v0.5-released.html + + + SimpleX announces SimpleX Chat v0.4 + https://simplex.chat/blog/20210914-simplex-chat-v0.4-released.html + <h1 id="simplex-announces-simplex-chat-v04" tabindex="-1">SimpleX announces SimpleX Chat v0.4</h1> +<p><strong>Published:</strong> Sep 14, 2021</p> +<h2 id="open-source-decentralized-chat-that-uses-privacy-preserving-message-routing-protocol" tabindex="-1">Open-source decentralized chat that uses privacy-preserving message routing protocol</h2> +<p>We are building a new platform for distributed Internet applications where privacy of the messages <em>and</em> the network matter. <a href="https://github.com/simplex-chat/simplex-chat">SimpleX Chat</a> is our first application, a chat application built on the SimpleX platform that serves as an example of the power of the platform and as a reference application.</p> +<h2 id="what-is-simplex" tabindex="-1">What is SimpleX?</h2> +<p>We recognised that there is currently no messaging application which respects user privacy and guarantees metadata privacy -- in other words, messages could be private, but a third party can always see who is communicating with whom by examining a central service and the connection graph. SimpleX, at it's core, is designed to be truly distributed with no central server. This allows for enormous scalability at low cost, and also makes it virtually impossible to snoop on the network graph.</p> +<p>The first application built on the platform is Simplex Chat, which for now is terminal (command line) based with mobile apps in the pipeline. The platform can easily support a private social network feed and a multitude of other services, which can be developed by the Simplex team or third party developers.</p> +<h2 id="whats-new-in-v05" tabindex="-1">What's new in v0.5?</h2> +<p>We're exicted to announce that SimpleX Chat now supports group chat and file transfer!</p> +<h3 id="chat-groups" tabindex="-1">Chat groups</h3> +<p>To create a group use the <code>/g &lt;group&gt;</code> command. You can then invite contacts to the group by entering the <code>/a &lt;group&gt; &lt;name&gt;</code> command. Your contact(s) will need to use the <code>/j accept</code> command to accept the invitation to the group. To send messages to the group, simply enter <code>#&lt;group&gt; &lt;message&gt;</code>.</p> +<p><strong>Please note:</strong> Groups are not stored on any server; they are maintained as a list of members in the app database. Sending a message to the group sends a message to each member of the group.</p> +<p><img src="https://simplex.chat/blog/images/groups.gif" alt="simplex-chat" /></p> +<h3 id="file-transfer" tabindex="-1">File transfer</h3> +<p>Sharing files is simple! To send a file to a contact, use the <code>/f @&lt;contact&gt; &lt;file_path&gt;</code> command. The recipient will have to accept before the file is sent.</p> +<p><img src="https://simplex.chat/blog/images/files.gif" alt="simplex-chat" /></p> +<h2 id="were-always-looking-for-help" tabindex="-1">We're always looking for help!</h2> +<p>We'd really appreciate your comments, criticism and support - a star on the GitHub repo, downloading and testing the chat or any contribution to the project will help a lot – thank you for all your support!</p> +<p><strong>Please note:</strong> SimpleX Chat is in early stage development: we are still iterating protocols, improving privacy and security, so if you have communication scenarios requiring high security, you should consider some other options for now.</p> +<p>Our goal is to create a new kind of chat platform that lets you control your chat!</p> +<p>Originally published at <a href="https://www.reddit.com/r/selfhosted/comments/poal79/simplex_chat_an_opensource_decentralized_chat/">https://www.reddit.com/r/selfhosted/comments/poal79/simplex_chat_an_opensource_decentralized_chat/</a></p> + + + Tue, 14 Sep 2021 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20210914-simplex-chat-v0.4-released.html + + + Announcing SimpleX Chat Prototype! + https://simplex.chat/blog/20210512-simplex-chat-terminal-ui.html + <h1 id="announcing-simplex-chat-prototype" tabindex="-1">Announcing SimpleX Chat Prototype!</h1> +<p><strong>Published:</strong> May 12, 2021</p> +<p>For the last six months <a href="https://github.com/epoberezkin">me</a> and my son Efim have been working to bring you a working prototype of SimpleX Chat. We're excited to announce SimpleX Chat terminal client is now available <a href="https://github.com/simplex-chat/simplex-chat">here</a> on Linux, Windows and Mac (you can either build from source or download the binary for Linux, Windows or Mac from the latest release).</p> +<p>We’ve been using the terminal client between us and a few other people for a couple of months now, eating our own “dog food”, and have developed up to version 0.3.1, with most of the messaging protocol features we originally planned</p> +<h2 id="features" tabindex="-1">Features</h2> +<ul> +<li>End-to-end encryption with protection from man in the middle attack. The connection invitation must be passed out-of-band (see <a href="https://github.com/simplex-chat/simplex-chat#how-to-use-simplex-chat">how to use SimpleX Chat</a> in the repo).</li> +<li>No global identity or any usernames visible to the server(s), ensuring full privacy of your contacts and conversations.</li> +<li>Message signing and verification with automatically generated RSA keys, with keys being unique per each connection.</li> +<li>Authorization of each command/message by the servers with automatically generated RSA key pairs, also unique per connection.</li> +<li>Message integrity validation (via passing the digests of the previous messages).</li> +<li>Encrypted TCP transport, independent of certificates.</li> +<li>You can deploy your own server, but you don’t have to - the demo SMP server to relay your messages is available at <a href="http://smp1.simplex.im:5223/">smp1.simplex.im:5223</a> (pre-configured in the client).</li> +</ul> +<h2 id="we-need-your-help" tabindex="-1">We need your help!</h2> +<p>We're building a new kind of chat network - the only network that lets you control your chat. We'd really appreciate your feedback, criticism and support - a star on the github repo, signing up to the mailing list or any contribution to the project will help. There is so much more to do!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/naw6lz/simplex_chat_prototype_terminal_ui_made_in_haskell/">https://www.reddit.com/r/haskell/comments/naw6lz/simplex_chat_prototype_terminal_ui_made_in_haskell/</a></p> + + + Wed, 12 May 2021 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20210512-simplex-chat-terminal-ui.html + + + Simplex Chat + https://simplex.chat/blog/20201022-simplex-chat.html + <h1 id="simplex-chat" tabindex="-1">Simplex chat</h1> +<p><strong>Published:</strong> Oct 22, 2020</p> +<p><a href="https://simplex.chat/">https://simplex.chat</a></p> +<p>I'd really appreciate your feedback, criticism and suggestions on the open-source idea I was slowly working on since early 2020. I recently made the demo server for the low-level message queue protocol (&quot;simplex messaging protocol&quot;) and the website to try to explain the chat idea that would use this protocol.</p> +<p>Haskell protocol implementation: <a href="https://github.com/simplex-chat/simplexmq">https://github.com/simplex-chat/simplexmq</a></p> +<p>In short, the protocol defines a minimalist set of commands and server responses (just 7 commands and 5 responses sent over TCP) to operate encrypted message queues with in-memory persistence - the implementation uses STM.</p> +<p>If anything, it was definitely helping to get to know Haskell types etc. much deeper than before :)</p> +<p>Any criticism would be great - thank you in advance!</p> +<p>Originally published at <a href="https://www.reddit.com/r/haskell/comments/jg6uh4/simplex_chat/">https://www.reddit.com/r/haskell/comments/jg6uh4/simplex_chat/</a></p> + + + Thu, 22 Oct 2020 00:00:00 +0000 + + SimpleX Chat + https://simplex.chat/blog/20201022-simplex-chat.html + + + \ No newline at end of file diff --git a/fi/contact/index.html b/fi/contact/index.html new file mode 100644 index 0000000000..0273d419f1 --- /dev/null +++ b/fi/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Sait osoitteen yhdistämistä varten SimpleX Chatissa

+

Yhteyden muodostaminen:

+ +
+

Asenna SimpleX-sovellus

+
+ + + +
+ +
+

1

+
+
+ +
+

Yhdisty sovelluksessa

+ + + Avaa Simplex-sovellus + +
+

2

+
+
+ +
+

Napauta sovelluksessa olevaa ‘yhdistä’-painiketta

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Liity SimpleX

+

Kutsumme sinut mukaan keskusteluun

+ + + +

Tilaa päivityksemme

+ +
+ + + +
+ +
+ +

Hanki SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fi/fdroid/index.html b/fi/fdroid/index.html new file mode 100644 index 0000000000..0dd7a4b7c7 --- /dev/null +++ b/fi/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat F-Droidin kautta

+ +
+ +
+

SimpleX Chat -varasto

+
+
+

Kehittäjien luomat vakaat ja beta-versiot

+

Lisätäksesi sen F-Droid-asiakkaaseesi, skannaa QR-koodi tai käytä tätä URL-osoitetta:

+ + https://app.simplex.chat/fdroid/repo + +

+ Allekirjoitusavaimen sormenjälki (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org -varasto

+ +

Vakioversiot luotu F-Droid.org -varastoon

+

Julkaisut tälle varastolle tehdään 1-2 päivää myöhemmin.

+

SimpleX Chat ja F-Droid.org -varastot allekirjoittavat buildit eri avaimilla. Vaihtaaksesi, vienti keskustelutietokanta ja asenna sovellus uudelleen.

+
+
+ +
+
+ + + + + + + + + + diff --git a/fi/index.html b/fi/index.html new file mode 100644 index 0000000000..d75b29ef62 --- /dev/null +++ b/fi/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/fi/invitation/index.html b/fi/invitation/index.html new file mode 100644 index 0000000000..76416134a8 --- /dev/null +++ b/fi/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Sait kertalinkini yhdistämistä varten SimpleX Chatissa

+

Yhteyden muodostaminen:

+ +
+

Asenna SimpleX-sovellus

+
+ + + +
+ +
+

1

+
+
+ +
+

Yhdisty sovelluksessa

+ + + Avaa Simplex-sovellus + +
+

2

+
+
+ +
+

Napauta sovelluksessa olevaa ‘yhdistä’-painiketta

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Liity SimpleX

+

Kutsumme sinut mukaan keskusteluun

+ + + +

Tilaa päivityksemme

+ +
+ + + +
+ +
+ +

Hanki SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fi/learn-more/index.html b/fi/learn-more/index.html new file mode 100644 index 0000000000..31d378dcc0 --- /dev/null +++ b/fi/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Miksi SimpleX on ainutlaatuinen

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Sinulla on täydellinen yksityisyys

+
+ +
+ +
+

+ SimpleX suojaa profiilisi, yhteystietosi ja metatietosi yksityisyyden, piilottaen ne SimpleX-alustan palvelimilta ja kaikilta havainnoijilta. +

+

+ Toisin kuin millään muulla olemassa olevalla viestintäalustalla, SimpleX:llä ei ole tunnisteita käyttäjille — ei edes satunnaisia numeroita. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Olet suojattu roskapostilta ja väärinkäytöksiltä

+
+ +
+ +
+

+ Koska sinulla ei ole tunnistetta tai kiinteää osoitetta SimpleX-alustalla, kukaan ei voi ottaa sinuun yhteyttä, ellet jaa kertakäyttöistä tai väliaikaista käyttäjäosoitetta, kuten QR-koodia tai linkkiä. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sinä hallitset tietojasi

+
+ +
+ +
+

+ SimpleX tallentaa kaikki käyttäjätiedot asiakaslaitteille siirrettävässä salatussa tietokannan muodossa — se voidaan siirtää toiseen laitteeseen. +

+

+ Päästä päähän salatut viestit säilytetään väliaikaisesti SimpleX-releay-palvelimilla, kunnes ne vastaanotetaan, minkä jälkeen ne poistetaan pysyvästi. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Omistat SimpleX-verkon

+
+ +
+ +
+

+ SimpleX-verkko on täysin hajautettu ja riippumaton mistään kryptovaluutasta tai mistään muusta alustasta paitsi Internetistä. +

+

+ Voit käyttää SimpleX:ää omien palvelimiesi kanssa tai meidän tarjoamillamme palvelimilla — ja silti yhdistyä mihin tahansa käyttäjään. +

+ +
+ + + Lue lisää + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Ominaisuudet

+ +
+ +
+
+ + +
+

Päästä päähän salattuja viestejä markdownin ja muokkaamisen kera

+
+ +
+
+ + +
+

Päästä päähän salattuja
kuvia, videoita ja tiedostoja

+
+ +
+
+ + +
+

E2E-salatut hajautetut ryhmät — vain käyttäjät tietävät niiden olemassaolosta

+
+ +
+
+ + +
+

Päästä päähän salattuja ääniviestejä

+
+ +
+
+ + +
+

Katoavia viestejä

+
+ +
+
+ + +
+

Päästä päähän salattuja
puheluita ja videopuheluja

+
+ +
+
+ + +
+

Kannettava salattu sovellustallennus — siirrä profiili toiseen laitteeseen

+
+ +
+
+ + +
+

Incognito-tila —
ainutlaatuinen SimpleX Chatille

+
+ +
+
+
+ + +
+
+

Mikä tekee SimpleX:stä yksityisen

+ +
+
+ + +
+
+ + +
+
+

Väliaikaiset nimettömät parittaiset tunnisteet

+
+ +

SimpleX käyttää väliaikaisia nimettömiä parittaisia osoitteita ja tunnistetietoja jokaiselle käyttäjäkontaktille tai ryhmän jäsenelle.

+ +

Se mahdollistaa viestien toimittamisen ilman käyttäjäprofiilitunnisteita, tarjoten paremman metatietosuojan kuin vaihtoehdot.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Avainvaihto kanavan ulkopuolella
(out-of-band)

+
+ +

Monet viestintäalustat ovat alttiita välikäden hyökkäyksille palvelimilta tai verkko-operaattoreilta.

+ +

Estääkseen sen, SimpleX-sovellukset siirtävät yksittäiset avaimet kanavan ulkopuolella, kun jaat osoitteen linkkinä tai QR-koodina.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

2 kerrosta päästä päähän salattua viestintää

+
+ +

Kaksoisruuviprotokolla —
OTR-viestintä täydellisellä eteenpäinsalauksella ja murron palautuksella.

+ +

NaCL-kryptolaatikko kussakin jonossa estämään liikenteen korrelaatiota viestijonojen välillä, jos TLS vaarantuu.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Viestin eheys
vahvistus

+
+ +

Viestien eheyden varmistamiseksi ne numeroituvat peräkkäin ja sisältävät edellisen viestin tiivisteen.

+ +

Jos viestiä lisätään, poistetaan tai muutetaan, vastaanottaja saa ilmoituksen.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Lisäkerros palvelimen salaukselle

+
+ +

Lisäkerros palvelimen salaukselle vastaanottajalle toimittaessa, jotta lähetetyn ja vastaanotetun palvelinliikenteen korrelaatio estyy, jos TLS vaarantuu.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Viestien sekoitus
korrelaation vähentämiseksi

+
+ +

SimpleX-palvelimet toimivat matalan viiveen sekoitussolmuina — saapuvilla ja lähtevillä viesteillä on erilainen järjestys.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Turvallinen tunnistettu
TLS-tiedonsiirto

+
+ +

Vain TLS 1.2/1.3 vahvoilla algoritmeilla käytetään asiakas-palvelin-yhteyksiin.

+ +

Palvelimen sormenjälki ja kanavan sitominen estävät välikäden hyökkäykset ja toistohyökkäykset.

+ +

Yhteyden jatkaminen on estetty istuntohyökkäysten estämiseksi.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Vaihtoehtoinen pääsy Torin kautta

+
+ +

Suojataksesi IP-osoitettasi, voit käyttää palvelimia Tor-verkon tai jonkin muun kuljetuskerroksen päällä.

+ +

Käyttääksesi SimpleX:ää Torin kautta, asenna Orbot-sovellus ja ota käyttöön SOCKS5-välityspalvelin (tai VPN iOS:lla).

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Yksisuuntaisia
viestijonoja

+
+ +

Jokainen viestijono siirtää viestejä yhteen suuntaan, eri lähettävillä ja vastaanottavilla osoitteilla.

+ +

Se vähentää hyökkäysvektoreita verrattuna perinteisiin viestivälittimiin ja saatavilla oleviin metatietoihin.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Useita tasoja
sisältöpakkauksia

+
+ +

SimpleX käyttää sisältöpakkauksia jokaiselle salauskerrokselle estämään viestikoon hyökkäyksiä.

+ +

Se saa erikokoiset viestit näyttämään samalta palvelimille ja verkon tarkkailijoille.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Verkko

+

Simplex Chat tarjoaa parhaan yksityisyyden yhdistämällä P2P-verkkojen ja liitettävien verkkojen edut.

+ +
+
+
+ + +
+
+

Toisin kuin P2P-verkot

+

+ Kaikki viestit lähetetään palvelimien kautta, mikä sekä parantaa metatietojen yksityisyyttä että mahdollistaa luotettavan asynkronisen viestien toimituksen, samalla välttäen monia P2P-verkkojen ongelmia. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Toisin kuin liitettävät verkot

+

+ SimpleXin relea-palvelimet EIVÄT tallenna käyttäjäprofiileja, yhteystietoja ja toimitettuja viestejä, ne EIVÄT yhdisty toisiinsa, eikä ole OLE olemassa palvelinluetteloa. +

+
+
+ + + +
+
+ + +
+
+

SimpleX-verkko

+

+ palvelimet tarjoavat yksisuuntaisia jonopalveluja yhdistääkseen käyttäjät, mutta niillä ei ole näkyvyyttä verkon yhteyskarttaan — ainoastaan käyttäjillä on. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX selitetynä

+ + + + + + + +
+
+ +
+
1. Mitä käyttäjät kokevat
+
+ +

+ Voit luoda yhteyshenkilöitä ja ryhmiä sekä käydä kaksisuuntaisia keskusteluja kuten missä tahansa muussa viestisovelluksessa. +

+

+ Kuinka se voi toimia yksisuuntaisten jonotusten kanssa ilman käyttäjäprofiilin tunnisteita? +

+
+
+ +
+
2. Miten se toimii
+
+ +

+ Jokaista yhteyttä varten käytetään kahta erillistä viestintäjonon mahdollistavaa palvelinta viestien lähettämiseen ja vastaanottamiseen. +

+

+ Palvelimet välittävät viestejä vain yhteen suuntaan eivätkä saa kokonaiskuvaa käyttäjän keskustelusta tai yhteyksistä. +

+
+
+ +
+
3. Mitä palvelimet näkevät
+
+ +

+ Palvelimilla on erilliset anonyymit tunnistetiedot kullekin jonolle, eivätkä ne tiedä, mille käyttäjille ne kuuluvat. +

+

+ Käyttäjät voivat lisäksi parantaa metadata-yksityisyyttään käyttämällä Tor-verkkoa palvelimiin yhdistämiseen, mikä estää IP-osoitteen perusteella tapahtuvan yhteyksien tekemisen. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vertailu muihin protokolliin

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, suuret alustatXMPP, MatrixP2P-protokollat
Vaati globaalin identiteetinEi - yksityinenKyllä 1Kyllä 2Kyllä 3
Mahdollisuus MITM-hyökkäykseenEi - turvallinen 4Kyllä 5KylläKyllä
Riippuvuus DNS:stäEi - joustavaKylläKylläEi
Yksittäinen tai keskitetty verkkoEi - hajautettuKylläEi - liitetty 6Kyllä 7
Keskuskomponentti tai muu verkkoa koskeva hyökkäysEi - joustavaKylläKyllä 2Kyllä 8
+
+ +
+ +
+
+
    +
  1. Yleensä pohjautuu puhelinnumeroon, joissain tapauksissa käyttäjänimiin
  2. +
  3. DNS-pohjaiset osoitteet
  4. +
  5. Julkinen avain tai jokin muu maailmanlaajuisesti uniikki tunniste
  6. +
  7. SimpleXin releapalvelimet eivät voi vaarantaa päästä päähän -salausta. Tarkista turvakoodi hyödyntääksesi hyökkäyssuojaa ylitys-kanavalla
  8. +
  9. Jos operaattorin palvelimet ovat vaarantuneet. Tarkista turvakoodi Signalissa ja joissakin muissa sovelluksissa suojautuaksesi hyökkäykseltä
  10. +
  11. Ei suojaa käyttäjien metatietojen yksityisyyttä
  12. +
  13. Vaikka P2P-verkot ovat hajautettuja, ne eivät ole liitettäviä - ne toimivat yhtenä verkostona
  14. +
  15. P2P-verkoilla on joko keskitetty auktoriteetti tai koko verkko voidaan vaarantaa - katso täältä
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/fonts/GT-Walsheim/GT-Walsheim-Black-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Black-Oblique-Trial.woff2 new file mode 100644 index 0000000000..7a33ccda16 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Black-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Black-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Black-Trial.woff2 new file mode 100644 index 0000000000..a00de91663 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Black-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Bold-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Bold-Oblique-Trial.woff2 new file mode 100644 index 0000000000..4c43863ed1 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Bold-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Bold-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Bold-Trial.woff2 new file mode 100644 index 0000000000..a1454d4c49 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Bold-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Light-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Light-Oblique-Trial.woff2 new file mode 100644 index 0000000000..7c9016fe51 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Light-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Light-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Light-Trial.woff2 new file mode 100644 index 0000000000..fa0f587b7d Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Light-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Medium-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Medium-Oblique-Trial.woff2 new file mode 100644 index 0000000000..591591e14e Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Medium-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Medium-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Medium-Trial.woff2 new file mode 100644 index 0000000000..7783d7b366 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Medium-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Regular-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Regular-Oblique-Trial.woff2 new file mode 100644 index 0000000000..4051d603bb Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Regular-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Regular-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Regular-Trial.woff2 new file mode 100644 index 0000000000..dff026b58b Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Regular-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Thin-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Thin-Oblique-Trial.woff2 new file mode 100644 index 0000000000..0544874ddb Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Thin-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Thin-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Thin-Trial.woff2 new file mode 100644 index 0000000000..b408649278 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Thin-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Oblique-Trial.woff2 new file mode 100644 index 0000000000..4f9db2c532 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Trial.woff2 new file mode 100644 index 0000000000..d8c4f033f8 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Bold-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Oblique-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Oblique-Trial.woff2 new file mode 100644 index 0000000000..79b8ee7e85 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Oblique-Trial.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Trial.woff2 b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Trial.woff2 new file mode 100644 index 0000000000..b306ed8e43 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-Ultra-Light-Trial.woff2 differ diff --git a/fonts/GilroyBold/font.woff b/fonts/GilroyBold/font.woff new file mode 100644 index 0000000000..1f252b0ba5 Binary files /dev/null and b/fonts/GilroyBold/font.woff differ diff --git a/fonts/GilroyBold/font.woff2 b/fonts/GilroyBold/font.woff2 new file mode 100644 index 0000000000..687474f86e Binary files /dev/null and b/fonts/GilroyBold/font.woff2 differ diff --git a/fonts/GilroyLight/font.woff b/fonts/GilroyLight/font.woff new file mode 100644 index 0000000000..903d99d455 Binary files /dev/null and b/fonts/GilroyLight/font.woff differ diff --git a/fonts/GilroyLight/font.woff2 b/fonts/GilroyLight/font.woff2 new file mode 100644 index 0000000000..f4d4fc3e0c Binary files /dev/null and b/fonts/GilroyLight/font.woff2 differ diff --git a/fonts/GilroyMedium/font.woff b/fonts/GilroyMedium/font.woff new file mode 100644 index 0000000000..3dd51a978b Binary files /dev/null and b/fonts/GilroyMedium/font.woff differ diff --git a/fonts/GilroyMedium/font.woff2 b/fonts/GilroyMedium/font.woff2 new file mode 100644 index 0000000000..895b6d4f1b Binary files /dev/null and b/fonts/GilroyMedium/font.woff2 differ diff --git a/fonts/GilroyRegular/font.woff b/fonts/GilroyRegular/font.woff new file mode 100644 index 0000000000..115ae73dfc Binary files /dev/null and b/fonts/GilroyRegular/font.woff differ diff --git a/fonts/GilroyRegular/font.woff2 b/fonts/GilroyRegular/font.woff2 new file mode 100644 index 0000000000..24465fb7dc Binary files /dev/null and b/fonts/GilroyRegular/font.woff2 differ diff --git a/fonts/GilroyRegularItalic/font.woff b/fonts/GilroyRegularItalic/font.woff new file mode 100644 index 0000000000..1f69fc1e62 Binary files /dev/null and b/fonts/GilroyRegularItalic/font.woff differ diff --git a/fonts/GilroyRegularItalic/font.woff2 b/fonts/GilroyRegularItalic/font.woff2 new file mode 100644 index 0000000000..ef01c8d5d3 Binary files /dev/null and b/fonts/GilroyRegularItalic/font.woff2 differ diff --git a/fonts/Manrope/Manrope-Bold.ttf b/fonts/Manrope/Manrope-Bold.ttf new file mode 100644 index 0000000000..62a6183939 Binary files /dev/null and b/fonts/Manrope/Manrope-Bold.ttf differ diff --git a/fonts/Manrope/Manrope-ExtraBold.ttf b/fonts/Manrope/Manrope-ExtraBold.ttf new file mode 100644 index 0000000000..2fa671c215 Binary files /dev/null and b/fonts/Manrope/Manrope-ExtraBold.ttf differ diff --git a/fonts/Manrope/Manrope-ExtraLight.ttf b/fonts/Manrope/Manrope-ExtraLight.ttf new file mode 100644 index 0000000000..c55745a49b Binary files /dev/null and b/fonts/Manrope/Manrope-ExtraLight.ttf differ diff --git a/fonts/Manrope/Manrope-Light.ttf b/fonts/Manrope/Manrope-Light.ttf new file mode 100644 index 0000000000..8a771c26e1 Binary files /dev/null and b/fonts/Manrope/Manrope-Light.ttf differ diff --git a/fonts/Manrope/Manrope-Medium.ttf b/fonts/Manrope/Manrope-Medium.ttf new file mode 100644 index 0000000000..c6d28def6d Binary files /dev/null and b/fonts/Manrope/Manrope-Medium.ttf differ diff --git a/fonts/Manrope/Manrope-Regular.ttf b/fonts/Manrope/Manrope-Regular.ttf new file mode 100644 index 0000000000..9a108f1cee Binary files /dev/null and b/fonts/Manrope/Manrope-Regular.ttf differ diff --git a/fonts/Manrope/Manrope-SemiBold.ttf b/fonts/Manrope/Manrope-SemiBold.ttf new file mode 100644 index 0000000000..46a13d6198 Binary files /dev/null and b/fonts/Manrope/Manrope-SemiBold.ttf differ diff --git a/fr/contact/index.html b/fr/contact/index.html new file mode 100644 index 0000000000..712eaf0dd6 --- /dev/null +++ b/fr/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Vous avez reçu une adresse pour vous connecter sur SimpleX Chat

+

Pour établir une connexion :

+ +
+

Installer l'application SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Se connecter dans l'application

+ + + Ouvrir l'application SimpleX + +
+

2

+
+
+ +
+

Appuyez sur le bouton 'se connecter' dans l'application

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Rejoindre SimpleX

+

Nous vous invitons à rejoindre la conversation

+ + + +

Inscrivez-vous pour recevoir nos mises à jour

+ +
+ + + +
+ +
+ +

Obtenir SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fr/fdroid/index.html b/fr/fdroid/index.html new file mode 100644 index 0000000000..fd4167c430 --- /dev/null +++ b/fr/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

Dépot SimpleX Chat

+
+
+

Versions stables et bêta crées par les développeurs

+

Pour l'ajouter à votre client F-Droid scannez le code QR ou utilisez cette URL :

+ + https://app.simplex.chat/fdroid/repo + +

+ Empreinte de signature numérique (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Dépot F-Droid.org

+ +

Versions stables créées par F-Droid.org

+

Les mises à jour de ce dépôt sont faites quelques jours plus tard.

+

Les dépôts SimpleX Chat et F-Droid.org signent les builds avec des clés différentes. Pour changer, veuillez exporter la base de données des chats et réinstaller l'application.

+
+
+ +
+
+ + + + + + + + + + diff --git a/fr/index.html b/fr/index.html new file mode 100644 index 0000000000..f2c8340b59 --- /dev/null +++ b/fr/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/fr/invitation/index.html b/fr/invitation/index.html new file mode 100644 index 0000000000..507d3cbe99 --- /dev/null +++ b/fr/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Vous avez reçu un lien unique pour vous connecter sur SimpleX Chat

+

Pour établir une connexion :

+ +
+

Installer l'application SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Se connecter dans l'application

+ + + Ouvrir l'application SimpleX + +
+

2

+
+
+ +
+

Appuyez sur le bouton 'se connecter' dans l'application

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Rejoindre SimpleX

+

Nous vous invitons à rejoindre la conversation

+ + + +

Inscrivez-vous pour recevoir nos mises à jour

+ +
+ + + +
+ +
+ +

Obtenir SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/fr/learn-more/index.html b/fr/learn-more/index.html new file mode 100644 index 0000000000..90d38b6320 --- /dev/null +++ b/fr/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Pourquoi SimpleX est unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Vous avez une confidentialité totale

+
+ +
+ +
+

+ SimpleX protège la confidentialité de votre profil, de vos contacts et de vos métadonnées, en les cachant des serveurs du réseau SimpleX et de tout observateur. +

+

+ Contrairement à tout autre réseau de messagerie existant, SimpleX n'a aucun identifiant attribué aux utilisateurs — pas même de nombres aléatoires. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Vous êtes protégé
contre les spams et les abus

+
+ +
+ +
+

+ Parce que vous n'avez pas d'identifiant ou d'adresse fixe sur le réseau SimpleX, personne ne peut vous contacter sauf si vous partagez une adresse d'utilisateur unique ou temporaire, comme un code QR ou un lien. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Vous contrôlez vos données

+
+ +
+ +
+

+ SimpleX stocke toutes les données utilisateur sur les appareils clients dans un format de base de données chiffrée portable — elles peuvent être transférées vers un autre appareil. +

+

+ Les messages chiffrés de bout en bout sont conservés temporairement sur les serveurs relais SimpleX jusqu'à leur réception, puis ils sont définitivement supprimés. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Vous possédez le réseau SimpleX

+
+ +
+ +
+

+ Le réseau SimpleX est entièrement décentralisé et indépendant de toute crypto-monnaie ou de tout autre réseau, autre que l'Internet. +

+

+ Vous pouvez utiliser SimpleX avec vos propres serveurs ou avec les serveurs que nous fournissons — et toujours vous connecter à n'importe quel utilisateur. +

+ +
+ + + En savoir plus + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Fonctionnalités

+ +
+ +
+
+ + +
+

Messages chiffrés E2E avec édition et format markdown

+
+ +
+
+ + +
+

Images, vidéos et fichiers
chiffrés E2E

+
+ +
+
+ + +
+

Groupes chiffrés E2E décentralisés — où seuls les membres en connaissent l'existence

+
+ +
+
+ + +
+

Messages vocaux chiffrés E2E

+
+ +
+
+ + +
+

Conversations secrètes éphémères

+
+ +
+
+ + +
+

Appels audio et vidéo
chiffrés E2E

+
+ +
+
+ + +
+

Stockage de l'app portable chiffré — déplacez votre profil vers un autre appareil

+
+ +
+
+ + +
+

Mode incognito —
unique à SimpleX Chat

+
+ +
+
+
+ + +
+
+

Ce qui rend SimpleX privé

+ +
+
+ + +
+
+ + +
+
+

Identifiants temporaires anonymes par paires

+
+ +

SimpleX utilise des adresses et des informations d'identification anonymes temporaires par paires pour chaque contact utilisateur ou membre de groupe.

+ +

Il permet la distribution de messages sans identifiants de profil utilisateur, offrant une meilleure confidentialité des métadonnées que les alternatives.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Échange de clés
hors bande

+
+ +

De nombreux réseaux de communication sont vulnérables aux attaques MITM par des serveurs ou des fournisseurs de réseau.

+ +

Pour l'empêcher, les applications SimpleX transmettent des clés à usage unique hors bande, lorsque vous partagez une adresse sous forme de lien ou de code QR.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

2 couches de
chiffrement de bout en bout

+
+ +

Protocole à double ratchet —
Messagerie OTR avec confidentialité persistante et récupération en cas d'effraction.

+ +

Cryptobox NaCL dans chaque file d'attente pour empêcher toute corrélation de trafic entre les files d'attente de messages si le TLS est compromis.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Vérification de l'intégrité
des messages

+
+ +

Pour garantir l'intégrité, les messages sont numérotés séquentiellement et incluent le hachage du message précédent.

+ +

Si un message est ajouté, supprimé ou modifié, le destinataire sera alerté.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Couche supplémentaire de
chiffrement du serveur

+
+ +

Couche supplémentaire de chiffrement du serveur pour la livraison au destinataire, afin d'empêcher la corrélation entre le trafic du serveur reçu et envoyé si le TLS est compromis.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Mélange de messages
pour réduire la corrélation

+
+ +

Les serveurs SimpleX agissent comme des nœuds de mixage à faible latence - les messages entrants et sortants ont un ordre différent.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Transport TLS
sécurisé et authentifié

+
+ +

Les connexions client-serveur ne sont établies qu'avec des algorithmes de chiffrement robustes et en TLS 1.2/1.3.

+ +

L'empreinte du serveur et la fixation des canaux empêchent les attaques MITM et les attaques par rejeu.

+ +

La reprise de connexion est désactivée pour empêcher les attaques de session.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Accès
possible via Tor

+
+ +

Pour protéger votre adresse IP, vous pouvez accéder aux serveurs via Tor ou un autre réseau de transport superposé.

+ +

Pour utiliser SimpleX via Tor, veuillez installer l'application Orbot et activez le proxy SOCKS5 (ou le mode VPN sur iOS).

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Files d'attente de messages
unidirectionnelles

+
+ +

Chaque file d'attente de messages transmet les messages dans une direction, avec des adresses d'envoi et de réception différentes.

+ +

Il réduit les vecteurs d'attaque, par rapport aux agents de messagerie traditionnels, et les métadonnées disponibles.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Plusieurs couches de
couverture de contenu

+
+ +

SimpleX utilise une couverture de contenu pour chaque couche de chiffrement afin de résister aux attaques ciblant la taille des messages.

+ +

Cela rend les messages de différentes tailles identiques pour les serveurs et les observateurs du réseau.

+ +
+

Appuyez pour fermer

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Réseau SimpleX

+

Simplex Chat offre la meilleure protection pour votre vie privée en combinant les avantages du P2P et des réseaux fédérés.

+ +
+
+
+ + +
+
+

Contrairement aux réseaux P2P

+

+ Tous les messages sont envoyés via les serveurs, offrant à la fois une meilleure protection des métadonnées et une livraison asynchrone fiable des messages, tout en évitant de nombreux problèmes des réseaux P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Contrairement aux réseaux fédérés

+

+ Les serveurs de relais SimpleX NE stockent PAS les profils d'utilisateurs, les contacts et les messages distribués, NE se connectent PAS les uns aux autres et il N'y a AUCUN répertoire de serveurs. +

+
+
+ + + +
+
+ + +
+
+

Réseau SimpleX

+

+ les serveurs fournissent des files d'attente unidirectionnelles pour connecter les utilisateurs, mais ils n'ont aucune visibilité sur le graphique de connexion réseau — seuls les utilisateurs l'ont. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX expliqué

+ + + + + + + +
+
+ +
+
1. L'expérience des utilisateurs
+
+ +

+ Vous pouvez créer des contacts et des groupes, et avoir des conversations bidirectionnelles, comme dans n'importe quelle autre messagerie. +

+

+ Comment cela peut-il fonctionner avec des files d'attente unidirectionnelles et sans identifiants de profil utilisateur ? +

+
+
+ +
+
2. Comment ça marche
+
+ +

+ Pour chaque connexion, vous utilisez deux files d'attente de messages distinctes pour envoyer et recevoir des messages via des serveurs différents. +

+

+ Les serveurs ne transmettent les messages que dans une direction, sans connaître la totalité de la conversation ou des connexions de l'utilisateur. +

+
+
+ +
+
3. Ce que voient les serveurs
+
+ +

+ Les serveurs disposent d'identifiants anonymes distincts pour chaque file d'attente, et ne savent pas à quels utilisateurs ils appartiennent. +

+

+ Les utilisateurs peuvent améliorer davantage leur protection des métadonnées en utilisant Tor pour accéder aux serveurs, ce qui empêche la corrélation par adresse IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparaison avec d'autres protocoles

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plateformesXMPP, MatrixProtocoles P2P
Identifiant global nécessaireNon - privéOui 1Oui 2Oui 3
Risque d'attaque MITMNon - sécurisé 4Oui 5OuiOui
Dépendance au DNSNon - résistantOuiOuiNon
Réseau unique ou centraliséNon - décentraliséOuiNon - fédéré 6Oui 7
Attaque à l'échelle du réseauNon - résistantOuiOui 2Oui 8
+
+ +
+ +
+
+
    +
  1. Généralement basé sur un numéro de téléphone, dans certains cas sur des noms d'utilisateur
  2. +
  3. Adresses basées sur le DNS
  4. +
  5. Clé publique ou tout autre identifiant global unique
  6. +
  7. Les relais SimpleX ne peuvent pas compromettre le chiffrement e2e. Vérifier le code de sécurité pour limiter les attaques sur le canal hors bande
  8. +
  9. Si les serveurs de l'opérateur sont compromis. Vérifier les codes de sécurités sur Signal et d'autres applications pour limiter les risques
  10. +
  11. Ne protège pas la confidentialité des métadonnées des utilisateurs
  12. +
  13. Bien que les P2P soient distribués, ils ne sont pas fédérés - ils fonctionnent comme un seul réseau
  14. +
  15. Les réseaux P2P ont soit une autorité centrale, soit l'ensemble du réseau peut être compromis - voir ici
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/he/contact/index.html b/he/contact/index.html new file mode 100644 index 0000000000..012f64de66 --- /dev/null +++ b/he/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

קיבלת כתובת להתחבר ב-SimpleX Chat

+

כדי ליצור חיבור:

+ +
+

התקינו את אפליקציית SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

התחברו באפליקציה

+ + + פתחו את אפליקציית Simplex + +
+

2

+
+
+ +
+

הקישו על הלחצן 'התחבר' באפליקציה

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

הצטרפו SimpleX

+

אנו מזמינים אתכם להצטרף לשיחה

+ + + +

הירשמו כדי לקבל את העדכונים שלנו

+ +
+ + + +
+ +
+ +

הורידו את אפליקציית שולחן העבודה SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/he/fdroid/index.html b/he/fdroid/index.html new file mode 100644 index 0000000000..c29bb63b29 --- /dev/null +++ b/he/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat דרך F-Droid

+ +
+ +
+

מאגר SimpleX Chat

+
+
+

גרסאות יציבות ובטא שנבנו על ידי המפתחים

+

כדי להוסיף אותו ללקוח F-Droid שלכם, סרקו את קוד ה-QR או השתמשו בכתובת האתר הזו:

+ + https://app.simplex.chat/fdroid/repo + +

+ חתימת מפתח טביעת אצבע (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

מאגר F-Droid.org

+ +

גרסאות יציבות שנבנו על ידי F-Droid.org

+

גרסאות למאגר זה משוחררות לאחר כמה ימים.

+

מאגרי SimpleX Chat ו-F-Droid.org חותמים על גרסאות עם מפתחות שונים. כדי לעבור, אנא ייצא את מסד הנתונים של הצ'אט והתקן מחדש את האפליקציה.

+
+
+ +
+
+ + + + + + + + + + diff --git a/he/index.html b/he/index.html new file mode 100644 index 0000000000..85e93920b9 --- /dev/null +++ b/he/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/he/invitation/index.html b/he/invitation/index.html new file mode 100644 index 0000000000..3e216c49f2 --- /dev/null +++ b/he/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

קיבלת קישור חד-פעמי להתחבר ב-SimpleX Chat

+

כדי ליצור חיבור:

+ +
+

התקינו את אפליקציית SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

התחברו באפליקציה

+ + + פתחו את אפליקציית Simplex + +
+

2

+
+
+ +
+

הקישו על הלחצן 'התחבר' באפליקציה

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

הצטרפו SimpleX

+

אנו מזמינים אתכם להצטרף לשיחה

+ + + +

הירשמו כדי לקבל את העדכונים שלנו

+ +
+ + + +
+ +
+ +

הורידו את אפליקציית שולחן העבודה SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/he/learn-more/index.html b/he/learn-more/index.html new file mode 100644 index 0000000000..d51156c42f --- /dev/null +++ b/he/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

מדוע SimpleX הוא ייחודי

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

יש לך פרטיות מלאה

+
+ +
+ +
+

+ SimpleX מגן על פרטיות הפרופיל, אנשי הקשר והמטא נתונים שלכם, מסתיר אותם משרתי רשת SimpleX ומכל צופה. +

+

+ בניגוד לכל רשת הודעות קיימת אחרת, ל-SimpleX אין מזהים המשויכים למשתמשים — אפילו לא מספרים אקראיים. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

אתה מוגן
מפני ספאם וניצול לרעה

+
+ +
+ +
+

+ מכיוון שאין לך מזהה או כתובת קבועה ברשת SimpleX, אף אחד לא יכול ליצור איתך קשר אלא אם כן אתה משתף כתובת משתמש חד-פעמית או זמנית, כקוד QR או קישור. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

אתה שולט בנתונים שלך

+
+ +
+ +
+

+ SimpleX מאחסן את כל נתוני המשתמש במכשירי הלקוח בפורמט מסד נתונים מוצפן נייד — ניתן להעביר אותו למכשיר אחר. +

+

+ ההודעות המוצפנות מקצה לקצה מוחזקות באופן זמני בשרתי ממסר של SimpleX עד שמתקבלות, ואז הן נמחקות לצמיתות. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

רשת SimpleX בבעלותך

+
+ +
+ +
+

+ רשת SimpleX מבוזרת לחלוטין ואינה תלויה בכל מטבע קריפטוגרפי או בכל רשת אחרת, מלבד האינטרנט. +

+

+ אתם יכולים להשתמש ב-SimpleX עם השרתים שלכם או עם השרתים שסופקו על ידינו — ועדיין להתחבר לכל משתמש. +

+ +
+ + + למדו עוד + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

מאפיינים

+ +
+ +
+
+ + +
+

הודעות מוצפנות מקצה לקצה עם סימונים ואפשרויות עריכה

+
+ +
+
+ + +
+

תמונות, וידאו וקבצים
בהצפנת קצה-אל-קצה

+
+ +
+
+ + +
+

קבוצות סודיות מבוזרות —
רק המשתמשים יודעים שהן קיימות

+
+ +
+
+ + +
+

הודעות קוליות מוצפנות מקצה לקצה

+
+ +
+
+ + +
+

הודעות נעלמות

+
+ +
+
+ + +
+

שיחות שמע ווידאו
מוצפנות מקצה לקצה

+
+ +
+
+ + +
+

מסד נתונים מוצפן נייד — העבר פרופיל למכשיר אחר

+
+ +
+
+ + +
+

מצב זהות נסתרת —
ייחודי ל-SimpleX Chat

+
+ +
+
+
+ + +
+
+

מה הופך את SimpleX לפרטי

+ +
+
+ + +
+
+ + +
+
+

מזהים זמניים אנונימיים בזוגות

+
+ +

SimpleX משתמש בכתובות ואישורים אנונימיים זמניים בזוגות עבור כל איש קשר של משתמש או חבר בקבוצה.

+ +

זה מאפשר להעביר הודעות ללא מזהי פרופיל משתמש, ומספק פרטיות מטא-נתונים טובה יותר מאשר חלופות אחרות.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

החלפת מפתחות
מחוץ לרשת

+
+ +

רשתות תקשורת רבות פגיעות להתקפות MITM על ידי שרתים או ספקי רשת.

+ +

כדי למנוע זאת, אפליקציות SimpleX מעבירות מפתחות חד-פעמיים מחוץ לפס, כאשר אתם משתפים כתובת כקישור או כקוד QR.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

2 שכבות של
הצפנה מקצה לקצה

+
+ +

פרוטוקול ראצ'ט כפול —
העברת הודעות OTR עם סודיות מושלמת קדימה ושחזור פריצה.

+ +

תיבת הצפנה NaCL בכל תור כדי למנוע קורלציית תעבורה בין תורי הודעות במקרה שאבטחת TLS נפגעה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

בדיקת תקינות
ההודעה

+
+ +

על מנת להבטיח את שלמות ההודעות, הן ממוספרות ברצף וכוללות את הגיבוב (hash) של ההודעה הקודמת.

+ +

אם הודעה כלשהי תתווסף, תוסר או תשתנה, הנמען יקבל התראה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

שכבה נוספת של
הצפנת שרת

+
+ +

שכבה נוספת של הצפנת שרת למסירה לנמען, כדי למנוע קורלציה בין תעבורת השרת המתקבלת ונשלחת במקרה שאבטחת TLS נפגעה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

ערבוב הודעות
לשם הפחתת קורלציה

+
+ +

שרתי SimpleX פועלים כצמתי ערבוב עם זמן השהיה נמוך — להודעות הנכנסות והיוצאות יש סדר שונה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

תעבורת TLS
מאובטחת ומאומתת

+
+ +

עבור חיבורי שרת-לקוח, נעשה שימוש רק ב-TLS 1.2/1.3 עם אלגוריתמים חזקים.

+ +

טביעת אצבע של שרת ואיגוד ערוצים מונעים התקפת אדם בתווך (MITM) והתקפת שליחה מחדש (Replay attack).

+ +

חידוש החיבור מושבת כדי למנוע התקפות הפעלה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

אופציונלי
גישה דרך Tor

+
+ +

כדי להגן על כתובת ה-IP שלכם, אתם יכולים לגשת לשרתים דרך Tor או רשת שכבת-על אחרת של תעבורה.

+ +

כדי להשתמש ב-SimpleX דרך Tor, התקן את אפליקציית Orbot והפעל את SOCKS5 proxy (או VPN ב-iOS).

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

תורי הודעות
חד-כיווניים

+
+ +

כל תור הודעות מעביר הודעות בכיוון אחד, עם כתובות השליחה והקבלה השונות.

+ +

זה מפחית את וקטורי ההתקפה, בהשוואה למתווכי הודעות מסורתיים, ואת המטא-נתונים הזמינים.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

שכבות מרובות של
ריפוד תוכן

+
+ +

SimpleX משתמש בריווח התוכן עבור כל שכבת הצפנה כדי לסכל התקפות על גודל הודעה.

+ +

זה גורם להודעות בגדלים שונים להיראות זהים לשרתים ולמשקיפים ברשת.

+ +
+

הקישו כדי לסגור

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

רשת SimpleX

+

Simplex Chat מספק את הפרטיות הטובה ביותר על ידי שילוב היתרונות של P2P ורשתות מאוחדות.

+ +
+
+
+ + +
+
+

בניגוד לרשתות P2P

+

+ כל ההודעות נשלחות דרך השרתים, שמספקים פרטיות טובה יותר של מטא נתונים וגם מסירת הודעות אסינכרונית אמינה, תוך הימנעות מהרבה בעיות של רשתות P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

בניגוד לרשתות מאוחדות

+

+ שרתי ממסר SimpleX אינם מאחסנים פרופילי משתמש, אנשי קשר והודעות שנמסרו, אינם מתחברים זה לזה, ואין ספריית שרתים. +

+
+
+ + + +
+
+ + +
+
+

רשת SimpleX

+

+ השרתים מספקים תורים חד-כיווניים לחיבור המשתמשים, אך הם לא יכול לראות את גרף חיבור הרשת — רק המשתמשים יכולים לראות זאת. +

+
+
+ +
+
+ +
+ + + + + +
+
+

תיאור SimpleX

+ + + + + + + +
+
+ +
+
1. חוויית משתמש
+
+ +

+ אתם יכולים ליצור אנשי קשר וקבוצות, ולנהל שיחות דו-כיווניות, כמו בכל תוכנה אחרת לשליחת הודעות. +

+

+ איך זה יכול לעבוד עם תורים חד-כיווניים וללא מזהי פרופיל משתמש? +

+
+
+ +
+
2. איך זה עובד
+
+ +

+ עבור כל חיבור, שני תורי העברת הודעות נפרדים משמשים לשליחה וקבלה של הודעות דרך שרתים שונים. +

+

+ שרתים מעבירים הודעות רק בכיוון אחד, מבלי לקבל את התמונה המלאה של השיחות או החיבורים של המשתמש. +

+
+
+ +
+
3. מה השרתים רואים
+
+ +

+ לשרתים יש אישורים אנונימיים נפרדים לכל תור, ואינם יודעים לאילו משתמשים הם שייכים. +

+

+ משתמשים יכולים לשפר עוד יותר את פרטיות המטא-נתונים על ידי שימוש ב- Tor כדי לגשת לשרתים, ולמנוע קורלציה לפי כתובת IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

השוואה לפרוטוקולים אחרים

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, פלטפורמות גדולותXMPP, Matrixפרוטוקולי P2P
דורש זהות גלובליתלא - פרטיכן 1כן 2כן 3
אפשרות של התקפת MITMלא - מאובטח 4כן 5כןכן
תלות ב-DNSלא - גמישכןכןלא
רשת בודדת או מרכזיתלא - מבוזרכןלא - פדרלית 6כן 7
רכיב מרכזי או מתקפת רשת רחבהלא - גמישכןכן 2כן 8
+
+ +
+ +
+
+
    +
  1. בדרך כלל מבוססת על מספר טלפון, במקרים מסוימים על שמות משתמש
  2. +
  3. כתובות מבוססות DNS
  4. +
  5. מפתח ציבורי או מזהה ייחודי גלובלי אחר
  6. +
  7. ממסרי SimpleX אינם יכולים לסכן הצפנה מקצה לקצה. ודא קוד אבטחה כדי לצמצם התקפות על ערוץ "מחוץ לרשת"
  8. +
  9. אם השרתי המפעיל נפגעים. אמת את קוד האבטחה ב-Signal ובכמה אפליקציות אחרות כדי למתן את זה
  10. +
  11. אינו מגן על פרטיות המטא נתונים של המשתמשים
  12. +
  13. בעוד שרשתות עמית לעמית (P2P) מבוזרות, הן אינן מאוחדות (פדרטיביות) — הן פועלות כרשת יחידה
  14. +
  15. לרשתות P2P יש רשות מרכזית או שכל הרשת יכולה להיפגע - ראו כאן
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/hu/contact/index.html b/hu/contact/index.html new file mode 100644 index 0000000000..690c4a4321 --- /dev/null +++ b/hu/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Kapott egy meghívót a SimpleX Chaten való beszélgetéshez

+

A kapcsolat létrehozásához:

+ +
+

Telepítse a SimpleX alkalmazást

+
+ + + +
+ +
+

1

+
+
+ +
+

Kapcsolódás az alkalmazásban

+ + + Simplex alkalmazás megnyitása + +
+

2

+
+
+ +
+

Koppintson a „kapcsolódás” gombra az alkalmazásban

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Csatlakozzon a közösségeinkhez SimpleX

+

Meghívjuk Önt, hogy csatlakozzon a beszélgetésekhez

+ + + +

Regisztráljon a hírleveleinkre, hogy ne maradjon le semmiről

+ +
+ + + +
+ +
+ +

A SimpleX számítógépes alkalmazásának letöltése

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/hu/fdroid/index.html b/hu/fdroid/index.html new file mode 100644 index 0000000000..291225dc0b --- /dev/null +++ b/hu/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat az F-Droidon keresztül

+ +
+ +
+

A SimpleX Chat tárolója

+
+
+

A fejlesztők által készített stabil és béta verziók

+

Ha hozzá szeretné adni az F-Droid klienséhez, olvassa be a QR-kódot, vagy használja ezt a webcímet:

+ + https://app.simplex.chat/fdroid/repo + +

+ Az aláírókulcs ujjlenyomata (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid-tároló

+ +

F-Droid.org által készített stabil verziók

+

A kiadások ebben a tárolóban néhány napot késnek.

+

A SimpleX Chat és az F-Droid-tároló különböző kulcsokkal írják alá az összeállításokat. A váltáshoz exportálja a csevegési adatbázist és telepítse újra az alkalmazást.

+
+
+ +
+
+ + + + + + + + + + diff --git a/hu/index.html b/hu/index.html new file mode 100644 index 0000000000..953c7b3d2e --- /dev/null +++ b/hu/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/hu/invitation/index.html b/hu/invitation/index.html new file mode 100644 index 0000000000..0249baed12 --- /dev/null +++ b/hu/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Kapott egy egyszer használható meghívót a SimpleX Chaten való beszélgetéshez

+

A kapcsolat létrehozásához:

+ +
+

Telepítse a SimpleX alkalmazást

+
+ + + +
+ +
+

1

+
+
+ +
+

Kapcsolódás az alkalmazásban

+ + + Simplex alkalmazás megnyitása + +
+

2

+
+
+ +
+

Koppintson a „kapcsolódás” gombra az alkalmazásban

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Csatlakozzon a közösségeinkhez SimpleX

+

Meghívjuk Önt, hogy csatlakozzon a beszélgetésekhez

+ + + +

Regisztráljon a hírleveleinkre, hogy ne maradjon le semmiről

+ +
+ + + +
+ +
+ +

A SimpleX számítógépes alkalmazásának letöltése

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/hu/learn-more/index.html b/hu/learn-more/index.html new file mode 100644 index 0000000000..ed7b54a6dc --- /dev/null +++ b/hu/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

A SimpleX mitől egyedülálló

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Teljes magánéletet élvezhet

+
+ +
+ +
+

+ A SimpleX megvédi a profilhoz tartozó kapcsolatokat és metaadatokat, elrejtve azokat a SimpleX hálózat kiszolgálói és a megfigyelők elől. +

+

+ Minden más létező üzenetküldő hálózattól eltérően a SimpleX nem rendelkezik a felhasználókhoz rendelt azonosítókkal — még véletlenszerű számokkal sem. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Véd
a kéretlen tartalmaktól és a visszaélésektől

+
+ +
+ +
+

+ Mivel a SimpleX hálózaton nincs azonosítója vagy állandó címe, senki sem tud kapcsolatba lépni Önnel, hacsak nem oszt meg egy egyszeri vagy ideiglenes felhasználói címet, például QR-kódot vagy hivatkozást. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Ön kezeli az adatait

+
+ +
+ +
+

+ A SimpleX Chat az összes felhasználói adatot kizárólag a klienseken tárolja egy hordozható titkosított adatbázis-formátumban —, amely exportálható és átvihető bármely más támogatott eszközre. +

+

+ A végpontok között titkosított üzenetek átmenetileg a SimpleX továbbítókiszolgálóin tartózkodnak, amíg be nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Öné a SimpleX hálózat

+
+ +
+ +
+

+ A SimpleX hálózat teljesen decentralizált és független bármely kriptopénztől vagy bármely más hálózattól, kivéve az internetet. +

+

+ Használhatja a SimpleXet a saját kiszolgálóival vagy az általunk biztosított kiszolgálókkal, és továbbra is kapcsolódhat bármely felhasználóhoz. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkciók

+ +
+ +
+
+ + +
+

Végpontok között titkosított üzenetek markdown formázással és szerkesztéssel

+
+ +
+
+ + +
+

Végpontok között titkosított
képek, videók és fájlok

+
+ +
+
+ + +
+

Végpontok között titkosított, decentralizált csoportok — csak a felhasználók tudják, hogy ezek léteznek

+
+ +
+
+ + +
+

Végpontok között titkosított hangüzenetek

+
+ +
+
+ + +
+

Eltűnő üzenetek

+
+ +
+
+ + +
+

Végpontok között titkosított
hang- és videóhívások

+
+ +
+
+ + +
+

Hordozható titkosított alkalmazás-adattárolás — profil átköltöztetése egy másik eszközre

+
+ +
+
+ + +
+

Az inkognitómód —
egyedülálló a SimpleX Chatben

+
+ +
+
+
+ + +
+
+

Mitől lesz a SimpleX privát

+ +
+
+ + +
+
+ + +
+
+

Ideiglenes, névtelen, páronkénti azonosítók

+
+ +

A SimpleX ideiglenes, névtelen, páros címeket és hitelesítő adatokat használ minden egyes felhasználói kapcsolathoz vagy csoporttaghoz.

+ +

Lehetővé teszi az üzenetek felhasználói profilazonosítók nélküli kézbesítését, ami az alternatíváknál jobb metaadat-védelmet biztosít.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Sávon kívüli
kulcscsere

+
+ +

Számos kommunikációs hálózat sebezhető a kiszolgálók vagy a hálózat-szolgáltatók MITM-támadásaival szemben.

+ +

Ennek megakadályozása érdekében a SimpleX-alkalmazások egyszeri kulcsokat adnak át sávon kívül, amikor egy címet hivatkozásként vagy QR-kódként oszt meg.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

2 rétegű végpontok közötti titkosítás

+
+ +

Double-Ratchet-protokoll —
OTR-üzenetküldés, sérülés utáni titkosság-védelemmel és -helyreállítással.

+ +

NaCL cryptobox minden egyes üzenetvárólistához, hogy megakadályozza a forgalom korrelációját az üzenetvárólisták között, ha a TLS veszélybe kerül.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Üzenetintegritás
hitelesítés

+
+ +

Az integritás garantálása érdekében az üzenetek sorszámozással vannak ellátva, és tartalmazzák az előző üzenet kivonatát.

+ +

Ha bármilyen üzenetet hozzáadnak, eltávolítanak vagy módosítanak, a címzett értesítést kap róla.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

További rétege a
kiszolgáló-titkosítás

+
+ +

Kiegészítő kiszolgáló titkosítási réteg a címzettnek történő kézbesítéshez, hogy megakadályozza a fogadott és az elküldött kiszolgálóforgalom közötti korrelációt, ha a TLS veszélybe kerül.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Üzenetek keverése
a korreláció csökkentése érdekében

+
+ +

A SimpleX kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Biztonságos, hitelesített
TLS adatátvitel

+
+ +

A kliens és a kiszolgálók közötti kapcsolatokhoz csak az erős algoritmusokkal rendelkező TLS 1.2/1.3 protokollt használja.

+ +

A kiszolgáló ujjlenyomata és a csatornakötés megakadályozza a MITM- és a visszajátszási támadásokat.

+ +

Az újrakapcsolódás le van tiltva a munkamenet elleni támadások megelőzése érdekében.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Hozzáférés a Tor hálózaton keresztül
(nem kötelező)

+
+ +

Az IP-címe védelme érdekében a kiszolgálókat a Tor hálózaton vagy más átvitelátfedő hálózaton keresztül is elérheti.

+ +

A SimpleX, Tor hálózaton keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Egyirányú
üzenetvárólista

+
+ +

Minden üzenetvárólista egy irányba továbbítja az üzeneteket, a különböző küldési és vételi címekkel.

+ +

Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó-alkalmazások, és kevesebb metaadatot tesz elérhetővé.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Több rétegű
tartalomkitöltés

+
+ +

A SimpleX minden titkosítási réteghez tartalomkitöltést használ az üzenetméretre irányuló támadások meghiúsítása érdekében.

+ +

A kiszolgálók és a hálózatot megfigyelők számára a különböző méretű üzenetek egyformának tűnnek.

+ +
+

Bezárás

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleXhálózat

+

A Simplex Chat a P2P- és a föderált hálózatok előnyeinek kombinálásával biztosítja a legjobb adatvédelmet.

+ +
+
+
+ + +
+
+

A P2P-hálózatokkal ellentétben

+

+ Minden üzenet a kiszolgálókon keresztül kerül elküldésre, ami jobb metaadat-védelmet és megbízható aszinkron üzenetkézbesítést biztosít, miközben elkerülhető a sok a P2P-hálózatok problémái. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

A föderált hálózatokkal ellentétben

+

+ A SimpleX továbbítókiszolgálói NEM tárolnak felhasználói profilokat, kapcsolatokat és kézbesített üzeneteket, NEM kapcsolódnak egymáshoz, és NINCS kiszolgálókönyvtár. +

+
+
+ + + +
+
+ + +
+
+

SimpleX hálózat

+

+ a kiszolgálók egyirányú üzenetvárólistákat biztosítanak a felhasználók összekapcsolásához, de nem látják a hálózati kapcsolati gráfot; azt csak a felhasználók látják. +

+
+
+ +
+
+ +
+ + + + + +
+
+

A SimpleX bemutatása

+ + + + + + + +
+
+ +
+
1. Felhasználói élmény
+
+ +

+ Létrehozhat kapcsolatokat és csoportokat, valamint kétirányú beszélgetéseket folytathat, ugyanúgy mint bármely más üzenetváltó-alkalmazásban. +

+

+ Hogyan működhet egyirányú üzenetvárólistával és felhasználói profilazonosítók nélkül? +

+
+
+ +
+
2. Hogyan működik
+
+ +

+ Minden kapcsolathoz két különböző üzenetküldési várólistát használ a különböző kiszolgálókon keresztül történő üzenetküldéshez és -fogadáshoz. +

+

+ A kiszolgálók csak egyetlen irányba továbbítják az üzeneteket, anélkül, hogy teljes képet kapnának a felhasználók beszélgetéseiről vagy kapcsolatairól. +

+
+
+ +
+
3. Mit látnak a kiszolgálók
+
+ +

+ A kiszolgálók minden egyes üzenetvárólistához külön névtelen hitelesítő-adatokkal rendelkeznek, és nem tudják, hogy melyik felhasználóhoz tartoznak. +

+

+ A felhasználók tovább fokozhatják a metaadatok adatvédelmét, ha a Tor hálózat használatával férnek hozzá a kiszolgálókhoz, így megakadályozva az IP-cím szerinti korrelációt. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Összehasonlítás más protokollokkal

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, nagy platformokXMPP, MatrixP2P-protokollok
Globális személyazonosságot igényelNem - privátIgen 1Igen 2Igen 3
MITM lehetőségeNem - biztonságos 4Igen 5IgenIgen
Függés a DNS-tőlNem - ellenállóIgenIgenNem
Egyetlen vagy központosított hálózatNem - decentralizáltIgenNem - föderált 6Igen 7
Központi komponens vagy más hálózati szintű támadásNem - ellenállóIgenIgen 2Igen 8
+
+ +
+ +
+
+
    +
  1. Általában telefonszám alapján, néhány esetben felhasználónév alapján
  2. +
  3. DNS-alapú címek
  4. +
  5. Nyilvános kulcs vagy más globális egyedi azonosító
  6. +
  7. A SimpleX továbbítókiszolgálói nem veszélyeztethetik az e2e titkosítást. Hitelesítse a biztonsági kódot a sávon kívüli csatorna elleni támadások veszélyeinek csökkentésére
  8. +
  9. Ha az üzemeltetett kiszolgálók veszélybe kerülnek. Hitelesítse a biztonsági kódot a Signal vagy más biztonságos üzenetküldő alkalmazás segítségével a támadások veszélyeinek csökkentésére
  10. +
  11. Nem védi a felhasználók metaadatait
  12. +
  13. Bár a P2P elosztott, de nem föderált — egyetlen hálózatként működnek
  14. +
  15. A P2P-hálózatoknak vagy van egy központi hitelesítője, vagy az egész hálózat kompromittálódhat - tekintse meg itt
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/id/contact/index.html b/id/contact/index.html new file mode 100644 index 0000000000..500bc2732e --- /dev/null +++ b/id/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received an address to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/id/fdroid/index.html b/id/fdroid/index.html new file mode 100644 index 0000000000..be1a2ef73c --- /dev/null +++ b/id/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stable and beta versions built by the developers

+

To add it to your F-Droid client, scan the QR code or use this URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stable versions built by F-Droid.org

+

The releases to this repo are done several days later.

+

SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/id/index.html b/id/index.html new file mode 100644 index 0000000000..0e9dedd271 --- /dev/null +++ b/id/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/id/invitation/index.html b/id/invitation/index.html new file mode 100644 index 0000000000..251990c8dc --- /dev/null +++ b/id/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received a 1-time link to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/id/learn-more/index.html b/id/learn-more/index.html new file mode 100644 index 0000000000..03b55617ee --- /dev/null +++ b/id/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
Key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
End-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
Content padding

+
+ +

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+ + + + + + + + + + diff --git a/images/connection.gif b/images/connection.gif new file mode 100644 index 0000000000..f15f7bcb09 Binary files /dev/null and b/images/connection.gif differ diff --git a/images/conversation.png b/images/conversation.png new file mode 100644 index 0000000000..539f43d11f Binary files /dev/null and b/images/conversation.png differ diff --git a/images/files.gif b/images/files.gif new file mode 100644 index 0000000000..ad8beaa183 Binary files /dev/null and b/images/files.gif differ diff --git a/images/groups.gif b/images/groups.gif new file mode 100644 index 0000000000..0ce6dc30ec Binary files /dev/null and b/images/groups.gif differ diff --git a/images/how-to-use-simplex.svg b/images/how-to-use-simplex.svg new file mode 100644 index 0000000000..1be91eb293 --- /dev/null +++ b/images/how-to-use-simplex.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/kuketz-blog.jpg b/images/kuketz-blog.jpg new file mode 100644 index 0000000000..a2edfb7c54 Binary files /dev/null and b/images/kuketz-blog.jpg differ diff --git a/images/logo.svg b/images/logo.svg new file mode 100644 index 0000000000..bb4e50787a --- /dev/null +++ b/images/logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/images/privacy-guides.jpg b/images/privacy-guides.jpg new file mode 100644 index 0000000000..5876d10c02 Binary files /dev/null and b/images/privacy-guides.jpg differ diff --git a/images/simplex-chat-logo-only.svg b/images/simplex-chat-logo-only.svg new file mode 100644 index 0000000000..6d423bf5c5 --- /dev/null +++ b/images/simplex-chat-logo-only.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/images/simplex-chat-logo.svg b/images/simplex-chat-logo.svg new file mode 100644 index 0000000000..2f42e5073d --- /dev/null +++ b/images/simplex-chat-logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/trail-of-bits.jpg b/images/trail-of-bits.jpg new file mode 100644 index 0000000000..a3cb03b7eb Binary files /dev/null and b/images/trail-of-bits.jpg differ diff --git a/images/user-addresses.gif b/images/user-addresses.gif new file mode 100644 index 0000000000..6729201529 Binary files /dev/null and b/images/user-addresses.gif differ diff --git a/images/whonix-logo.jpg b/images/whonix-logo.jpg new file mode 100644 index 0000000000..c6fc4729b2 Binary files /dev/null and b/images/whonix-logo.jpg differ diff --git a/img/1_show_qr_code.png b/img/1_show_qr_code.png new file mode 100644 index 0000000000..95bec2bf14 Binary files /dev/null and b/img/1_show_qr_code.png differ diff --git a/img/2_scan_qr_code.png b/img/2_scan_qr_code.png new file mode 100644 index 0000000000..9a6166f510 Binary files /dev/null and b/img/2_scan_qr_code.png differ diff --git a/img/3_connected.png b/img/3_connected.png new file mode 100644 index 0000000000..b7b2e0c38f Binary files /dev/null and b/img/3_connected.png differ diff --git a/img/4_chat.png b/img/4_chat.png new file mode 100644 index 0000000000..b977f57850 Binary files /dev/null and b/img/4_chat.png differ diff --git a/img/alice.svg b/img/alice.svg new file mode 100644 index 0000000000..5501242644 --- /dev/null +++ b/img/alice.svg @@ -0,0 +1,25 @@ + + + Group 4 + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/apk_icon.png b/img/apk_icon.png new file mode 100644 index 0000000000..60ff342d36 Binary files /dev/null and b/img/apk_icon.png differ diff --git a/img/apple_store.svg b/img/apple_store.svg new file mode 100644 index 0000000000..b977fa2cf9 --- /dev/null +++ b/img/apple_store.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/arrow.svg b/img/arrow.svg new file mode 100644 index 0000000000..31157c4b9b --- /dev/null +++ b/img/arrow.svg @@ -0,0 +1,19 @@ + + + + 4BF2AAB0-320C-476F-91DE-744A4F8CD509 + Created with sketchtool. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/bg.svg b/img/bg.svg new file mode 100644 index 0000000000..958b8e76b1 --- /dev/null +++ b/img/bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/bob.svg b/img/bob.svg new file mode 100644 index 0000000000..31be156266 --- /dev/null +++ b/img/bob.svg @@ -0,0 +1,20 @@ + + + Group 3 + + + + + + + + + + + + + + + + + diff --git a/img/chat.png b/img/chat.png new file mode 100644 index 0000000000..57afdf6135 Binary files /dev/null and b/img/chat.png differ diff --git a/img/chat.svg b/img/chat.svg new file mode 100644 index 0000000000..4560615f2b --- /dev/null +++ b/img/chat.svg @@ -0,0 +1,150 @@ + + + row 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/conn1.svg b/img/conn1.svg new file mode 100644 index 0000000000..dcb676411f --- /dev/null +++ b/img/conn1.svg @@ -0,0 +1,29 @@ + + + Group 12 + + + + + + + + + + + + + + + + + + + + ADD CONTACT + + + + + + \ No newline at end of file diff --git a/img/conn2.svg b/img/conn2.svg new file mode 100644 index 0000000000..6a21cadb2e --- /dev/null +++ b/img/conn2.svg @@ -0,0 +1,29 @@ + + + Group 15 + + + + + + + + + + + + + + + + + + + SCAN QR CODE + + + + + + + diff --git a/img/conn3.svg b/img/conn3.svg new file mode 100644 index 0000000000..d92b939302 --- /dev/null +++ b/img/conn3.svg @@ -0,0 +1,45 @@ + + + Group 25 + + + + + + + + + + + + + + + + + + + + + + Bob + + + + + + + + + + + + + CONFIRM + + + + + + + diff --git a/img/conn4.svg b/img/conn4.svg new file mode 100644 index 0000000000..84a5c4041b --- /dev/null +++ b/img/conn4.svg @@ -0,0 +1,34 @@ + + + button + + + + + + + + + + + + CHAT: ALICE + + + Alice: Hello + + + + + + Alice: Where + are you? + + + Hello + + + + + + diff --git a/img/design_3/android-dark.png b/img/design_3/android-dark.png new file mode 100644 index 0000000000..d4feead139 Binary files /dev/null and b/img/design_3/android-dark.png differ diff --git a/img/design_3/cover-mobile.jpg b/img/design_3/cover-mobile.jpg new file mode 100644 index 0000000000..93df900577 Binary files /dev/null and b/img/design_3/cover-mobile.jpg differ diff --git a/img/design_3/cover.jpg b/img/design_3/cover.jpg new file mode 100644 index 0000000000..9c7b987f26 Binary files /dev/null and b/img/design_3/cover.jpg differ diff --git a/img/design_3/logo-light.png b/img/design_3/logo-light.png new file mode 100644 index 0000000000..93751c0f90 Binary files /dev/null and b/img/design_3/logo-light.png differ diff --git a/img/design_3/section-2-desktop.webp b/img/design_3/section-2-desktop.webp new file mode 100644 index 0000000000..1466794139 Binary files /dev/null and b/img/design_3/section-2-desktop.webp differ diff --git a/img/design_3/section-2-mobile.webp b/img/design_3/section-2-mobile.webp new file mode 100644 index 0000000000..c73eba324b Binary files /dev/null and b/img/design_3/section-2-mobile.webp differ diff --git a/img/design_3/section-3-desktop.webp b/img/design_3/section-3-desktop.webp new file mode 100644 index 0000000000..e927ce29c8 Binary files /dev/null and b/img/design_3/section-3-desktop.webp differ diff --git a/img/design_3/section-3-mobile.webp b/img/design_3/section-3-mobile.webp new file mode 100644 index 0000000000..3a8fb82d48 Binary files /dev/null and b/img/design_3/section-3-mobile.webp differ diff --git a/img/design_3/section-4-desktop.webp b/img/design_3/section-4-desktop.webp new file mode 100644 index 0000000000..1142279cb1 Binary files /dev/null and b/img/design_3/section-4-desktop.webp differ diff --git a/img/design_3/section-4-mobile.webp b/img/design_3/section-4-mobile.webp new file mode 100644 index 0000000000..6225347ecb Binary files /dev/null and b/img/design_3/section-4-mobile.webp differ diff --git a/img/design_3/section-5-desktop.webp b/img/design_3/section-5-desktop.webp new file mode 100644 index 0000000000..5cdb4debee Binary files /dev/null and b/img/design_3/section-5-desktop.webp differ diff --git a/img/design_3/section-5-mobile.webp b/img/design_3/section-5-mobile.webp new file mode 100644 index 0000000000..352ea7fbd8 Binary files /dev/null and b/img/design_3/section-5-mobile.webp differ diff --git a/img/design_3/testflight-dark.png b/img/design_3/testflight-dark.png new file mode 100644 index 0000000000..ddcdd58fd9 Binary files /dev/null and b/img/design_3/testflight-dark.png differ diff --git a/img/doodle.svg b/img/doodle.svg new file mode 100644 index 0000000000..78f0ae2bd2 --- /dev/null +++ b/img/doodle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/f_droid.svg b/img/f_droid.svg new file mode 100644 index 0000000000..2d6ec68710 --- /dev/null +++ b/img/f_droid.svg @@ -0,0 +1,372 @@ + + + + + + + + + + + + + GET IT ON + F-Droid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000..c45f3acf04 Binary files /dev/null and b/img/favicon.ico differ diff --git a/img/flags/br.svg b/img/flags/br.svg new file mode 100644 index 0000000000..354a7013f3 --- /dev/null +++ b/img/flags/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/flags/cn.svg b/img/flags/cn.svg new file mode 100644 index 0000000000..2416236060 --- /dev/null +++ b/img/flags/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/flags/cs.svg b/img/flags/cs.svg new file mode 100644 index 0000000000..7913de3895 --- /dev/null +++ b/img/flags/cs.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/flags/de.svg b/img/flags/de.svg new file mode 100644 index 0000000000..b08334b62e --- /dev/null +++ b/img/flags/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/flags/en.svg b/img/flags/en.svg new file mode 100644 index 0000000000..dbac25eae4 --- /dev/null +++ b/img/flags/en.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/es.svg b/img/flags/es.svg new file mode 100644 index 0000000000..815e0f8468 --- /dev/null +++ b/img/flags/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/flags/fi.svg b/img/flags/fi.svg new file mode 100644 index 0000000000..470be2d07c --- /dev/null +++ b/img/flags/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/flags/fr.svg b/img/flags/fr.svg new file mode 100644 index 0000000000..1be61911a0 --- /dev/null +++ b/img/flags/fr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/hu.svg b/img/flags/hu.svg new file mode 100644 index 0000000000..baddf7f5ea --- /dev/null +++ b/img/flags/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/il.svg b/img/flags/il.svg new file mode 100644 index 0000000000..f43be7e8ed --- /dev/null +++ b/img/flags/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/img/flags/it.svg b/img/flags/it.svg new file mode 100644 index 0000000000..20a8bfdcc8 --- /dev/null +++ b/img/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/jp.svg b/img/flags/jp.svg new file mode 100644 index 0000000000..cd03a339df --- /dev/null +++ b/img/flags/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/flags/nb_NO.svg b/img/flags/nb_NO.svg new file mode 100644 index 0000000000..a5f2a152a9 --- /dev/null +++ b/img/flags/nb_NO.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/nl.svg b/img/flags/nl.svg new file mode 100644 index 0000000000..4faaf498e1 --- /dev/null +++ b/img/flags/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/flags/pl.svg b/img/flags/pl.svg new file mode 100644 index 0000000000..0fa5145241 --- /dev/null +++ b/img/flags/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/img/flags/ru.svg b/img/flags/ru.svg new file mode 100644 index 0000000000..f4d27efc98 --- /dev/null +++ b/img/flags/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/flags/ua.svg b/img/flags/ua.svg new file mode 100644 index 0000000000..a339eb1b9c --- /dev/null +++ b/img/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/img/google_play.svg b/img/google_play.svg new file mode 100644 index 0000000000..6cda5f6d31 --- /dev/null +++ b/img/google_play.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/group.svg b/img/group.svg new file mode 100644 index 0000000000..2a262ef38a --- /dev/null +++ b/img/group.svg @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/img/groups/images/478ec86_izoJb95VXKWEhg.jpg b/img/groups/images/478ec86_izoJb95VXKWEhg.jpg new file mode 100644 index 0000000000..f03198fd37 Binary files /dev/null and b/img/groups/images/478ec86_izoJb95VXKWEhg.jpg differ diff --git a/img/groups/images/5QzoN8PNFD2dkButszPu5g.png b/img/groups/images/5QzoN8PNFD2dkButszPu5g.png new file mode 100644 index 0000000000..4c10b4a359 Binary files /dev/null and b/img/groups/images/5QzoN8PNFD2dkButszPu5g.png differ diff --git a/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg b/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg new file mode 100644 index 0000000000..cd73ac72d6 Binary files /dev/null and b/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg differ diff --git a/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png b/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png new file mode 100644 index 0000000000..baf5e2cb75 Binary files /dev/null and b/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png differ diff --git a/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg b/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg new file mode 100644 index 0000000000..d4309d9d41 Binary files /dev/null and b/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg differ diff --git a/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg b/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg new file mode 100644 index 0000000000..7fa4ffeded Binary files /dev/null and b/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg differ diff --git a/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg b/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg new file mode 100644 index 0000000000..60c50722a1 Binary files /dev/null and b/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg differ diff --git a/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png b/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png new file mode 100644 index 0000000000..e17fd8ca1d Binary files /dev/null and b/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png differ diff --git a/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg b/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg new file mode 100644 index 0000000000..9497a640a0 Binary files /dev/null and b/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg differ diff --git a/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png b/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png new file mode 100644 index 0000000000..b8a3e92f79 Binary files /dev/null and b/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png differ diff --git a/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg b/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg new file mode 100644 index 0000000000..445dd6b359 Binary files /dev/null and b/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg differ diff --git a/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png b/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png new file mode 100644 index 0000000000..7c8608bdbb Binary files /dev/null and b/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png differ diff --git a/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png b/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png new file mode 100644 index 0000000000..b0a5b871f7 Binary files /dev/null and b/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png differ diff --git a/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg b/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg new file mode 100644 index 0000000000..54e49c659b Binary files /dev/null and b/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg differ diff --git a/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg b/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg new file mode 100644 index 0000000000..dccd0279bb Binary files /dev/null and b/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg differ diff --git a/img/groups/images/YhyznG68PNewCNjoD_ceOg.png b/img/groups/images/YhyznG68PNewCNjoD_ceOg.png new file mode 100644 index 0000000000..1d6149ff7b Binary files /dev/null and b/img/groups/images/YhyznG68PNewCNjoD_ceOg.png differ diff --git a/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg b/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg new file mode 100644 index 0000000000..e51aa1c8a4 Binary files /dev/null and b/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg differ diff --git a/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg b/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg new file mode 100644 index 0000000000..b5c27d1cd5 Binary files /dev/null and b/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg differ diff --git a/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg b/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg new file mode 100644 index 0000000000..f7cf6ed19b Binary files /dev/null and b/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg differ diff --git a/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg b/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg new file mode 100644 index 0000000000..e2fbccf16e Binary files /dev/null and b/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg differ diff --git a/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg b/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg new file mode 100644 index 0000000000..0ce158cb20 Binary files /dev/null and b/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg differ diff --git a/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg b/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg new file mode 100644 index 0000000000..88184b12b2 Binary files /dev/null and b/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg differ diff --git a/img/heise-dark.png b/img/heise-dark.png new file mode 100644 index 0000000000..c87546720e Binary files /dev/null and b/img/heise-dark.png differ diff --git a/img/heise-light.png b/img/heise-light.png new file mode 100644 index 0000000000..8f5dd51635 Binary files /dev/null and b/img/heise-light.png differ diff --git a/img/hero/dark/10fps/0000.webp b/img/hero/dark/10fps/0000.webp new file mode 100755 index 0000000000..40992dd5e7 Binary files /dev/null and b/img/hero/dark/10fps/0000.webp differ diff --git a/img/hero/dark/10fps/0001.webp b/img/hero/dark/10fps/0001.webp new file mode 100755 index 0000000000..18e7325ae9 Binary files /dev/null and b/img/hero/dark/10fps/0001.webp differ diff --git a/img/hero/dark/10fps/0002.webp b/img/hero/dark/10fps/0002.webp new file mode 100755 index 0000000000..1517725079 Binary files /dev/null and b/img/hero/dark/10fps/0002.webp differ diff --git a/img/hero/dark/10fps/0003.webp b/img/hero/dark/10fps/0003.webp new file mode 100755 index 0000000000..04be85fb1c Binary files /dev/null and b/img/hero/dark/10fps/0003.webp differ diff --git a/img/hero/dark/10fps/0004.webp b/img/hero/dark/10fps/0004.webp new file mode 100755 index 0000000000..de6ec47b3e Binary files /dev/null and b/img/hero/dark/10fps/0004.webp differ diff --git a/img/hero/dark/10fps/0005.webp b/img/hero/dark/10fps/0005.webp new file mode 100755 index 0000000000..46c9e70103 Binary files /dev/null and b/img/hero/dark/10fps/0005.webp differ diff --git a/img/hero/dark/10fps/0006.webp b/img/hero/dark/10fps/0006.webp new file mode 100755 index 0000000000..37046f2854 Binary files /dev/null and b/img/hero/dark/10fps/0006.webp differ diff --git a/img/hero/dark/10fps/0007.webp b/img/hero/dark/10fps/0007.webp new file mode 100755 index 0000000000..a0bd76a515 Binary files /dev/null and b/img/hero/dark/10fps/0007.webp differ diff --git a/img/hero/dark/10fps/0008.webp b/img/hero/dark/10fps/0008.webp new file mode 100755 index 0000000000..a69dfa0dcf Binary files /dev/null and b/img/hero/dark/10fps/0008.webp differ diff --git a/img/hero/dark/10fps/0009.webp b/img/hero/dark/10fps/0009.webp new file mode 100755 index 0000000000..84fead34ff Binary files /dev/null and b/img/hero/dark/10fps/0009.webp differ diff --git a/img/hero/dark/10fps/0010.webp b/img/hero/dark/10fps/0010.webp new file mode 100755 index 0000000000..87a6d352fd Binary files /dev/null and b/img/hero/dark/10fps/0010.webp differ diff --git a/img/hero/dark/10fps/0011.webp b/img/hero/dark/10fps/0011.webp new file mode 100755 index 0000000000..a917901e46 Binary files /dev/null and b/img/hero/dark/10fps/0011.webp differ diff --git a/img/hero/dark/10fps/0012.webp b/img/hero/dark/10fps/0012.webp new file mode 100755 index 0000000000..c23497b735 Binary files /dev/null and b/img/hero/dark/10fps/0012.webp differ diff --git a/img/hero/dark/10fps/0013.webp b/img/hero/dark/10fps/0013.webp new file mode 100755 index 0000000000..796b9eb0af Binary files /dev/null and b/img/hero/dark/10fps/0013.webp differ diff --git a/img/hero/dark/10fps/0014.webp b/img/hero/dark/10fps/0014.webp new file mode 100755 index 0000000000..ed7a6c6bbc Binary files /dev/null and b/img/hero/dark/10fps/0014.webp differ diff --git a/img/hero/dark/10fps/0015.webp b/img/hero/dark/10fps/0015.webp new file mode 100755 index 0000000000..c141bd53de Binary files /dev/null and b/img/hero/dark/10fps/0015.webp differ diff --git a/img/hero/dark/10fps/0016.webp b/img/hero/dark/10fps/0016.webp new file mode 100755 index 0000000000..2ea1e36e4b Binary files /dev/null and b/img/hero/dark/10fps/0016.webp differ diff --git a/img/hero/dark/10fps/0017.webp b/img/hero/dark/10fps/0017.webp new file mode 100755 index 0000000000..b629b17768 Binary files /dev/null and b/img/hero/dark/10fps/0017.webp differ diff --git a/img/hero/dark/10fps/0018.webp b/img/hero/dark/10fps/0018.webp new file mode 100755 index 0000000000..843af2d15d Binary files /dev/null and b/img/hero/dark/10fps/0018.webp differ diff --git a/img/hero/dark/10fps/0019.webp b/img/hero/dark/10fps/0019.webp new file mode 100755 index 0000000000..20de132790 Binary files /dev/null and b/img/hero/dark/10fps/0019.webp differ diff --git a/img/hero/dark/10fps/0020.webp b/img/hero/dark/10fps/0020.webp new file mode 100755 index 0000000000..a548cd61b3 Binary files /dev/null and b/img/hero/dark/10fps/0020.webp differ diff --git a/img/hero/dark/2fps/0005.webp b/img/hero/dark/2fps/0005.webp new file mode 100644 index 0000000000..0729d71419 Binary files /dev/null and b/img/hero/dark/2fps/0005.webp differ diff --git a/img/hero/dark/2fps/0008.webp b/img/hero/dark/2fps/0008.webp new file mode 100644 index 0000000000..57e6928d07 Binary files /dev/null and b/img/hero/dark/2fps/0008.webp differ diff --git a/img/hero/dark/2fps/0009.webp b/img/hero/dark/2fps/0009.webp new file mode 100644 index 0000000000..ac5cd4b2c0 Binary files /dev/null and b/img/hero/dark/2fps/0009.webp differ diff --git a/img/hero/dark/2fps/0011.webp b/img/hero/dark/2fps/0011.webp new file mode 100644 index 0000000000..feb1ba6d5c Binary files /dev/null and b/img/hero/dark/2fps/0011.webp differ diff --git a/img/hero/dark/2fps/0014.webp b/img/hero/dark/2fps/0014.webp new file mode 100644 index 0000000000..1d0349a0e3 Binary files /dev/null and b/img/hero/dark/2fps/0014.webp differ diff --git a/img/hero/dark/2fps/0017.webp b/img/hero/dark/2fps/0017.webp new file mode 100644 index 0000000000..db955954b3 Binary files /dev/null and b/img/hero/dark/2fps/0017.webp differ diff --git a/img/hero/dark/2fps/0018.webp b/img/hero/dark/2fps/0018.webp new file mode 100644 index 0000000000..1b5966613c Binary files /dev/null and b/img/hero/dark/2fps/0018.webp differ diff --git a/img/hero/dark/2fps/0020.webp b/img/hero/dark/2fps/0020.webp new file mode 100644 index 0000000000..2d160c9a19 Binary files /dev/null and b/img/hero/dark/2fps/0020.webp differ diff --git a/img/hero/dark/2fps/0022.webp b/img/hero/dark/2fps/0022.webp new file mode 100644 index 0000000000..cf560734e1 Binary files /dev/null and b/img/hero/dark/2fps/0022.webp differ diff --git a/img/hero/dark/2fps/0024.webp b/img/hero/dark/2fps/0024.webp new file mode 100644 index 0000000000..200234df61 Binary files /dev/null and b/img/hero/dark/2fps/0024.webp differ diff --git a/img/hero/dark/2fps/0027.webp b/img/hero/dark/2fps/0027.webp new file mode 100644 index 0000000000..ac2843de8c Binary files /dev/null and b/img/hero/dark/2fps/0027.webp differ diff --git a/img/hero/dark/2fps/0028.webp b/img/hero/dark/2fps/0028.webp new file mode 100644 index 0000000000..5ac019f594 Binary files /dev/null and b/img/hero/dark/2fps/0028.webp differ diff --git a/img/hero/dark/2fps/0030.webp b/img/hero/dark/2fps/0030.webp new file mode 100644 index 0000000000..ff53bd6095 Binary files /dev/null and b/img/hero/dark/2fps/0030.webp differ diff --git a/img/hero/dark/2fps/0032.webp b/img/hero/dark/2fps/0032.webp new file mode 100644 index 0000000000..0f6f60c028 Binary files /dev/null and b/img/hero/dark/2fps/0032.webp differ diff --git a/img/hero/dark/2fps/0035.webp b/img/hero/dark/2fps/0035.webp new file mode 100644 index 0000000000..83180145bf Binary files /dev/null and b/img/hero/dark/2fps/0035.webp differ diff --git a/img/hero/dark/2fps/0036.webp b/img/hero/dark/2fps/0036.webp new file mode 100644 index 0000000000..6b69a897c0 Binary files /dev/null and b/img/hero/dark/2fps/0036.webp differ diff --git a/img/hero/dark/2fps/0038.webp b/img/hero/dark/2fps/0038.webp new file mode 100644 index 0000000000..e5fd692d90 Binary files /dev/null and b/img/hero/dark/2fps/0038.webp differ diff --git a/img/hero/dark/2fps/0039.webp b/img/hero/dark/2fps/0039.webp new file mode 100644 index 0000000000..7e31e05804 Binary files /dev/null and b/img/hero/dark/2fps/0039.webp differ diff --git a/img/hero/light/10fps/0000.webp b/img/hero/light/10fps/0000.webp new file mode 100644 index 0000000000..e564a152ac Binary files /dev/null and b/img/hero/light/10fps/0000.webp differ diff --git a/img/hero/light/10fps/0001.webp b/img/hero/light/10fps/0001.webp new file mode 100644 index 0000000000..109684a09e Binary files /dev/null and b/img/hero/light/10fps/0001.webp differ diff --git a/img/hero/light/10fps/0002.webp b/img/hero/light/10fps/0002.webp new file mode 100644 index 0000000000..2df7f5a18f Binary files /dev/null and b/img/hero/light/10fps/0002.webp differ diff --git a/img/hero/light/10fps/0003.webp b/img/hero/light/10fps/0003.webp new file mode 100644 index 0000000000..5011bd5835 Binary files /dev/null and b/img/hero/light/10fps/0003.webp differ diff --git a/img/hero/light/10fps/0004.webp b/img/hero/light/10fps/0004.webp new file mode 100644 index 0000000000..4379da6ea2 Binary files /dev/null and b/img/hero/light/10fps/0004.webp differ diff --git a/img/hero/light/10fps/0005.webp b/img/hero/light/10fps/0005.webp new file mode 100644 index 0000000000..9e3effb2e0 Binary files /dev/null and b/img/hero/light/10fps/0005.webp differ diff --git a/img/hero/light/10fps/0006.webp b/img/hero/light/10fps/0006.webp new file mode 100644 index 0000000000..bcc9eaf0da Binary files /dev/null and b/img/hero/light/10fps/0006.webp differ diff --git a/img/hero/light/10fps/0007.webp b/img/hero/light/10fps/0007.webp new file mode 100644 index 0000000000..26ae9b977a Binary files /dev/null and b/img/hero/light/10fps/0007.webp differ diff --git a/img/hero/light/10fps/0008.webp b/img/hero/light/10fps/0008.webp new file mode 100644 index 0000000000..f0a1c389d6 Binary files /dev/null and b/img/hero/light/10fps/0008.webp differ diff --git a/img/hero/light/10fps/0009.webp b/img/hero/light/10fps/0009.webp new file mode 100644 index 0000000000..b32d9a3178 Binary files /dev/null and b/img/hero/light/10fps/0009.webp differ diff --git a/img/hero/light/10fps/0010.webp b/img/hero/light/10fps/0010.webp new file mode 100644 index 0000000000..189ad37c62 Binary files /dev/null and b/img/hero/light/10fps/0010.webp differ diff --git a/img/hero/light/10fps/0011.webp b/img/hero/light/10fps/0011.webp new file mode 100644 index 0000000000..ebddee21ce Binary files /dev/null and b/img/hero/light/10fps/0011.webp differ diff --git a/img/hero/light/10fps/0012.webp b/img/hero/light/10fps/0012.webp new file mode 100644 index 0000000000..f78a5d838b Binary files /dev/null and b/img/hero/light/10fps/0012.webp differ diff --git a/img/hero/light/10fps/0013.webp b/img/hero/light/10fps/0013.webp new file mode 100644 index 0000000000..81da2995b1 Binary files /dev/null and b/img/hero/light/10fps/0013.webp differ diff --git a/img/hero/light/10fps/0014.webp b/img/hero/light/10fps/0014.webp new file mode 100644 index 0000000000..313eae9819 Binary files /dev/null and b/img/hero/light/10fps/0014.webp differ diff --git a/img/hero/light/10fps/0015.webp b/img/hero/light/10fps/0015.webp new file mode 100644 index 0000000000..cbcdf6e696 Binary files /dev/null and b/img/hero/light/10fps/0015.webp differ diff --git a/img/hero/light/10fps/0016.webp b/img/hero/light/10fps/0016.webp new file mode 100644 index 0000000000..2f4179b87d Binary files /dev/null and b/img/hero/light/10fps/0016.webp differ diff --git a/img/hero/light/10fps/0017.webp b/img/hero/light/10fps/0017.webp new file mode 100644 index 0000000000..df354550d2 Binary files /dev/null and b/img/hero/light/10fps/0017.webp differ diff --git a/img/hero/light/10fps/0018.webp b/img/hero/light/10fps/0018.webp new file mode 100644 index 0000000000..cad608d6d8 Binary files /dev/null and b/img/hero/light/10fps/0018.webp differ diff --git a/img/hero/light/10fps/0019.webp b/img/hero/light/10fps/0019.webp new file mode 100644 index 0000000000..fcaf8b94ae Binary files /dev/null and b/img/hero/light/10fps/0019.webp differ diff --git a/img/hero/light/10fps/0020.webp b/img/hero/light/10fps/0020.webp new file mode 100644 index 0000000000..6bfd746923 Binary files /dev/null and b/img/hero/light/10fps/0020.webp differ diff --git a/img/hero/light/2fps/0005.webp b/img/hero/light/2fps/0005.webp new file mode 100644 index 0000000000..16dad0432e Binary files /dev/null and b/img/hero/light/2fps/0005.webp differ diff --git a/img/hero/light/2fps/0008.webp b/img/hero/light/2fps/0008.webp new file mode 100644 index 0000000000..a17929f323 Binary files /dev/null and b/img/hero/light/2fps/0008.webp differ diff --git a/img/hero/light/2fps/0009.webp b/img/hero/light/2fps/0009.webp new file mode 100644 index 0000000000..39e0755341 Binary files /dev/null and b/img/hero/light/2fps/0009.webp differ diff --git a/img/hero/light/2fps/0011.webp b/img/hero/light/2fps/0011.webp new file mode 100644 index 0000000000..827c7524af Binary files /dev/null and b/img/hero/light/2fps/0011.webp differ diff --git a/img/hero/light/2fps/0014.webp b/img/hero/light/2fps/0014.webp new file mode 100644 index 0000000000..726ca2044f Binary files /dev/null and b/img/hero/light/2fps/0014.webp differ diff --git a/img/hero/light/2fps/0017.webp b/img/hero/light/2fps/0017.webp new file mode 100644 index 0000000000..dc730cbc3e Binary files /dev/null and b/img/hero/light/2fps/0017.webp differ diff --git a/img/hero/light/2fps/0018.webp b/img/hero/light/2fps/0018.webp new file mode 100644 index 0000000000..11ac9af7e6 Binary files /dev/null and b/img/hero/light/2fps/0018.webp differ diff --git a/img/hero/light/2fps/0020.webp b/img/hero/light/2fps/0020.webp new file mode 100644 index 0000000000..47b81edc73 Binary files /dev/null and b/img/hero/light/2fps/0020.webp differ diff --git a/img/hero/light/2fps/0022.webp b/img/hero/light/2fps/0022.webp new file mode 100644 index 0000000000..1d400eae85 Binary files /dev/null and b/img/hero/light/2fps/0022.webp differ diff --git a/img/hero/light/2fps/0024.webp b/img/hero/light/2fps/0024.webp new file mode 100644 index 0000000000..e3d3312a9a Binary files /dev/null and b/img/hero/light/2fps/0024.webp differ diff --git a/img/hero/light/2fps/0027.webp b/img/hero/light/2fps/0027.webp new file mode 100644 index 0000000000..cf4ac08f1b Binary files /dev/null and b/img/hero/light/2fps/0027.webp differ diff --git a/img/hero/light/2fps/0028.webp b/img/hero/light/2fps/0028.webp new file mode 100644 index 0000000000..251286f6c0 Binary files /dev/null and b/img/hero/light/2fps/0028.webp differ diff --git a/img/hero/light/2fps/0030.webp b/img/hero/light/2fps/0030.webp new file mode 100644 index 0000000000..c2bc4cbfea Binary files /dev/null and b/img/hero/light/2fps/0030.webp differ diff --git a/img/hero/light/2fps/0032.webp b/img/hero/light/2fps/0032.webp new file mode 100644 index 0000000000..c434cd608a Binary files /dev/null and b/img/hero/light/2fps/0032.webp differ diff --git a/img/hero/light/2fps/0035.webp b/img/hero/light/2fps/0035.webp new file mode 100644 index 0000000000..42acb6ed0d Binary files /dev/null and b/img/hero/light/2fps/0035.webp differ diff --git a/img/hero/light/2fps/0036.webp b/img/hero/light/2fps/0036.webp new file mode 100644 index 0000000000..aee8e7d2aa Binary files /dev/null and b/img/hero/light/2fps/0036.webp differ diff --git a/img/hero/light/2fps/0038.webp b/img/hero/light/2fps/0038.webp new file mode 100644 index 0000000000..27fdec7a26 Binary files /dev/null and b/img/hero/light/2fps/0038.webp differ diff --git a/img/hero/light/2fps/0039.webp b/img/hero/light/2fps/0039.webp new file mode 100644 index 0000000000..6f4216e009 Binary files /dev/null and b/img/hero/light/2fps/0039.webp differ diff --git a/img/icon.svg b/img/icon.svg new file mode 100644 index 0000000000..6872614cf3 --- /dev/null +++ b/img/icon.svg @@ -0,0 +1,16 @@ + + + + 7D1F159A-EDEB-4E00-A1B8-9D852C99C1C8 + Created with sketchtool. + + + + + + + + + + + \ No newline at end of file diff --git a/img/icons/at.svg b/img/icons/at.svg new file mode 100644 index 0000000000..a71ceff309 --- /dev/null +++ b/img/icons/at.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/content-copy.svg b/img/icons/content-copy.svg new file mode 100644 index 0000000000..0968db1a75 --- /dev/null +++ b/img/icons/content-copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/email.svg b/img/icons/email.svg new file mode 100644 index 0000000000..b43653a071 --- /dev/null +++ b/img/icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/github.svg b/img/icons/github.svg new file mode 100644 index 0000000000..8d837acd02 --- /dev/null +++ b/img/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/linkedin.svg b/img/icons/linkedin.svg new file mode 100644 index 0000000000..65f54f28d9 --- /dev/null +++ b/img/icons/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/reddit.svg b/img/icons/reddit.svg new file mode 100644 index 0000000000..1c9a4ab7a4 --- /dev/null +++ b/img/icons/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/simplex.svg b/img/icons/simplex.svg new file mode 100644 index 0000000000..c3ce86d4e6 --- /dev/null +++ b/img/icons/simplex.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/icons/twitter.svg b/img/icons/twitter.svg new file mode 100644 index 0000000000..bb5c58d872 --- /dev/null +++ b/img/icons/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/iphone.png b/img/iphone.png new file mode 100644 index 0000000000..af008e1ff4 Binary files /dev/null and b/img/iphone.png differ diff --git a/img/kuketz-blog-dark.png b/img/kuketz-blog-dark.png new file mode 100644 index 0000000000..6a7ef79711 Binary files /dev/null and b/img/kuketz-blog-dark.png differ diff --git a/img/kuketz-blog-light.png b/img/kuketz-blog-light.png new file mode 100644 index 0000000000..5940c21993 Binary files /dev/null and b/img/kuketz-blog-light.png differ diff --git a/img/messaging.png b/img/messaging.png new file mode 100644 index 0000000000..9430c09876 Binary files /dev/null and b/img/messaging.png differ diff --git a/img/messaging.svg b/img/messaging.svg new file mode 100644 index 0000000000..51c8581561 --- /dev/null +++ b/img/messaging.svg @@ -0,0 +1,124 @@ + + + Group 14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/mobile.png b/img/mobile.png new file mode 100644 index 0000000000..fbda63a576 Binary files /dev/null and b/img/mobile.png differ diff --git a/img/new/QRcode-phone.png b/img/new/QRcode-phone.png new file mode 100644 index 0000000000..da804cc9b2 Binary files /dev/null and b/img/new/QRcode-phone.png differ diff --git a/img/new/apk_icon.png b/img/new/apk_icon.png new file mode 100644 index 0000000000..60ff342d36 Binary files /dev/null and b/img/new/apk_icon.png differ diff --git a/img/new/apple_store.svg b/img/new/apple_store.svg new file mode 100644 index 0000000000..b977fa2cf9 --- /dev/null +++ b/img/new/apple_store.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/arrow-left-dark.svg b/img/new/arrow-left-dark.svg new file mode 100644 index 0000000000..6300e60e17 --- /dev/null +++ b/img/new/arrow-left-dark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/arrow-left.svg b/img/new/arrow-left.svg new file mode 100644 index 0000000000..126b58ce20 --- /dev/null +++ b/img/new/arrow-left.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/arrow-right-dark.svg b/img/new/arrow-right-dark.svg new file mode 100644 index 0000000000..303c86e7d0 --- /dev/null +++ b/img/new/arrow-right-dark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/arrow-right.svg b/img/new/arrow-right.svg new file mode 100644 index 0000000000..06545fde18 --- /dev/null +++ b/img/new/arrow-right.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/bg_gfx.png b/img/new/bg_gfx.png new file mode 100644 index 0000000000..1f276b3112 Binary files /dev/null and b/img/new/bg_gfx.png differ diff --git a/img/new/contact_page_mobile.png b/img/new/contact_page_mobile.png new file mode 100644 index 0000000000..7d829965a8 Binary files /dev/null and b/img/new/contact_page_mobile.png differ diff --git a/img/new/content-copy.svg b/img/new/content-copy.svg new file mode 100644 index 0000000000..3e7992e927 --- /dev/null +++ b/img/new/content-copy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/img/new/cross.svg b/img/new/cross.svg new file mode 100644 index 0000000000..b48978e1ee --- /dev/null +++ b/img/new/cross.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/new/explained-1.svg b/img/new/explained-1.svg new file mode 100644 index 0000000000..6b7e352095 --- /dev/null +++ b/img/new/explained-1.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/explained-2.svg b/img/new/explained-2.svg new file mode 100644 index 0000000000..ac57f491ef --- /dev/null +++ b/img/new/explained-2.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/explained-3.svg b/img/new/explained-3.svg new file mode 100644 index 0000000000..745a97cd25 --- /dev/null +++ b/img/new/explained-3.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/f_droid.svg b/img/new/f_droid.svg new file mode 100644 index 0000000000..2d6ec68710 --- /dev/null +++ b/img/new/f_droid.svg @@ -0,0 +1,372 @@ + + + + + + + + + + + + + GET IT ON + F-Droid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/fdroid-qrcode.png b/img/new/fdroid-qrcode.png new file mode 100644 index 0000000000..0edc478617 Binary files /dev/null and b/img/new/fdroid-qrcode.png differ diff --git a/img/new/feature-1-dark.svg b/img/new/feature-1-dark.svg new file mode 100644 index 0000000000..806f7b650c --- /dev/null +++ b/img/new/feature-1-dark.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-1.svg b/img/new/feature-1.svg new file mode 100644 index 0000000000..893ab43e5c --- /dev/null +++ b/img/new/feature-1.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-2-dark.svg b/img/new/feature-2-dark.svg new file mode 100644 index 0000000000..6cb3aea2d1 --- /dev/null +++ b/img/new/feature-2-dark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-2.svg b/img/new/feature-2.svg new file mode 100644 index 0000000000..955baba0c3 --- /dev/null +++ b/img/new/feature-2.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-3-dark.svg b/img/new/feature-3-dark.svg new file mode 100644 index 0000000000..c01316adcc --- /dev/null +++ b/img/new/feature-3-dark.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-3.svg b/img/new/feature-3.svg new file mode 100644 index 0000000000..6763d8f97a --- /dev/null +++ b/img/new/feature-3.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-4-dark.svg b/img/new/feature-4-dark.svg new file mode 100644 index 0000000000..f3b8408ff8 --- /dev/null +++ b/img/new/feature-4-dark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-4.svg b/img/new/feature-4.svg new file mode 100644 index 0000000000..bc9119a365 --- /dev/null +++ b/img/new/feature-4.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-5-dark.svg b/img/new/feature-5-dark.svg new file mode 100644 index 0000000000..2d7ef7f185 --- /dev/null +++ b/img/new/feature-5-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/feature-5.svg b/img/new/feature-5.svg new file mode 100644 index 0000000000..8d26f55d99 --- /dev/null +++ b/img/new/feature-5.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/feature-6-dark.svg b/img/new/feature-6-dark.svg new file mode 100644 index 0000000000..f8d7f4239d --- /dev/null +++ b/img/new/feature-6-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/feature-6.svg b/img/new/feature-6.svg new file mode 100644 index 0000000000..e8e40df1ad --- /dev/null +++ b/img/new/feature-6.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/feature-7-dark.svg b/img/new/feature-7-dark.svg new file mode 100644 index 0000000000..28e36b04fe --- /dev/null +++ b/img/new/feature-7-dark.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-7.svg b/img/new/feature-7.svg new file mode 100644 index 0000000000..a2b79fb9da --- /dev/null +++ b/img/new/feature-7.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/feature-8-dark.svg b/img/new/feature-8-dark.svg new file mode 100644 index 0000000000..20b5a394a5 --- /dev/null +++ b/img/new/feature-8-dark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/img/new/feature-8.svg b/img/new/feature-8.svg new file mode 100644 index 0000000000..610b655292 --- /dev/null +++ b/img/new/feature-8.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/img/new/gitHub.svg b/img/new/gitHub.svg new file mode 100644 index 0000000000..4fc6c3b5b0 --- /dev/null +++ b/img/new/gitHub.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/new/google_play.svg b/img/new/google_play.svg new file mode 100644 index 0000000000..6cda5f6d31 --- /dev/null +++ b/img/new/google_play.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/hamburger.svg b/img/new/hamburger.svg new file mode 100644 index 0000000000..3cd8fa89b7 --- /dev/null +++ b/img/new/hamburger.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/img/new/logo-dark.png b/img/new/logo-dark.png new file mode 100644 index 0000000000..1886df819c Binary files /dev/null and b/img/new/logo-dark.png differ diff --git a/img/new/logo-light.png b/img/new/logo-light.png new file mode 100644 index 0000000000..3da724650f Binary files /dev/null and b/img/new/logo-light.png differ diff --git a/img/new/logo-symbol-dark.svg b/img/new/logo-symbol-dark.svg new file mode 100644 index 0000000000..fa598acf3d --- /dev/null +++ b/img/new/logo-symbol-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/img/new/logo-symbol-light.svg b/img/new/logo-symbol-light.svg new file mode 100644 index 0000000000..d8b5951a0b --- /dev/null +++ b/img/new/logo-symbol-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/mobile-hero.png b/img/new/mobile-hero.png new file mode 100644 index 0000000000..21d853e33e Binary files /dev/null and b/img/new/mobile-hero.png differ diff --git a/img/new/mobile-video-placeholder.png b/img/new/mobile-video-placeholder.png new file mode 100644 index 0000000000..ef22aed819 Binary files /dev/null and b/img/new/mobile-video-placeholder.png differ diff --git a/img/new/moon.svg b/img/new/moon.svg new file mode 100644 index 0000000000..1054735b5e --- /dev/null +++ b/img/new/moon.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/new/network-1-dark.svg b/img/new/network-1-dark.svg new file mode 100644 index 0000000000..d97de168c0 --- /dev/null +++ b/img/new/network-1-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/new/network-1.svg b/img/new/network-1.svg new file mode 100644 index 0000000000..b4f5c9ec7f --- /dev/null +++ b/img/new/network-1.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/network-2-dark.svg b/img/new/network-2-dark.svg new file mode 100644 index 0000000000..5a576eb4bb --- /dev/null +++ b/img/new/network-2-dark.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/network-2.svg b/img/new/network-2.svg new file mode 100644 index 0000000000..500c0e9e76 --- /dev/null +++ b/img/new/network-2.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/network-3-dark.svg b/img/new/network-3-dark.svg new file mode 100644 index 0000000000..41f3197344 --- /dev/null +++ b/img/new/network-3-dark.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/network-3.svg b/img/new/network-3.svg new file mode 100644 index 0000000000..ede81020cc --- /dev/null +++ b/img/new/network-3.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/phone1_0036.png b/img/new/phone1_0036.png new file mode 100644 index 0000000000..65e7d60bb2 Binary files /dev/null and b/img/new/phone1_0036.png differ diff --git a/img/new/phone1_0036mobile.png b/img/new/phone1_0036mobile.png new file mode 100644 index 0000000000..8ca0135c1f Binary files /dev/null and b/img/new/phone1_0036mobile.png differ diff --git a/img/new/phone_pane.png b/img/new/phone_pane.png new file mode 100644 index 0000000000..5d07df5a4d Binary files /dev/null and b/img/new/phone_pane.png differ diff --git a/img/new/play-btn.svg b/img/new/play-btn.svg new file mode 100644 index 0000000000..d311a79417 --- /dev/null +++ b/img/new/play-btn.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/new/privacy-section-1.svg b/img/new/privacy-section-1.svg new file mode 100644 index 0000000000..5a325b7e75 --- /dev/null +++ b/img/new/privacy-section-1.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/privacy-section-2.svg b/img/new/privacy-section-2.svg new file mode 100644 index 0000000000..13f63beba8 --- /dev/null +++ b/img/new/privacy-section-2.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/privacy-section-3.svg b/img/new/privacy-section-3.svg new file mode 100644 index 0000000000..a9c2465b6d --- /dev/null +++ b/img/new/privacy-section-3.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/img/new/private-1-dark.svg b/img/new/private-1-dark.svg new file mode 100644 index 0000000000..a62abdeecc --- /dev/null +++ b/img/new/private-1-dark.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-1.svg b/img/new/private-1.svg new file mode 100644 index 0000000000..0e7d213e61 --- /dev/null +++ b/img/new/private-1.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-10-dark.svg b/img/new/private-10-dark.svg new file mode 100644 index 0000000000..681f3adb01 --- /dev/null +++ b/img/new/private-10-dark.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-10.svg b/img/new/private-10.svg new file mode 100644 index 0000000000..83e814a8af --- /dev/null +++ b/img/new/private-10.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-2-dark.svg b/img/new/private-2-dark.svg new file mode 100644 index 0000000000..4b945f10fd --- /dev/null +++ b/img/new/private-2-dark.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-2.svg b/img/new/private-2.svg new file mode 100644 index 0000000000..3cf03114df --- /dev/null +++ b/img/new/private-2.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-3-dark.svg b/img/new/private-3-dark.svg new file mode 100644 index 0000000000..8193a9f719 --- /dev/null +++ b/img/new/private-3-dark.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-3.svg b/img/new/private-3.svg new file mode 100644 index 0000000000..77e0757b0b --- /dev/null +++ b/img/new/private-3.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-4-dark.svg b/img/new/private-4-dark.svg new file mode 100644 index 0000000000..0ccb78f11c --- /dev/null +++ b/img/new/private-4-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/new/private-4.svg b/img/new/private-4.svg new file mode 100644 index 0000000000..cb76605a15 --- /dev/null +++ b/img/new/private-4.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/new/private-5-dark.svg b/img/new/private-5-dark.svg new file mode 100644 index 0000000000..26131ec228 --- /dev/null +++ b/img/new/private-5-dark.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-5.svg b/img/new/private-5.svg new file mode 100644 index 0000000000..8e05bb28cd --- /dev/null +++ b/img/new/private-5.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-6-dark.svg b/img/new/private-6-dark.svg new file mode 100644 index 0000000000..c33644173d --- /dev/null +++ b/img/new/private-6-dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-6.svg b/img/new/private-6.svg new file mode 100644 index 0000000000..f44dd6cd3e --- /dev/null +++ b/img/new/private-6.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-7-dark.svg b/img/new/private-7-dark.svg new file mode 100644 index 0000000000..fc6fdfaf46 --- /dev/null +++ b/img/new/private-7-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/private-7.svg b/img/new/private-7.svg new file mode 100644 index 0000000000..002c2a4f92 --- /dev/null +++ b/img/new/private-7.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-8-dark.svg b/img/new/private-8-dark.svg new file mode 100644 index 0000000000..d78ce2e902 --- /dev/null +++ b/img/new/private-8-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-8.svg b/img/new/private-8.svg new file mode 100644 index 0000000000..bff6bbf896 --- /dev/null +++ b/img/new/private-8.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-9-dark.svg b/img/new/private-9-dark.svg new file mode 100644 index 0000000000..6e31db4d5a --- /dev/null +++ b/img/new/private-9-dark.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/private-9.svg b/img/new/private-9.svg new file mode 100644 index 0000000000..68b88fbd23 --- /dev/null +++ b/img/new/private-9.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/sun.svg b/img/new/sun.svg new file mode 100644 index 0000000000..8407b98e5f --- /dev/null +++ b/img/new/sun.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/new/tab-hero.svg b/img/new/tab-hero.svg new file mode 100644 index 0000000000..a4fdb24b8a --- /dev/null +++ b/img/new/tab-hero.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/new/tab-video.svg b/img/new/tab-video.svg new file mode 100644 index 0000000000..55e8b2d36e --- /dev/null +++ b/img/new/tab-video.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/img/new/testflight.png b/img/new/testflight.png new file mode 100644 index 0000000000..8111a69d54 Binary files /dev/null and b/img/new/testflight.png differ diff --git a/img/new/union.svg b/img/new/union.svg new file mode 100644 index 0000000000..20688b1d43 --- /dev/null +++ b/img/new/union.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/new/unique-section-1-dark.png b/img/new/unique-section-1-dark.png new file mode 100644 index 0000000000..2efee8b5e1 Binary files /dev/null and b/img/new/unique-section-1-dark.png differ diff --git a/img/new/unique-section-1.png b/img/new/unique-section-1.png new file mode 100644 index 0000000000..1b66493dfc Binary files /dev/null and b/img/new/unique-section-1.png differ diff --git a/img/new/unique-section-2-dark.png b/img/new/unique-section-2-dark.png new file mode 100644 index 0000000000..6449be2024 Binary files /dev/null and b/img/new/unique-section-2-dark.png differ diff --git a/img/new/unique-section-2.png b/img/new/unique-section-2.png new file mode 100644 index 0000000000..6474552747 Binary files /dev/null and b/img/new/unique-section-2.png differ diff --git a/img/new/unique-section-3-dark.png b/img/new/unique-section-3-dark.png new file mode 100644 index 0000000000..8eea04fe14 Binary files /dev/null and b/img/new/unique-section-3-dark.png differ diff --git a/img/new/unique-section-3.png b/img/new/unique-section-3.png new file mode 100644 index 0000000000..9bd584c45a Binary files /dev/null and b/img/new/unique-section-3.png differ diff --git a/img/new/unique-section-4-dark.png b/img/new/unique-section-4-dark.png new file mode 100644 index 0000000000..51dc83aa36 Binary files /dev/null and b/img/new/unique-section-4-dark.png differ diff --git a/img/new/unique-section-4.png b/img/new/unique-section-4.png new file mode 100644 index 0000000000..e9c461951d Binary files /dev/null and b/img/new/unique-section-4.png differ diff --git a/img/optout.jpg b/img/optout.jpg new file mode 100644 index 0000000000..3500e4d6db Binary files /dev/null and b/img/optout.jpg differ diff --git a/img/privacy-guides-dark.png b/img/privacy-guides-dark.png new file mode 100644 index 0000000000..9fbf9400e3 Binary files /dev/null and b/img/privacy-guides-dark.png differ diff --git a/img/privacy-guides-light.png b/img/privacy-guides-light.png new file mode 100644 index 0000000000..7a7acfe28e Binary files /dev/null and b/img/privacy-guides-light.png differ diff --git a/img/problem11.svg b/img/problem11.svg new file mode 100644 index 0000000000..ff73751ebb --- /dev/null +++ b/img/problem11.svg @@ -0,0 +1,103 @@ + + + Group 22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/problem12.svg b/img/problem12.svg new file mode 100644 index 0000000000..66f585bc37 --- /dev/null +++ b/img/problem12.svg @@ -0,0 +1,118 @@ + + + Group 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/problem21.svg b/img/problem21.svg new file mode 100644 index 0000000000..d711fba43a --- /dev/null +++ b/img/problem21.svg @@ -0,0 +1,121 @@ + + + Group 21 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/problem22.svg b/img/problem22.svg new file mode 100644 index 0000000000..d4c542339f --- /dev/null +++ b/img/problem22.svg @@ -0,0 +1,147 @@ + + + Group 23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/share_simplex.png b/img/share_simplex.png new file mode 100644 index 0000000000..17e4c05bbc Binary files /dev/null and b/img/share_simplex.png differ diff --git a/img/simplex-desktop-linux-dark-1.png b/img/simplex-desktop-linux-dark-1.png new file mode 100644 index 0000000000..c14b3cb52c Binary files /dev/null and b/img/simplex-desktop-linux-dark-1.png differ diff --git a/img/simplex-desktop-linux-dark-2.png b/img/simplex-desktop-linux-dark-2.png new file mode 100644 index 0000000000..2b4c73b7a9 Binary files /dev/null and b/img/simplex-desktop-linux-dark-2.png differ diff --git a/img/simplex-desktop-linux-light.png b/img/simplex-desktop-linux-light.png new file mode 100644 index 0000000000..132920c71d Binary files /dev/null and b/img/simplex-desktop-linux-light.png differ diff --git a/img/simplex.svg b/img/simplex.svg new file mode 100644 index 0000000000..b845ff219d --- /dev/null +++ b/img/simplex.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/simplex_mobile.png b/img/simplex_mobile.png new file mode 100644 index 0000000000..e1e51d1f46 Binary files /dev/null and b/img/simplex_mobile.png differ diff --git a/img/testflight.png b/img/testflight.png new file mode 100644 index 0000000000..8111a69d54 Binary files /dev/null and b/img/testflight.png differ diff --git a/img/topbar.svg b/img/topbar.svg new file mode 100644 index 0000000000..0280d9f620 --- /dev/null +++ b/img/topbar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/trail-of-bits-dark.png b/img/trail-of-bits-dark.png new file mode 100644 index 0000000000..46f4e8a91a Binary files /dev/null and b/img/trail-of-bits-dark.png differ diff --git a/img/trail-of-bits-light.png b/img/trail-of-bits-light.png new file mode 100644 index 0000000000..872133fe48 Binary files /dev/null and b/img/trail-of-bits-light.png differ diff --git a/img/whonix-dark.png b/img/whonix-dark.png new file mode 100644 index 0000000000..f361f4d1f6 Binary files /dev/null and b/img/whonix-dark.png differ diff --git a/img/whonix-light.png b/img/whonix-light.png new file mode 100644 index 0000000000..d8616b4a4b Binary files /dev/null and b/img/whonix-light.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000000..cf2fa743eb --- /dev/null +++ b/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/invitation/index.html b/invitation/index.html new file mode 100644 index 0000000000..bf2d2a57c8 --- /dev/null +++ b/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received a 1-time link to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/it/contact/index.html b/it/contact/index.html new file mode 100644 index 0000000000..c5e49883dd --- /dev/null +++ b/it/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Hai ricevuto un indirizzo per connetterti su SimpleX Chat

+

Per stabilire una connessione:

+ +
+

Installa l'app SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Connettiti nell'app

+ + + Apri l'app SimpleX + +
+

2

+
+
+ +
+

Tocca il pulsante 'connetti' nell'app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Unisciti a SimpleX

+

Ti invitiamo ad unirti alla conversazione

+ + + +

Iscriviti per ricevere i nostri aggiornamenti

+ +
+ + + +
+ +
+ +

Ottieni l'app desktop di SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/it/fdroid/index.html b/it/fdroid/index.html new file mode 100644 index 0000000000..3a8ccf119a --- /dev/null +++ b/it/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

Repo di SimpleX Chat

+
+
+

Versioni stabili e beta compilate dagli sviluppatori

+

Per aggiungerlo al tuo client F-Droid scansiona il codice QR o usa questo URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Impronta della chiave di firma (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Repo di F-Droid.org

+ +

Versioni stabili compilate da F-Droid.org

+

Le pubblicazioni su questo repo avvengono diversi giorni dopo.

+

I repository di SimpleX Chat e F-Droid.org firmano i pacchetti con chiavi diverse. Per passare da uno all'altro, esporta il database della chat e reinstalla l'app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/it/index.html b/it/index.html new file mode 100644 index 0000000000..d8525edb27 --- /dev/null +++ b/it/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/it/invitation/index.html b/it/invitation/index.html new file mode 100644 index 0000000000..eb5957e805 --- /dev/null +++ b/it/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Hai ricevuto un link una tantum per connetterti su SimpleX Chat

+

Per stabilire una connessione:

+ +
+

Installa l'app SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Connettiti nell'app

+ + + Apri l'app SimpleX + +
+

2

+
+
+ +
+

Tocca il pulsante 'connetti' nell'app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Unisciti a SimpleX

+

Ti invitiamo ad unirti alla conversazione

+ + + +

Iscriviti per ricevere i nostri aggiornamenti

+ +
+ + + +
+ +
+ +

Ottieni l'app desktop di SimpleX

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/it/learn-more/index.html b/it/learn-more/index.html new file mode 100644 index 0000000000..2524c882dd --- /dev/null +++ b/it/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Perché SimpleX è unico

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Hai una privacy completa

+
+ +
+ +
+

+ SimpleX protegge la privacy del tuo profilo, contatti e metadati, nascondendoli ai server della rete SimpleX e ad eventuali osservatori. +

+

+ A differenza di qualsiasi altra rete di messaggistica esistente, SimpleX non ha identificatori assegnati agli utenti — nemmeno numeri casuali. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Sei protetto
da spam e abusi

+
+ +
+ +
+

+ Poiché non hai un identificatore o un indirizzo fisso sulla rete SimpleX, nessuno può contattarti a meno che tu non condivida un indirizzo utente una tantum o temporaneo, come codice un QR o un link. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sei tu a controllare i tuoi dati

+
+ +
+ +
+

+ SimpleX conserva tutti i dati utente sui dispositivi client in un formato trasferibile di database crittografato — può essere trasferito su un altro dispositivo. +

+

+ I messaggi crittografati end-to-end vengono conservati temporaneamente sui server di inoltro SimpleX fino alla ricezione, quindi vengono eliminati definitivamente. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Possiedi la rete SimpleX

+
+ +
+ +
+

+ La rete SimpleX è completamente decentralizzata e indipendente da qualsiasi criptovaluta o altra rete, ad eccezione di internet. +

+

+ Puoi usare SimpleX con i tuoi server personali o con i server forniti da noi — e connetterti comunque a qualsiasi utente. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Caratteristiche

+ +
+ +
+
+ + +
+

Messaggi crittografati E2E con markdown e modifica

+
+ +
+
+ + +
+

Immagini, video e file
crittografati E2E

+
+ +
+
+ + +
+

Gruppi decentralizzati crittografati E2E — solo gli utenti sanno che esistono

+
+ +
+
+ + +
+

Messaggi vocali crittografati E2E

+
+ +
+
+ + +
+

Conversazioni segrete a tempo

+
+ +
+
+ + +
+

Chiamate audio e video
crittografate E2E

+
+ +
+
+ + +
+

Archiviazione dell'app crittografata e trasferibile — sposta il profilo su un altro dispositivo

+
+ +
+
+ + +
+

Modalità incognito —
unica su SimpleX Chat

+
+ +
+
+
+ + +
+
+

Cosa rende SimpleX privato

+ +
+
+ + +
+
+ + +
+
+

Identificatori temporanei anonimi a coppie

+
+ +

SimpleX usa indirizzi e credenziali temporanei anonimi a coppie, per ogni contatto o membro del gruppo.

+ +

Ciò consente di recapitare messaggi senza identificatori del profilo utente, garantendo una migliore privacy dei metadati rispetto alle alternative.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Scambio di chiavi
fuori banda

+
+ +

Molte reti di comunicazione sono vulnerabili agli attacchi MITM da parte di server o fornitori di rete.

+ +

Per evitarlo, le app SimpleX passano chiavi monouso fuori banda, quando condividi un indirizzo come link o codice QR.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

2 livelli di
crittografia end-to-end

+
+ +

Protocollo Double-ratchet —
Messaggistica OTR con Perfect Forward secrecy e recupero da intrusione.

+ +

Cryptobox NaCL in ogni coda per evitare correlazioni di traffico tra code di messaggi se il TLS è compromesso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Verifica
dell'integrità dei messaggi

+
+ +

Per garantire l'integrità, i messaggi sono numerati in sequenza e includono l'hash del messaggio precedente.

+ +

Se un messaggio viene aggiunto, rimosso o modificato, il destinatario verrà avvisato.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Livello aggiuntivo di
crittografia lato server

+
+ +

Livello aggiuntivo di crittografia lato server per il recapito al destinatario, per impedire la correlazione tra il traffico del server ricevuto e inviato se il TLS è compromesso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Mescolamento dei messaggi
per ridurre le correlazioni

+
+ +

I server SimpleX fungono da nodi mix a bassa latenza — i messaggi in entrata e in uscita hanno un ordine diverso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Trasporto TLS
autenticato sicuro

+
+ +

Usato solo TLS 1.2/1.3 con algoritmi avanzati per connessioni client-server.

+ +

Impronta del server e associazione dei canali evitano attacchi MITM e replay.

+ +

Ripresa della connessione disattivata per evitare attacchi alla sessione.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Accesso via Tor
opzionale

+
+ +

Per proteggere il tuo indirizzo IP puoi accedere ai server tramite Tor o un'altra rete di trasporto sovrapposta.

+ +

Per usare SimpleX tramite Tor, installa l'app Orbot e attiva il proxy SOCKS5 (o VPN su iOS).

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Code di messaggi
unidirezionali

+
+ +

Ogni coda di messaggi passa i messaggi in una direzione, con i diversi indirizzi di invio e ricezione.

+ +

Riduce i vettori di attacco, rispetto ai broker di messaggi tradizionali, e i metadati disponibili.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Diversi strati di
riempimento dei contenuti

+
+ +

SimpleX usa il riempimento dei contenuti per ogni livello di crittografia per frustrare gli attacchi alle dimensioni dei messaggi.

+ +

Fa sì che i messaggi di dimensioni diverse appaiano uguali ai server e a chi osserva la rete.

+ +
+

Tocca per chiudere

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Rete di SimpleX

+

Simplex Chat offre la migliore privacy combinando i vantaggi del P2P e delle reti federate.

+ +
+
+
+ + +
+
+

A differenza delle reti P2P

+

+ tutti i messaggi vengono inviati tramite i server, garantendo una migliore privacy dei metadati e una consegna asincrona dei messaggi affidabile, evitando molti problemi delle reti P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

A differenza delle reti federate

+

+ i server di inoltro SimpleX NON conservano i profili utente, i contatti e i messaggi consegnati, NON si connettono tra loro e NON esiste una directory dei server. +

+
+
+ + + +
+
+ + +
+
+

Nella rete di SimpleX

+

+ i server forniscono code unidirezionali per connettere gli utenti, ma non hanno visibilità del grafo delle connessioni di rete — solo gli utenti. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX spiegato

+ + + + + + + +
+
+ +
+
1. Cosa fanno gli utenti
+
+ +

+ Puoi creare contatti e gruppi, ed avere conversazioni bidirezionali, come in qualsiasi altro messenger. +

+

+ Come può funzionare con code unidirezionali e senza identificatori utente? +

+
+
+ +
+
2. Come funziona
+
+ +

+ Per ogni connessione usi due code di messaggi distinte per inviare e ricevere i messaggi attraverso server diversi. +

+

+ I server passano i messaggi solo in una direzione, senza avere il quadro completo delle conversazioni dell'utente o delle connessioni. +

+
+
+ +
+
3. Cosa vedono i server
+
+ +

+ I server hanno credenziali anonime separate per ogni coda e non sanno a quali utenti appartengano. +

+

+ Gli utenti possono aumentare ulteriormente la privacy dei metadati usando Tor per accedere ai server, evitando correlazioni per indirizzo IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Confronto con altri protocolli

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandi piattaformeXMPP, MatrixProtocolli P2P
Richiede un'identità globaleNo - privato123
Possibilità di MITMNo - sicuro 45
Dipendenza dai DNSNo - resistenteNo
Rete singola o centralizzataNo - decentralizzatoNo - federato 67
Componente centrale o altro attacco a livello di reteNo - resistente28
+
+ +
+ +
+
+
    +
  1. Solitamente si basa su un numero di telefono, in alcuni casi su nomi utente
  2. +
  3. Indirizzi basati su DNS
  4. +
  5. Chiave pubblica o altro ID univoco globale
  6. +
  7. I relay di SimpleX non possono compromettere la crittografia e2e. Verifica il codice di sicurezza per mitigare gli attacchi sul canale fuori banda
  8. +
  9. Se i server dell'operatore sono compromessi. Verifica il codice di sicurezza in Signal e alcune altre app per mitigarlo
  10. +
  11. Non protegge la privacy dei metadati degli utenti
  12. +
  13. Sebbene i P2P siano distribuiti, non sono federati — operano come un'unica rete
  14. +
  15. Le reti P2P hanno un'autorità centrale o l'intera rete può essere compromessa - vedi qui
  16. +
+
+
+
+
+ + +

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

+ + + + + + + + + + diff --git a/ja/contact/index.html b/ja/contact/index.html new file mode 100644 index 0000000000..4faecb52ec --- /dev/null +++ b/ja/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

SimpleX Chatで接続するためのアドレスを受信しました

+

接続するには:

+ +
+

SimpleX アプリをインストールする

+
+ + + +
+ +
+

1

+
+
+ +
+

アプリで接続する

+ + + SimpleXアプリを開く + +
+

2

+
+
+ +
+

アプリの 「接続」 ボタンをタップします

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

参加 SimpleX

+

ぜひ会話にご参加ください

+ + + +

最新情報を受け取る

+ +
+ + + +
+ +
+ +

SimpleXを入手する desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ja/fdroid/index.html b/ja/fdroid/index.html new file mode 100644 index 0000000000..7f2e6abd76 --- /dev/null +++ b/ja/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

F-Droid 経由の SimpleX チャット

+ +
+ +
+

SimpleX チャット リポジトリ

+
+
+

開発者によって構築された安定版とベータ版

+

F-Droid クライアントに追加するには、QR コードをスキャンするか、次の URL を使用します:

+ + https://app.simplex.chat/fdroid/repo + +

+ 署名キーのフィンガープリント (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org リポジトリ

+ +

F-Droid.org によって構築された安定バージョン

+

このリポジトリへのリリースは数日後に行われます.

+

SimpleX Chat と F-Droid.org リポジトリは、異なるキーを使用してビルドに署名します。 切り替えるには、チャット データベースをエクスポートし、アプリを再インストールしてください。

+
+
+ +
+
+ + + + + + + + + + diff --git a/ja/index.html b/ja/index.html new file mode 100644 index 0000000000..2cdd9d3ed8 --- /dev/null +++ b/ja/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/ja/invitation/index.html b/ja/invitation/index.html new file mode 100644 index 0000000000..e170309362 --- /dev/null +++ b/ja/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

SimpleX Chatで接続するための使い捨てのリンクを受信しました

+

接続するには:

+ +
+

SimpleX アプリをインストールする

+
+ + + +
+ +
+

1

+
+
+ +
+

アプリで接続する

+ + + SimpleXアプリを開く + +
+

2

+
+
+ +
+

アプリの 「接続」 ボタンをタップします

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

参加 SimpleX

+

ぜひ会話にご参加ください

+ + + +

最新情報を受け取る

+ +
+ + + +
+ +
+ +

SimpleXを入手する desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ja/learn-more/index.html b/ja/learn-more/index.html new file mode 100644 index 0000000000..4f93adc63c --- /dev/null +++ b/ja/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

なぜSimpleXなのか唯一

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

プライバシーが完全に守られます

+
+ +
+ +
+

+ SimpleXは、SimpleXネットワークのサーバやその他の観察者から隠すことで、あなたのプロフィール、連絡先やメタデータのプライバシーを守ります。 +

+

+ その他の既存のメッセージネットワークと異なり、SimpleXはユーザへ識別子を割り当てません — ランダムな番号さえありません。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

スパムや悪用から
保護されています

+
+ +
+ +
+

+ あなたは識別子や固定されたアドレスをSimpleXネットワーク上で持たないため、あなたがQRコードやリンクといった一度のみ使用可能もしくは一時的なユーザアドレスを共有しない限り、誰もあなたへ連絡することができません。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

データを管理するのはあなたです

+
+ +
+ +
+

+ SimpleXはクライアント端末上の全てのユーザデータを ポータブルで暗号化されたデータベースフォーマットで保管します—別の端末へ移行することができます。 +

+

+ エンドツーエンドで暗号化されたメッセージは、SimpleXのリレーサーバ上で受信されるまで一時的に保管され、その後永久的に削除されます。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

SimpleX ネットワークを所有

+
+ +
+ +
+

+ SimpleXネットワークは、インターネット以外のいかなる暗号通貨やネットワークから独立しており、完全に分散化されています。 +

+

+ あなたは私たちの提供するサーバや 自分自身のサーバでSimpleXを使う ことができます — そして別のユーザとつながることができます。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

特徴

+ +
+ +
+
+ + +
+

マークダウンと編集を使用可能なE2E 暗号化メッセージ

+
+ +
+
+ + +
+

E2E暗号化された
画像とファイル

+
+ +
+
+ + +
+

分散型シークレットグループ —
ユーザーのみがその存在を知っています

+
+ +
+
+ + +
+

E2E暗号化された音声メッセージ

+
+ +
+
+ + +
+

消えるメッセージ

+
+ +
+
+ + +
+

E2E暗号化された
音声通話とビデオ通話

+
+ +
+
+ + +
+

ポータブルな暗号化データベース — プロファイルを別のデバイスに移動する

+
+ +
+
+ + +
+

シークレット モード —
SimpleX Chat に固有の

+
+ +
+
+
+ + +
+
+

SimpleX をプライベートにするもの

+ +
+
+ + +
+
+ + +
+
+

一時的な匿名のペア識別子

+
+ +

SimpleX は、ユーザー連絡先またはグループ メンバーごとに、一時的な匿名のペアごとのアドレスと資格情報を使用します。

+ +

ユーザー プロファイル識別子なしでメッセージを配信できるため、他の方法よりも優れたメタデータ プライバシーが提供されます。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

帯域外の
鍵交換

+
+ +

多くの通信ネットワークは、サーバーやネットワーク プロバイダーによるMITM 攻撃に対して脆弱です。

+ +

これを防ぐために、SimpleX アプリは、アドレスをリンクまたは QR コードとして共有するときに、ワンタイム キーを帯域外で渡します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

2レイヤーの
エンドツーエンド暗号化

+
+ +

ダブルラチェットプロトコル —
完全な前方秘匿性と侵入回復機能を備えたOTRメッセージング。

+ +

各キューのNaCL cryptoboxは、TLSが侵害された場合にメッセージキュー間のトラフィック相関を防止します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

メッセージの整合性
検証

+
+ +

整合性を保証するために、メッセージには連続した番号が付けられ、前のメッセージのハッシュが含まれます。

+ +

メッセージが追加、削除、または変更されると、受信者に警告が表示されます。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

追加レイヤーの
サーバー暗号化

+
+ +

TLSが侵害された場合、受信したサーバー・トラフィックと送信したサーバー・トラフィックの相関を防ぐため、受信者に配信するサーバー暗号化レイヤーを追加します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

メッセージのミキシング
相関性を減らす

+
+ +

SimpleX サーバーは、低遅延の混合ノードとして機能します — 受信メッセージと送信メッセージの順序が異なります。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

セキュアな認証付き
TLSトランスポート

+
+ +

クライアント/サーバー接続には、強力なアルゴリズムを備えた TLS 1.2/1.3 のみが使用されます。

+ +

サーバーのフィンガープリントとチャネル バインディングにより、MITM 攻撃やリプレイ攻撃を防止します。

+ +

セッション攻撃を防ぐために、接続の再開は無効になっています。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

オプション
Tor経由のアクセス

+
+ +

IP アドレスを保護するために、Tor またはその他のトランスポート オーバーレイ ネットワーク経由でサーバーにアクセスできます。

+ +

Tor経由でSimpleXを使用するには、Orbotアプリをインストールし、SOCKS5プロキシを有効にしてください(iOSの場合はVPN)。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

単方向
メッセージキュー

+
+ +

各メッセージ キューは、異なる送信アドレスと受信アドレスを使用してメッセージを一方向に渡します。

+ +

従来のメッセージ ブローカーと比較して、攻撃ベクトルが減少し、利用可能なメタデータが減少します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

何レイヤーもの
コンテンツパディング

+
+ +

SimpleX は、各暗号化レイヤーにコンテンツ パディングを使用して、メッセージ サイズ攻撃を阻止します。

+ +

これにより、異なるサイズのメッセージがサーバーやネットワーク オブザーバーには同じように見えます。

+ +
+

タップして閉じる

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX ネットワーク

+

Simplex Chat は、P2P とフェデレーション ネットワークの利点を組み合わせて最高のプライバシーを提供します。

+ +
+
+
+ + +
+
+

P2Pネットワークとは異なります

+

+ すべてのメッセージはサーバー経由で送信され、メタデータのプライバシーが向上し、信頼性の高い非同期メッセージ配信が提供されると同時に、多くが回避されます P2Pネットワークの問題点. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

連合型ネットワークとは異なります

+

+ SimpleX リレー サーバーは、ユーザー プロファイル、連絡先、配信されたメッセージを保存せず、相互に接続せず、サーバー ディレクトリもありません。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX ネットワーク

+

+ サーバーはユーザーを接続するための一方向キューを提供しますが、ネットワーク接続グラフは表示されません— ユーザーだけがそうします。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleXの説明

+ + + + + + + +
+
+ +
+
1. ユーザーが経験すること
+
+ +

+ 他のメッセンジャーと同様に、連絡先やグループを作成し、双方向の会話を行うことができます。 +

+

+ ユーザー プロファイル識別子なしで単方向キューをどのように処理できるのでしょうか? +

+
+
+ +
+
2. 仕組み
+
+ +

+ 接続ごとに 2 つの個別のメッセージング キューを使用して、異なるサーバー経由でメッセージを送受信します。 +

+

+ サーバーは、ユーザーの会話や接続の全体像を把握することなく、メッセージを一方向に渡すだけです。 +

+
+
+ +
+
3. サーバーが認識するもの
+
+ +

+ サーバーはキューごとに個別の匿名認証情報を持っており、どのユーザーに属しているかはわかりません。 +

+

+ ユーザーは、Tor を使用してサーバーにアクセスし、IP アドレスによる相関を防ぐことで、メタデータのプライバシーをさらに向上させることができます。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

他のプロトコルとの比較

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal、大きなプラットフォームXMPP、MatrixP2Pプロトコル
グローバル ID が必要いいえ - プライベートはい 1はい 2はい 3
MITMの可能性いいえ - 安全 4はい 5はいはい
DNS への依存いいえ - 弾力性はいはいいいえ
単一または集中型ネットワークいいえ - 分散型はいいいえ - 連合型 6はい 7
中央コンポーネントまたはその他のネットワーク全体の攻撃いいえ - 弾力性はいはい 2はい 8
+
+ +
+ +
+
+
    +
  1. 通常は電話番号に基づいていますが、場合によってはユーザー名に基づいています
  2. +
  3. DNSベースのアドレス
  4. +
  5. 公開キーまたはその他のグローバルに一意な ID
  6. +
  7. SimpleX リレーは e2e 暗号化を侵害できません。 セキュリティ コードを検証して帯域外チャネルへの攻撃を軽減します
  8. +
  9. オペレーターのサーバーが侵害された場合。 Signal およびその他の一部のアプリでセキュリティ コードを検証して緩和する
  10. +
  11. ユーザーのメタデータのプライバシーを保護しない
  12. +
  13. P2Pは分散されていますが、フェデレーションされていません — 単一のネットワークとして動作します
  14. +
  15. P2Pネットワークには中央当局が存在するか、ネットワーク全体が侵害される可能性がある - こちらを見る
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/jobs/index.html b/jobs/index.html new file mode 100644 index 0000000000..d9fbb86ab2 --- /dev/null +++ b/jobs/index.html @@ -0,0 +1,569 @@ + + + + + + + + Join SimpleX Chat team + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+
+

Join SimpleX Chat team

+

SimpleX Chat is a seed stage startup with a lot of user growth in 2022-2025, and a lot of exciting technical and product problems to solve to grow faster.

+

We currently have 4 people in the team.

+

We are looking for passionate and creative people to help us!

+

Who we are looking for

+
+

Mobile application developer

+ + + +

You:

    +
  • created mobile applications for Android platforms as your own full-time or side projects,
  • +
  • expertise with Android APIs, Kotlin and JetPack Compose framework,
  • +
  • a good taste for mobile apps design would be a bonus.
  • +

It is not a full time job yet, we have some specific problems to solve in the Android app. If we are happy working together it is likely to evolve into a full-time job offer in 2026.

Please ONLY apply if you created and released your own apps (not as a job or contract for somebody else).

+ + + + +

How to join the team

+
    +
  1. +

    Install the app, try using it with the friends and join some user groups – you will discover a lot of things that need improvements.

    +
  2. +
  3. +

    Also look through GitHub issues submitted by the users to see what would you want to contribute as a test.

    +
  4. +
  5. +

    Connect to us via SimpleX Chat to chat about what you want to contribute and about joining the team.

    +
  6. +
  7. +

    You can also email jobs@simplex.chat

    +
  8. +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/js/animation.js b/js/animation.js new file mode 100644 index 0000000000..26217a8a72 --- /dev/null +++ b/js/animation.js @@ -0,0 +1,130 @@ +window.addEventListener("load", function () { + const imgPath = "/img/hero" + const fastImages = mkFastImages(0, 20); + const slowImages = mkSlowImages([ + ["0005", 3], + ["0008", 1], + ["0009", 2], + ["0011", 3], + ["0014", 3], + ["0017", 1], + ["0018", 2], + ["0020", 2], + ["0022", 2], + ["0024", 3], + ["0027", 1], + ["0028", 2], + ["0030", 2], + ["0032", 3], + ["0035", 1], + ["0036", 2], + ["0038", 1], + ["0039", 1] + ]) + + let complete = false; + run(); + window.onload = run; + + function mkFastImages(from, to) { + const seq = []; + for (let n = from; n <= to; n++) { + let img = "" + n; + img = "0".repeat(4 - img.length) + img; + seq.push([`${imgPath}/light/10fps/${img}.webp`, `${imgPath}/dark/10fps/${img}.webp`, 1]); + } + return seq; + } + + function mkSlowImages(images) { + return images.map(([img, n]) => [`${imgPath}/light/2fps/${img}.webp`, `${imgPath}/dark/2fps/${img}.webp`, n]) + } + + // function setupScroll (imgBackground) { + // const totalHeight = this.document.body.scrollHeight - this.window.innerHeight; + // this.window.onscroll = () => { + // let progressHeight = (window.pageYOffset / totalHeight) * 100; + // if (progressHeight > 10) { + // imgBackground.style.position = "absolute"; + // imgBackground.style.top = "100%"; + // } else { + // imgBackground.style.position = "fixed"; + // imgBackground.style.top = "auto"; + // } + // }; + // } + + async function run() { + const lightImageEl = document.getElementById("hero-phone-light"); + const darkImageEl = document.getElementById("hero-phone-dark"); + const preloadEl = document.getElementById("hero-phone-preload"); + const imgBackground = document.getElementsByClassName("hero-phone-background")[0] + const videoEl = this.document.getElementById("hero-phone-video") + if (complete || !lightImageEl || !darkImageEl || !preloadEl || !imgBackground || !videoEl) return; + complete = true; + // setupScroll(imgBackground) + await preload(fastImages.concat(slowImages)); + await animate(fastImages, 100); + await delay(500) + await animate(slowImages, 500); + // todo - this should happen on scroll, not when animation ends + lightImageEl.style.animationName = "big"; + darkImageEl.style.animationName = "big"; + videoEl.style.animationName = "bigvideo"; + if (window.innerWidth > 1279) { + videoEl.style.display = "block"; + } + + async function preload(images) { + let imgEls = []; + let resolved = false; + return new Promise((resolve) => { + setTimeout(() => { + if (!resolved) { + resolved = true; + resolve(); + } + }, 2000); + for (const [lightImg, darkImg] of images) { + preloadImg(lightImg) + preloadImg(darkImg) + } + + function preloadImg(img) { + const el = document.createElement("img"); + el.src = img; + imgEls.push(el); + preloadEl.appendChild(el); + const loaded = () => { + imgEls = imgEls.filter((e) => e !== el); + if (imgEls.length === 0 && !resolved) { + resolved = true; + resolve(); + } + }; + el.addEventListener("load", loaded); + el.addEventListener("error", loaded); + } + }); + } + + async function animate(images, ms) { + let i = 0; + for (const [lightImg, darkImg, n] of images) { + lightImageEl.src = lightImg; + darkImageEl.src = darkImg; + i++; + if (ms == 500 && i > 16) { + // TODO this is hack, also this should happen on scroll, not during the animation + lightImageEl.style.animationName = "small"; + darkImageEl.style.animationName = "small"; + } + await delay(ms * n); + } + } + + async function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + } +}); \ No newline at end of file diff --git a/js/animation2.js b/js/animation2.js new file mode 100644 index 0000000000..1513a54678 --- /dev/null +++ b/js/animation2.js @@ -0,0 +1,114 @@ +window.addEventListener("load", function () { + // const slowImages = mkSequence("./slowImages2/Lightphone1_", 8, 39, ".png") + console.log(this.window.innerWidth); + // if (window.innerWidth <= 770) { + // this.document.getElementsByClassName( + // "flex items-center gap-10" + // )[0].style.display = "none"; + // this.document.getElementsByClassName("hero-phone-background")[0].className = + // "tablet-hero-phone-background"; + // this.document.getElementById("hero-phone").src = + // "../slowImages1/Lightphone1_0015.png"; + // this.document.getElementById("hero-phone").className = "tablet-hero-phone"; + // } else + if (window.innerWidth > 770) { + const fastImages = mkSequence("/img/new/fastImages/Lightphone1_", 0, 30, ".png"); + const slowImages = mkSequence("/img/new/slowImages1/Lightphone1_", 8, 47, ".png"); + + let complete = false; + run(); + window.onload = run; + + function mkSequence(prefix, from, to, ext) { + const seq = []; + for (let n = from; n <= to; n++) { + let suffix = "" + n; + suffix = "0".repeat(4 - suffix.length) + suffix; + seq.push(prefix + suffix + ext); + } + return seq; + } + + let totalHeight = this.document.body.scrollHeight - this.window.innerHeight; + this.window.onscroll = function () { + let progressHeight = (window.pageYOffset / totalHeight) * 100; + if (progressHeight > 11) { + document.getElementsByClassName( + "hero-phone-background" + )[0].style.position = "absolute"; + document.getElementsByClassName("hero-phone-background")[0].style.top = + "100%"; + } else { + document.getElementsByClassName( + "hero-phone-background" + )[0].style.position = "fixed"; + document.getElementsByClassName("hero-phone-background")[0].style.top = + "auto"; + } + }; + + async function run() { + const imageEl = document.getElementById("hero-phone"); + const preloadEl = document.getElementById("hero-phone-preload"); + if (complete || !imageEl || !preloadEl) return; + complete = true; + await preload(fastImages.concat(slowImages)); + await animate(fastImages, 100); + await animate(slowImages, 500); + + async function preload(images) { + let imgEls = []; + let resolved = false; + return new Promise((resolve) => { + setTimeout(() => { + if (!resolved) { + resolved = true; + resolve(); + } + }, 2000); + for (const img of images) { + const el = document.createElement("img"); + el.src = img; + imgEls.push(el); + preloadEl.appendChild(el); + const loaded = () => { + imgEls = imgEls.filter((e) => e !== el); + if (imgEls.length === 0 && !resolved) { + resolved = true; + resolve(); + } + }; + el.addEventListener("load", loaded); + el.addEventListener("error", loaded); + } + }); + } + + async function animate(images, ms) { + let i = 0; + for (const img of images) { + imageEl.src = img; + i++; + if (ms == 500 && i > 30) { + this.document.getElementById("hero-phone").style.animationName = + "small"; + } + if (ms == 500 && i > 38) { + this.document.getElementById("hero-phone").style.animationName = + "big"; + this.document.getElementById( + "hero-phone-video" + ).style.animationName = "bigvideo"; + this.document.getElementById("hero-phone-video").style.display = + "block"; + } + await delay(ms); + } + } + + async function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + } + } +}); \ No newline at end of file diff --git a/js/contact.js b/js/contact.js new file mode 100644 index 0000000000..b1a99b74f9 --- /dev/null +++ b/js/contact.js @@ -0,0 +1,66 @@ +(function () { + + let complete = false + run() + window.onload = run + + async function run() { + const connURIel = document.getElementById("conn_req_uri_text"); + const mobileConnURIanchor = document.getElementById("mobile_conn_req_uri"); + const connQRCodes = document.getElementsByClassName("conn_req_uri_qrcode"); + console.log(connQRCodes); + if (complete || !connURIel || !mobileConnURIanchor || connQRCodes < 2) return + complete = true + let connURI = document.location.toString() + const parsedURI = new URL(connURI) + const path = parsedURI.pathname.split("/") + const len = path.length + const action = path[len - (path[len - 1] == "" ? 2 : 1)] + parsedURI.protocol = "https" + parsedURI.pathname = "/" + action + connURI = parsedURI.toString() + console.log("connection URI: ", connURI) + mobileConnURIanchor.href = "simplex:" + parsedURI.pathname + parsedURI.hash + connURIel.innerText = "/c " + connURI + for (const connQRCode of connQRCodes) { + try { + await QRCode.toCanvas(connQRCode, connURI, { + errorCorrectionLevel: "M", + color: {dark: "#062D56"} + }); + connQRCode.style.width = "320px"; + connQRCode.style.height = "320px"; + } catch (err) { + console.error(err); + } + } + + function contentCopyWithTooltip(parent) { + const content = parent.querySelector(".content"); + const tooltip = parent.querySelector(".tooltiptext"); + console.log(parent.querySelector(".content_copy"), 111) + console.log(parent) + const copyButton = parent.querySelector(".content_copy"); + copyButton.addEventListener("click", copyAddress) + copyButton.addEventListener("mouseout", resetTooltip) + + function copyAddress() { + navigator.clipboard.writeText(content.innerText || content.value); + tooltip.innerHTML = "Copied!"; + } + + function resetTooltip() { + tooltip.innerHTML = "Copy to clipboard"; + } + } + + function copyAddress() { + navigator.clipboard.writeText(connURI); + tooltipEl.innerHTML = "Copied!"; + } + + function resetTooltip() { + tooltipEl.innerHTML = "Copy to clipboard"; + } + } +})(); diff --git a/js/demo.js b/js/demo.js new file mode 100644 index 0000000000..21beec97f4 --- /dev/null +++ b/js/demo.js @@ -0,0 +1,347 @@ +(async function () { + let DELAY = 0; + const DISTR = 0.33; + + class User { + constructor(name) { + this.userWindow = document.querySelector(`#demo .user.${name}`); + this.terminal = this.userWindow.querySelector(`.terminal`); + this.input = this.terminal.querySelector(".input"); + this.demoInput = this.terminal.querySelector("input"); + this.resetInput(); + this.setupDemo(); + this.group = []; + this.display = this.terminal.querySelector(".display"); + this.setupMoveWindow(); + this.name = name; + } + + reset() { + this.resetInput(); + this.display.innerHTML = ""; + } + + setGroup(groupName, users) { + this.users = users; + this.group = users.filter((u) => u !== this); + this.groupName = groupName; + } + + tryDemo() { + this.reset(); + show(this.demoInput); + this.demoInput.value = ""; + } + + async send(to, message, typeTo, paste, secret) { + await this._sendMsg(`@${to.name}`, message, typeTo, paste, secret); + await to.receive(this, toSecret(secret, message)); + await delay(20); + } + + async sendGroup(message, typeTo, paste) { + await this._sendMsg(`#${this.groupName}`, message, typeTo, paste); + await this.receiveGroup(message); + await delay(10); + } + + async _sendMsg(toStr, message, typeTo, paste, secret) { + await this.type(`${toStr} `, !typeTo); + if (secret) await this.type("#"); + await this.type(message, paste); + if (secret) await this.type("#"); + await delay(10); + this.resetInput(); + this.show("sent", `${toStr} ${toSecret(secret, message)}`); + } + + async type(str, paste) { + if (paste) { + await delay(10); + this.input.insertAdjacentHTML("beforeend", str); + } else { + for (const char of str) { + await delay(isAlpha(char) ? 1 : 2); + this.input.insertAdjacentHTML("beforeend", char); + } + } + await delay(2); + } + + resetInput() { + this.input.innerHTML = "> "; + show(this.demoInput, false); + } + + async receive(from, message, edit, group) { + await delay(10); + let g = group ? `#${this.groupName} ` : ""; + this.show("received", `${g}${from.name}> ${message}`, edit); + } + + async receiveGroup(message, edit) { + await Promise.all(this.group.map((u) => u.receive(this, message, edit, true))); + } + + show(mode, str, edit) { + if (edit && this.lastMessage) { + this.lastMessage.innerHTML = highlight(str); + return; + } + this.display.insertAdjacentHTML("beforeend", `
${highlight(str)}
`); + } + + setupDemo() { + if (!this.demoInput) return; + let editMode = false; + + on("keypress", this.demoInput, async ({ key }) => { + if (key === "Enter") { + const edit = editMode; + editMode = false; + const [to, ...words] = this.demoInput.value.trim().split(" "); + const message = words.join(" "); + switch (to[0]) { + case undefined: + if (message !== "") { + this.show("error", "Message should start with @user or #group"); + } + break; + case "@": + await this.sendInput(to.slice(1), message, edit); + break; + case "#": + await this.sendInputGroup(to.slice(1), message, edit); + break; + default: + this.show("error", "Message should start with @user or #group"); + } + } else if (this.demoInput.value === "" && key !== "@" && key !== "#") { + const channel = this.currentChannel(); + if (channel) this.demoInput.value = channel + " "; + } + }); + on("keydown", this.demoInput, async (e) => { + switch (e.key) { + case "ArrowUp": + if (this.demoInput.value === "" && this.lastMessage) { + const str = (this.demoInput.value = this.lastMessage.innerText); + editMode = true; + await delay(0); + this.demoInput.selectionStart = str.length; + } + break; + case "Tab": { + e.preventDefault(); + const userIndex = this.users.indexOf(this); + const nextIndex = (userIndex + 1) % this.users.length; + this.users[nextIndex].demoInput.focus(); + } + } + }); + } + + async sendInput(name, message, edit) { + if (name === this.name) { + this.show("error", "Can't send message to yourself"); + return; + } + const recipient = this.group.find((u) => u.name === name); + if (recipient === undefined) { + const knownNames = this.group.map((u) => `@${u.name}`).join(", ") + ` or @${this.name}`; + this.show("error", `Unknown recipient @${name} (try ${knownNames})`); + return; + } + this.show("sent", `@${name} ${message}`, edit); + this.demoInput.value = ""; + await recipient.receive(this, message, edit); + } + + async sendInputGroup(name, message, edit) { + if (name !== this.groupName) { + this.show("error", `Unknown group #${name} (try #team)`); + return; + } + this.show("sent", `#${name} ${message}`, edit); + this.demoInput.value = ""; + await this.receiveGroup(message, edit); + } + + get lastMessage() { + const messages = this.display.childNodes; + return messages[messages.length - 1]; + } + + currentChannel() { + return this.lastMessage && toContact(this.lastMessage.childNodes[0].innerHTML); + } + + setupMoveWindow() { + let moving = false; + let startX, startY; + const user = this.userWindow; + const parent = user.parentNode; + + on("mousedown", this.terminal, (e) => { + if (e.clientY - this.terminal.getBoundingClientRect().top > 20) return; + moving = true; + startX = user.offsetLeft - e.clientX; + startY = user.offsetTop - e.clientY; + parent.removeChild(user); + parent.appendChild(user); + }); + on("mouseup", this.terminal, () => (moving = false)); + on("mouseleave", this.terminal, () => (moving = false)); + on("mousemove", this.terminal, (e) => { + if (!moving) return; + user.style.left = e.clientX + startX + "px"; + user.style.top = e.clientY + startY + "px"; + }); + } + } + + function toContact(str) { + return str.endsWith(">") ? "@" + str.slice(0, -4) : str; + } + + function setGroup(groupName, users) { + users.forEach((u) => u.setGroup(groupName, users)); + } + + const alice = new User("alice"); + const bob = new User("bob"); + const tom = new User("tom"); + const team = [alice, bob, tom]; + setGroup("team", team); + + async function chatDemo() { + team.forEach((u) => u.reset()); + await alice.sendGroup("please review my PR project/site#72", true); + await tom.sendGroup("anybody got application key 🔑?"); + await bob.sendGroup("looking at it now @alice 👀"); + await alice.sendGroup("thanks @bob!"); + await alice.sendGroup("will DM @tom"); + await alice.send(tom, "w3@o6CewoZx#%$SQETXbWnus", true, true, true); + await tom.send(alice, "you're the savior 🙏!"); + await alice.send(bob, "please check the tests too", true); + await bob.send(alice, "all looks good 👍"); + await alice.send(bob, "thank you!"); + DELAY = 80; + } + + const invitation = + "smp::example.com:5223#1XNE1m2E1m0lm92​WG​Ket9CL6+lO742Vy5​G6nsrkvgs8=::St9hPY+k6nfrbaXj::rsa:MII​BoTANBgkqhkiG9w0B​AQEFAAOCAY4AMIIBiQKCAQEA03XGpEqh3faDN​Gl06pPhaT=="; + + async function establishConnection() { + team.forEach((u) => u.reset()); + await alice.type("/add bob"); + await delay(10); + alice.resetInput(); + // alice.show("/add bob"); + alice.show("sent", "pass this invitation to your contact (via any channel):"); + alice.show("sent", " "); + alice.show("sent", invitation); + alice.show("sent", " "); + alice.show("sent", "and ask them to connect:"); + alice.show("sent", "/c name_for_you invitation_above"); + await delay(20); + await bob.type("/connect alice "); + await bob.type(invitation, true); + await delay(20); + bob.resetInput(); + await bob.show("received", "/connect alice " + invitation); + await delay(10); + bob.show("received", "@alice connected"); + await delay(2); + alice.show("received", "@bob connected"); + await alice.send(bob, "hello bob"); + await bob.send(alice, "hi alice"); + } + + await chatDemo(); + const RUN_DEMO = "#demo .run-demo"; + const RUN_FASTER = "#demo .run-faster"; + const TRY_IT = "#demo .try-it"; + onClick(RUN_DEMO, runChatDemo); + // onClick(RUN_DEMO, establishConnection); + onClick(RUN_FASTER, () => (DELAY /= 2)); + onClick(TRY_IT, tryChatDemo); + + async function runChatDemo() { + show(RUN_DEMO, false); + show(RUN_FASTER); + enable(TRY_IT, false); + await chatDemo(); + show(RUN_DEMO); + show(RUN_FASTER, false); + enable(TRY_IT); + } + + function tryChatDemo() { + team.forEach((u) => u.tryDemo()); + alice.demoInput.focus(); + } + + async function delay(units) { + // delay is random with `1 +/- DISTR` range + const ms = units * DELAY * (1 - DISTR + 2 * DISTR * Math.random()); + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + function highlight(str) { + return str + .replace(/(@[a-z]+)([^0-9]|$)/gi, `$1$2`) + .replace(/([a-z]+>)([^0-9]|$)/gi, `$1$2`) + .replace(/(#[a-z]+)([^0-9]|$)/gi, `$1$2`) + .replace(/#([^\s]+)#([\s]|$)/gi, `#$1#$2`); + } + + function toSecret(secret, message) { + return secret ? `#${message}#` : message; + } + + function isAlpha(c) { + c = c.toUpperCase(); + return c >= "A" && c <= "Z"; + } + + let flipper = setInterval(flipProblem, 10000); + + onClick("#problem .pagination", () => { + clearInterval(flipper); + flipper = setInterval(flipProblem, 20000); + }); + + function flipProblem() { + if (isElementInViewport(document.getElementById("problem"))) { + window.location.hash = + window.location.hash === "#problem-explained" ? "#problem-intro" : "#problem-explained"; + } + } + + function isElementInViewport(el) { + if (!el) return false; + const r = el.getBoundingClientRect(); + return r.bottom >= 0 && r.top <= window.innerHeight; + } + + function onClick(selector, handler, enable = true) { + const el = document.querySelector(selector); + if (el) on("click", el, handler, enable); + } + + function on(event, el, handler, enable = true) { + const method = enable ? "addEventListener" : "removeEventListener"; + el[method](event, handler); + } + + function show(selector, visible = true) { + const el = typeof selector === "string" ? document.querySelector(selector) : selector; + if (el) el.style.display = visible ? "block" : "none"; + } + + function enable(selector, enabled = true) { + const el = document.querySelector(selector); + el.disabled = enabled ? "" : "true"; + } +})(); diff --git a/js/design3.js b/js/design3.js new file mode 100644 index 0000000000..915c37b244 --- /dev/null +++ b/js/design3.js @@ -0,0 +1,299 @@ +const isMobile = { + Android: () => navigator.userAgent.match(/Android/i), + iOS: () => navigator.userAgent.match(/iPhone|iPad|iPod/i), + any: () => navigator.userAgent.match(/Android|iPhone|iPad|iPod/i) +}; + +(function() { +document.addEventListener('DOMContentLoaded', () => { + const googlePlayBtn = document.querySelector('.google-play-btn'); + const appleStoreBtn = document.querySelector('.apple-store-btn'); + const fDroidBtn = document.querySelector('.f-droid-btn'); + const testflightBtn = document.querySelector('.testflight-btn'); + const androidBtn = document.querySelector('.android-btn'); + + if (!googlePlayBtn || !appleStoreBtn || !fDroidBtn || !testflightBtn || !androidBtn) return; + + + if (isMobile.Android()) { + googlePlayBtn.classList.remove('hidden'); + fDroidBtn.classList.remove('hidden'); + androidBtn.classList.remove('hidden'); + } + else if (isMobile.iOS()) { + appleStoreBtn.classList.remove('hidden'); + testflightBtn.classList.remove('hidden'); + } + else { + appleStoreBtn.classList.remove('hidden'); + googlePlayBtn.classList.remove('hidden'); + fDroidBtn.classList.remove('hidden'); + testflightBtn.classList.remove('hidden'); + androidBtn.classList.remove('hidden'); + } + + showPromotedGroups(); +}); + +async function showPromotedGroups() { + welcome(); + const listing = await fetchJSON(simplexDirectoryDataURL + 'promoted.json'); + let [entries, imgPath] = + Array.isArray(listing?.entries) && listing.entries.length > 0 + ? [listing.entries, simplexDirectoryDataURL] + : [fallbackEntries(), '/img/groups/']; + // Uncomment to log fallback entries + // entries.forEach(e => { + // delete e.activeAt; + // delete e.createdAt; + // delete e.entryType; + // delete e.groupLink.connFullLink; + // delete e.shortDescr; + // delete e.welcomeMessage; + // }); + // console.log(entries); + const links = document.querySelectorAll('.group-images a.group-image'); + entries = shuffleEntries(entries, links.length); + + for (let i = 0; i < links.length; i++) { + const link = links[i] + const img = link.querySelector('img'); + const {displayName, imageFile, groupLink} = entries[i % entries.length]; + img.src = imageFile ? imgPath + imageFile : '/img/group.svg'; + img.addEventListener('error', () => img.src = '/img/group.svg'); + link.title = displayName; + const groupLinkUri = groupLink.connShortLink ?? groupLink.connFullLink + try { + link.href = platformSimplexUri(groupLinkUri); + } catch(e) { + console.log(e); + link.href = groupLinkUri; + } + } + + function shuffleEntries(entries, count) { + let a = entries.filter(e => e.displayName != simplexUsersGroup) + shuffle(); + let result = a; + while (result.length < count) { + shuffle(); + result = result.concat(a); + } + return result; + + function shuffle() { + for (let i = a.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [a[i], a[j]] = [a[j], a[i]]; + } + } + } + + async function fetchJSON(url) { + try { + const response = await fetch(url) + if (!response.ok) throw new Error(`HTTP status: ${response.status}`) + return await response.json() + } catch (e) { + console.error(e) + } + } + + function welcome() { + console.log('%c%s', 'font-family: monospace; white-space: pre;', +`Welcome to __ __ + ___ ___ __ __ ___ _ ___\\ \\ / / ___ _ _ _ _____ +/ __|_ _| \\/ | _ \\ | | __ \\ V / / __| || | /_\\_ _| +\\__ \\| || |\\/| | _/ |__| _| / . \\| (__| __ |/ _ \\| | +|___/___|_| |_|_| |____|___/_/ \\_\\\\___|_||_/_/ \\_\\_| + +SimpleX directory: https://simplex.chat/directory +Ask SimpleX team: https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw +GitHub: https://github.com/simplex-chat/simplex-chat +Reddit: https://www.reddit.com/r/SimpleXChat +X/Twitter: https://x.com/SimpleXChat + +Docs +---- +Whitepaper: https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md +Bots API: https://github.com/simplex-chat/simplex-chat/tree/stable/bots +TypeScript library: https://github.com/simplex-chat/simplex-chat/tree/stable/packages/simplex-chat-client/typescript +Terminal CLI: https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md +Hosting SMP servers: https://simplex.chat/docs/server.html + +Downloads +--------- +Apps: https://simplex.chat/downloads +Servers: https://github.com/simplex-chat/simplexmq/releases + +Project +------- +About & Contact us: https://simplex.chat/about +Privacy policy: https://simplex.chat/privacy +Join team: https://simplex.chat/jobs +Donations: https://github.com/simplex-chat/simplex-chat#please-support-us-with-your-donations +` + ); + } + + function fallbackEntries() { + console.log('Error: using hardcoded listing as fallback'); + return [ + { + displayName: "Bitcoin&LightningNetwork", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#-xXBhQRrvRB1ffhxcPpB44Im1_ci4BMIdCHwj8m8IHo" + }, + imageFile: "images/F4hPy5IGO6G9QUH6-nM_-A.jpg" + }, + { + displayName: "Freedom.Tech", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#r5z3uzHp8_pL3ZPyuBCJWmvzQxMnc0Tj3QMLTEnyw6c" + }, + imageFile: "images/HylzOLARvIhUR1wiq0fnJA.png" + }, + { + displayName: "Spirituality", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#OZ8ml_2dj5AutxnNIrHy0CPn1QdnSkQ0oh_84nAv5io" + }, + imageFile: "images/eb2RINRsdEBI0a06ghzqVg.jpg" + }, + { + displayName: "SovereignStack", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#u2D3BdOb3nt9wMR_qoweAINLcEZaU60Xjwfpf74Dq2I" + }, + imageFile: "images/YLLz-47eBnAoIH1PKYJ75g.jpg" + }, + { + displayName: "Monero", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#FlIy4-q4TzZDI9fK2aw3lQTUvnmaoiLCyeKCoP27kGU" + }, + imageFile: "images/TwaN96DcV2OCMfUo6oJ4LQ.png" + }, + { + displayName: "Start9 - Sovereign Computing", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#JArWigpS6OB0gYE2U94pDSzPQyejOdmqe98ohBNoW2Q" + }, + imageFile: "images/478ec86_izoJb95VXKWEhg.jpg" + }, + { + displayName: "Meshtastic", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#Ub1c3ByH5vkhXMMsRdG0fBhSik_qPuEZHcx8AQ2f2Tw" + }, + imageFile: "images/PPTLdveOyb9Wsg3bm6Y_IQ.png" + }, + { + displayName: "GrapheneOS (unofficial)", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#6OTo6kP4ccV4lPOOHekZfOajdxGkxC1_DkAR39_cU4U" + }, + imageFile: "images/zIotMF8Zoe85k956B48N9g.jpg" + }, + { + displayName: "BasicSwap", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#yXMQy5Si6sD5YAdCB4DlUM0kvlKYcUfSiIvOA-RXI_U" + }, + imageFile: "images/AXalaTZ4HsgGtEkaGFbclg.png" + }, + { + displayName: "Linux", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#gqXY-Fxwral34c4bsHlYKZ5QuB6ptVSRMwhWgLKHz54" + }, + imageFile: "images/gqyRO21CwqK3huZ2zbkOqQ.jpg" + }, + { + displayName: "ModernSurvival", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#e4_r2E20FSWl97XGsHyXoPOkW5B6SmjlWQ1ngVW6Umc" + }, + imageFile: "images/5QzoN8PNFD2dkButszPu5g.png" + }, + { + displayName: "Qubes OS", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#COegA1s1ppZG4hRbcpuWwx_QWB4ScouQcIDWwXx64SY" + }, + imageFile: "images/Wsdcf731ufbEOYpHc2rqrg.jpg" + }, + { + displayName: "RoboSats", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#PNRhbupXbsSr5SpkjqP8IjkI6ACPCr2WOxAqSAW4jr0" + }, + imageFile: "images/uZU6Cn1przsjVJ-DBm1-eA.jpg" + }, + { + displayName: "Guardian Project (Unofficial)", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#7zpeTUzhVIwEbZpvo9SUGz1LE35jKfmF_AHYx5YLsxQ" + }, + imageFile: "images/NvmOInofh4RSB2fHdN0zQA.jpg" + }, + { + displayName: "Private Messaging Apps 2", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#aPhAePNB7Nn-W4kUBNBpZELXttysG-yAM8ZiU2XoB10" + }, + imageFile: "images/9aT7qRY_JbSJsW4qDaIHEg.jpg" + }, + { + displayName: "Cake Wallet - Official", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#D46rZgLF1eLDLkOyqYnaifRuZcYjlEMgkujKV2buH6k" + }, + imageFile: "images/YhyznG68PNewCNjoD_ceOg.png" + }, + { + displayName: "CoMaps (EN)", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#mBdIDCJotrN7pimTmXoaAPybC7CmCaaAFxQcwultCvo" + }, + imageFile: "images/BD6FXuHO-eKOnYCAzkRfmA.jpg" + }, + { + displayName: "SimpleX users group", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#hr4lvFeBmndWMKTwqiodPz3VBo_6UmdGWocXd1SupsM" + }, + imageFile: "images/CX-1MPD3r3a7NYBvW7de6g.jpg" + }, + { + displayName: "NBTV Community", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#RX598AUwyQBG6bqa4TOnEnUg7xONdrA-_e0CmNGxEBI" + }, + imageFile: "images/n3VLCEBWhqU9rVtlEAKUhQ.jpg" + }, + { + displayName: "Lossless Audio Community", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#D4P5ENAzT-JoVlFNvRC7geHkkMUuQ9IuhQQC15OFE-o" + }, + imageFile: "images/B3xza7zUzYi3dHiRsg6Afg.jpg" + }, + { + displayName: "RetoSwap – Official SimpleXChat Group", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#-_h6fBWisca6RKhteZtVuXol1a49vFH1Jo-n74fnRK0" + }, + imageFile: "images/ESomaJp7MlFlThqcoj3Ycg.png" + }, + { + displayName: "UW Support 💬", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#6KPZcRjE6KDNQ1VcS1a2wd9LRuJy1zgdvldaE5bhg5c" + }, + imageFile: "images/t1RmI4AhKgelVoWeSBTqUA.jpg" + } + ] + } +} +})(); diff --git a/js/directory.js b/js/directory.js new file mode 100644 index 0000000000..47426ffdac --- /dev/null +++ b/js/directory.js @@ -0,0 +1,513 @@ +(function() { +if (!document.location.pathname.startsWith('/directory')) return; + +let allEntries = []; + +let filteredEntries = []; + +let currentSortMode = ''; + +let currentSearch = ''; + +let currentPage = 1; + +async function initDirectory() { + const listing = await fetchJSON(simplexDirectoryDataURL + 'listing.json') + const liveBtn = document.querySelector('#top-pagination .live'); + const newBtn = document.querySelector('#top-pagination .new'); + const topBtn = document.querySelector('#top-pagination .top'); + const searchInput = document.getElementById('search'); + allEntries = listing.entries + renderEntries('top', bySortPriority, topBtn) + searchInput.addEventListener('input', (e) => renderEntries('top', bySortPriority, topBtn, e.target.value.trim())); + liveBtn.addEventListener('click', () => renderEntries('live', byActiveAtDesc, liveBtn)); + newBtn.addEventListener('click', () => renderEntries('new', byCreatedAtDesc, newBtn)); + topBtn.addEventListener('click', () => renderEntries('top', bySortPriority, topBtn)); + + function renderEntries(mode, comparator, btn, search = '') { + if (currentSortMode === mode && search == currentSearch) return; + currentSortMode = mode; + if (location.hash) location.hash = ''; + liveBtn.classList.remove('active'); + newBtn.classList.remove('active'); + topBtn.classList.remove('active'); + if (search == '') { + currentSearch = ''; + currentPage = 1; + searchInput.value = ''; + btn.classList.add('active'); + } else { + currentSearch = search; + } + filteredEntries = filterEntries(mode, search ?? '').sort(comparator); + renderDirectoryPage(); + } +} + +function renderDirectoryPage() { + const currentEntries = addPagination(filteredEntries); + displayEntries(currentEntries); +} + +function filterEntries(mode, s) { + if (s === '' && mode == 'top') return allEntries.slice(); + const query = s.toLowerCase(); + return allEntries.filter(entry => + ( mode === 'top' + || (mode === 'new' && entry.createdAt) + || (mode === 'live' && entry.activeAt) + ) && + ( query === '' + || (entry.displayName || '').toLowerCase().includes(query) + || includesQuery(entry.shortDescr, query) + || includesQuery(entry.welcomeMessage, query) + ) + ); +} + +function includesQuery(field, query) { + return field + && Array.isArray(field) + && field.some(ft => { + switch (ft.format?.type) { + case 'uri': return uriIncludesQuery(ft.text, query); + case 'hyperLink': return textIncludesQuery(ft.format.showText, query) || uriIncludesQuery(ft.format.linkUri, query); + case 'simplexLink': return textIncludesQuery(ft.format.showText, query); + default: return textIncludesQuery(ft.text, query); + } + }); +} + +function textIncludesQuery(text, query) { + return text ? text.toLowerCase().includes(query) : false +} + +function uriIncludesQuery(uri, query) { + if (!uri) return false; + uri = uri.toLowerCase(); + return !uri.includes('simplex') && uri.includes(query); +} + +async function fetchJSON(url) { + try { + const response = await fetch(url) + if (!response.ok) throw new Error(`HTTP status: ${response.status}`) + return await response.json() + } catch (e) { + console.error(e) + } +} + +function bySortPriority(entry1, entry2) { + return entrySortPriority(entry2) - entrySortPriority(entry1); +} + +function byActiveAtDesc(entry1, entry2) { + return (roundedTs(entry2.activeAt) - roundedTs(entry1.activeAt)) * 10 + + Math.sign(bySortPriority(entry1, entry2)); +} + +function byCreatedAtDesc(entry1, entry2) { + return (roundedTs(entry2.createdAt) - roundedTs(entry1.createdAt)) * 10 + + Math.sign(bySortPriority(entry1, entry2)); +} + +function roundedTs(s) { + try { + return new Date(s).valueOf(); + } catch { + return 0; + } +} + +function entrySortPriority(entry) { + return entry.displayName === simplexUsersGroup + ? Number.MAX_VALUE + : entryMemberCount(entry) +} + +function entryMemberCount(entry) { + return entry.entryType.type == 'group' + ? (entry.entryType.summary?.currentMembers ?? 0) + : 0 +} + +const now = new Date(); +const nowVal = now.valueOf(); +const today = new Date(now); +today.setHours(0, 0, 0, 0); +const todayVal = today.valueOf(); +const todayYear = today.getFullYear(); + +const dateFormatter = Intl?.DateTimeFormat?.(undefined, {month: '2-digit', day: '2-digit'}); +const dateYearFormatter = Intl?.DateTimeFormat?.(undefined, {year: 'numeric', month: '2-digit', day: '2-digit'}); + +function showDate(d) { + return dateFormatter && d.getFullYear() == todayYear + ? dateFormatter.format(d) + : dateYearFormatter?.format(d) ?? d.toLocaleDateString(); +} + +function showCreatedOn(s) { + const d = new Date(s) + d.setHours(0, 0, 0, 0); + return 'Created' + (d.valueOf() === todayVal ? ' today' : ' on ' + showDate(d)); +} + +function showActiveOn(s) { + const d = new Date(s) + const ago = nowVal - d.valueOf(); + if (ago <= 1200000) return 'Active now'; // 20 minutes + if (ago <= 10800000) return 'Active recently'; // 3 hours + d.setHours(0, 0, 0, 0); + return 'Active' + (d.valueOf() === todayVal ? ' today' : ' on ' + showDate(d)); +} + +function displayEntries(entries) { + const directory = document.getElementById('directory'); + directory.innerHTML = ''; + + for (let entry of entries) { + try { + const { entryType, displayName, groupLink, shortDescr, welcomeMessage, imageFile } = entry; + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry w-full flex flex-col items-start md:flex-row rounded-[4px] overflow-hidden shadow-[0px_20px_30px_rgba(0,0,0,0.12)] dark:shadow-none bg-white dark:bg-[#11182F] mb-8'; + + const textContainer = document.createElement('div'); + textContainer.className = 'text-container'; + + const nameElement = document.createElement('h2'); + nameElement.textContent = displayName; + nameElement.className = 'text-grey-black dark:text-white !text-lg md:!text-xl font-bold'; + textContainer.appendChild(nameElement); + + const welcomeMessageHTML = welcomeMessage ? renderMarkdown(welcomeMessage) : undefined; + const shortDescrHTML = shortDescr ? renderMarkdown(shortDescr) : undefined; + if (shortDescrHTML && welcomeMessageHTML?.includes(shortDescrHTML) !== true) { + const descrElement = document.createElement('p'); + descrElement.innerHTML = renderMarkdown(shortDescr); + textContainer.appendChild(descrElement); + } + + if (welcomeMessageHTML) { + const messageElement = document.createElement('p'); + messageElement.innerHTML = welcomeMessageHTML; + textContainer.appendChild(messageElement); + + const readMore = document.createElement('p'); + readMore.textContent = 'Read more'; + readMore.className = 'read-more'; + readMore.style.display = 'none'; + textContainer.appendChild(readMore); + + setTimeout(() => { + const computedStyle = window.getComputedStyle(messageElement); + const lineHeight = parseFloat(computedStyle.lineHeight); + const maxLines = 5; + const maxHeight = maxLines * lineHeight + const maxHeightPx = `${maxHeight}px`; + messageElement.style.maxHeight = maxHeightPx; + messageElement.style.overflow = 'hidden'; + + if (messageElement.scrollHeight > maxHeight + 4) { + readMore.style.display = 'block'; + readMore.addEventListener('click', () => { + if (messageElement.style.maxHeight === maxHeightPx) { + messageElement.style.maxHeight = 'none'; + readMore.className = 'read-less'; + readMore.innerHTML = '▲'; + } else { + messageElement.style.maxHeight = maxHeightPx; + readMore.className = 'read-more'; + readMore.textContent = 'Read more'; + } + }); + } + }, 0); + } + + const entryTimestamp = currentSortMode === 'new' && entry.createdAt + ? showCreatedOn(entry.createdAt) + : entry.activeAt + ? showActiveOn(entry.activeAt) + : ''; + if (entryTimestamp) { + timestampElement = document.createElement('p'); + timestampElement.textContent = entryTimestamp; + timestampElement.className = 'text-sm'; + textContainer.appendChild(timestampElement); + } + + const memberCount = entryMemberCount(entry); + if (typeof memberCount == 'number' && memberCount > 0) { + const memberCountElement = document.createElement('p'); + memberCountElement.textContent = `${memberCount} members`; + memberCountElement.className = 'text-sm'; + textContainer.appendChild(memberCountElement); + } + + const imgLinkElement = document.createElement('a'); + const groupLinkUri = groupLink.connShortLink ?? groupLink.connFullLink + try { + imgLinkElement.href = platformSimplexUri(groupLinkUri); + } catch(e) { + console.log(e); + imgLinkElement.href = groupLinkUri; + } + imgLinkElement.target = "_blank"; + imgLinkElement.title = `Join ${displayName}`; + + const imgElement = document.createElement('img'); + imgElement.src = imageFile ? simplexDirectoryDataURL + imageFile : '/img/group.svg'; + imgElement.alt = displayName; + imgElement.addEventListener('error', () => imgElement.src = '/img/group.svg'); + imgLinkElement.appendChild(imgElement); + entryDiv.appendChild(imgLinkElement); + + entryDiv.appendChild(textContainer); + directory.appendChild(entryDiv); + } catch (e) { + console.log(e); + } + } + + for (let el of document.querySelectorAll('.secret')) { + el.addEventListener('click', () => el.classList.toggle('visible')); + } + + directory.style.height = ''; +} + +function goToPage(p) { + currentPage = p; + renderDirectoryPage(); +} + +function addPagination(entries) { + const entriesPerPage = 10; + const totalPages = Math.ceil(entries.length / entriesPerPage); + if (currentPage < 1) currentPage = 1; + if (currentPage > totalPages) currentPage = totalPages; + + const startIndex = (currentPage - 1) * entriesPerPage; + const endIndex = Math.min(startIndex + entriesPerPage, entries.length); + const currentEntries = entries.slice(startIndex, endIndex); + + // addPaginationElements('top-pagination') + addPaginationElements('bottom-pagination') + return currentEntries; + + function addPaginationElements(paginationId) { + const pagination = document.getElementById(paginationId); + if (!pagination) { + return currentEntries; + } + pagination.innerHTML = ''; + + try { + let startPage, endPage; + const pageButtonCount = 8 + if (totalPages <= pageButtonCount) { + startPage = 1; + endPage = totalPages; + } else { + startPage = Math.max(1, currentPage - 4); + endPage = Math.min(totalPages, startPage + pageButtonCount - 1); + if (endPage - startPage + 1 < pageButtonCount) { + startPage = Math.max(1, endPage - pageButtonCount + 1); + } + } + + // if (currentPage > 1 && startPage > 1) { + // const firstBtn = document.createElement('button'); + // firstBtn.textContent = 'First'; + // firstBtn.classList.add('text-btn'); + // firstBtn.addEventListener('click', () => goToPage(1)); + // pagination.appendChild(firstBtn); + // } + + if (currentPage > 1) { + const prevBtn = document.createElement('button'); + prevBtn.textContent = 'Prev'; + prevBtn.classList.add('text-btn'); + prevBtn.addEventListener('click', () => goToPage(currentPage - 1)); + pagination.appendChild(prevBtn); + } + + for (let p = startPage; p <= endPage; p++) { + const pageBtn = document.createElement('button'); + pageBtn.textContent = p.toString(); + if (p === currentPage) { + pageBtn.classList.add('active'); + } else if (p === currentPage - 1 || p === currentPage + 1 || (currentPage === 1 && p === 3) || (currentPage === totalPages && p === totalPages - 2)) { + pageBtn.classList.add('neighbor'); + } + pageBtn.addEventListener('click', () => goToPage(p)); + pagination.appendChild(pageBtn); + } + + if (currentPage < totalPages) { + const nextBtn = document.createElement('button'); + nextBtn.textContent = 'Next'; + nextBtn.classList.add('text-btn'); + nextBtn.addEventListener('click', () => goToPage(currentPage + 1)); + pagination.appendChild(nextBtn); + } + + // if (endPage < totalPages) { + // const lastBtn = document.createElement('button'); + // lastBtn.textContent = 'Last'; + // lastBtn.classList.add('text-btn'); + // lastBtn.addEventListener('click', () => goToPage(totalPages)); + // pagination.appendChild(lastBtn); + // } + + } catch (e) { + console.log(e); + } + } +} + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initDirectory); +} else { + initDirectory(); +} + +function escapeHtml(text) { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'") + .replace(/\n/g, "
"); +} + +function getSimplexLinkDescr(linkType) { + switch (linkType) { + case 'contact': return 'SimpleX contact address'; + case 'invitation': return 'SimpleX one-time invitation'; + case 'group': return 'SimpleX group link'; + case 'channel': return 'SimpleX channel link'; + case 'relay': return 'SimpleX relay link'; + default: return 'SimpleX link'; + } +} + +function viaHost(smpHosts) { + const first = smpHosts[0] ?? '?'; + return `via ${first}`; +} + +function isCurrentSite(uri) { + return uri.startsWith("https://simplex.chat") || uri.startsWith("https://www.simplex.chat") +} + +function targetBlank(uri) { + return isCurrentSite(uri) ? '' : ' target="_blank"' +} + +function renderMarkdown(fts) { + let html = ''; + for (const ft of fts) { + const { format, text } = ft; + if (!format) { + html += escapeHtml(text); + continue; + } + try { + switch (format.type) { + case 'bold': + html += `${escapeHtml(text)}`; + break; + case 'italic': + html += `${escapeHtml(text)}`; + break; + case 'strikeThrough': + html += `${escapeHtml(text)}`; + break; + case 'snippet': + html += `${escapeHtml(text)}`; + break; + case 'secret': + html += `${escapeHtml(text)}`; + break; + case 'colored': + html += `${escapeHtml(text)}`; + break; + case 'uri': + let href = text.startsWith('http://') || text.startsWith('https://') || text.startsWith('simplex:/') ? text : 'https://' + text; + html += `${escapeHtml(text)}`; + break; + case 'hyperLink': { + const { showText, linkUri } = format; + html += `${escapeHtml(showText ?? linkUri)}`; + break; + } + case 'simplexLink': { + const { showText, linkType, simplexUri, smpHosts } = format; + const linkText = showText ? escapeHtml(showText) : getSimplexLinkDescr(linkType); + html += `${linkText} (${viaHost(smpHosts)})`; + break; + } + case 'command': + html += `${escapeHtml(text)}`; + break; + case 'mention': + html += `${escapeHtml(text)}`; + break; + case 'email': + html += `${escapeHtml(text)}`; + break; + case 'phone': + html += `${escapeHtml(text)}`; + break; + case 'unknown': + html += escapeHtml(text); + break; + default: + html += escapeHtml(text); + } + } catch(e) { + console.log(e); + html += escapeHtml(text); + } + } + return html; +} +})(); + +const simplexDirectoryDataURL = 'https://directory.simplex.chat/data/'; + +// const simplexDirectoryDataURL = 'http://localhost:8080/directory-data/'; + +const simplexUsersGroup = 'SimpleX users group'; + +const simplexAddressRegexp = /^simplex:\/([a-z]+)#(.+)/i; + +const simplexShortLinkTypes = ["a", "c", "g", "i", "r"]; + +function platformSimplexUri(uri) { + if (isMobile.any()) return uri; + const res = uri.match(simplexAddressRegexp); + if (!res || !Array.isArray(res) || res.length < 3) return uri; + const linkType = res[1]; + const fragment = res[2]; + if (simplexShortLinkTypes.includes(linkType)) { + const queryIndex = fragment.indexOf('?'); + if (queryIndex === -1) return uri; + const hashPart = fragment.substring(0, queryIndex); + const queryStr = fragment.substring(queryIndex + 1); + const params = new URLSearchParams(queryStr); + const host = params.get('h'); + if (!host) return uri; + params.delete('h'); + let newFragment = hashPart; + const remainingParams = params.toString(); + if (remainingParams) newFragment += '?' + remainingParams; + return `https://${host}:/${linkType}#${newFragment}`; + } else { + return `https://simplex.chat/${linkType}#${fragment}`; + } +} diff --git a/js/docs.js b/js/docs.js new file mode 100644 index 0000000000..137923482c --- /dev/null +++ b/js/docs.js @@ -0,0 +1,138 @@ +document.addEventListener("DOMContentLoaded", function () { + if (window.location.pathname.endsWith('cli.html')) { + const cliHeader = document.querySelector('h1') + const demoSection = document.createElement('section') + demoSection.id = 'demo' + demoSection.innerHTML = ` +
+
+

@alice

+
+
+
+ +
+
+
+

@bob

+
+
+
+ +
+
+
+

@tom

+
+
+
+ +
+
+ + + +
+ ` + cliHeader.parentNode.insertBefore(demoSection, cliHeader.nextSibling) + + const demoScript = document.createElement('script') + demoScript.src = '/js/demo.js' + document.body.appendChild(demoScript) + + const demoStyles = document.createElement('link') + demoStyles.rel = 'stylesheet' + demoStyles.href = '/css/demo.css' + document.head.appendChild(demoStyles) + } + + const imgs = document.querySelectorAll('p img') + imgs.forEach(img => { + console.log(img.height) + img.style.height = `${img.getAttribute('height')}px` + }) + + const allParagraphs = document.querySelectorAll("p") + allParagraphs.forEach((paragraph) => { + if (paragraph.querySelector("img")) { + paragraph.style.display = "flex" + } + }) + + const docMain = document.querySelector('#doc main') + const menuBtn = document.querySelector('#doc main button.menu') + docMain.addEventListener('click', () => { + docMain.classList.remove("overlay") + document.body.classList.remove('lock-scroll') + }) + + menuBtn.addEventListener('click', (e) => { + docMain.classList.add("overlay") + document.body.classList.add('lock-scroll') + e.stopPropagation() + }) + + const headerWithIds = document.querySelectorAll('h1[id], h2[id]') + const hashList = document.querySelector('.hash-list') + + headerWithIds.forEach(header => { + const id = header.getAttribute('id') + + const listItem = document.createElement('li') + const anchor = document.createElement('a') + anchor.href = `#${id}` + anchor.textContent = header.textContent + listItem.appendChild(anchor) + hashList.appendChild(listItem) + + const hashLink = document.createElement('a') + hashLink.href = `#${id}` + hashLink.textContent = '#' + hashLink.classList.add('hash-link') + header.appendChild(hashLink) + }) + + function scrollToIdWithTopOffset(id, topOffset) { + const element = document.getElementById(id) + if (element) { + const elementRect = element.getBoundingClientRect() + const absoluteElementTop = elementRect.top + window.scrollY + const scrollToPosition = absoluteElementTop - topOffset + window.scrollTo({ top: scrollToPosition, behavior: 'smooth' }) + } + } + + function scrollToHashWithTopOffset() { + const topOffset = window.innerWidth <= 1024 ? 104 : 66 // Adjust the top offset value as needed + const hash = window.location.hash.substring(1) + + if (hash) { + setTimeout(() => { + scrollToIdWithTopOffset(hash, topOffset) + }, 0) + } + } + + document.addEventListener('click', (event) => { + const target = event.target + if (target.tagName.toLowerCase() === 'a' && target.getAttribute('href').startsWith('#')) { + event.preventDefault() + const id = target.getAttribute('href').substring(1) + + const topOffset = window.innerWidth <= 1024 ? 104 : 66 // Adjust the top offset value as needed + history.pushState(null, null, '#' + id) + + scrollToIdWithTopOffset(id, topOffset) + } + }) + + window.addEventListener('load', () => { + scrollToHashWithTopOffset() + }) + + const backToTop = document.getElementById('back-to-top') + backToTop.addEventListener('click', function (event) { + event.preventDefault() + window.scrollTo({ top: 0, behavior: 'smooth' }) + }) +}) \ No newline at end of file diff --git a/js/flag-anchor.js b/js/flag-anchor.js new file mode 100644 index 0000000000..b663439456 --- /dev/null +++ b/js/flag-anchor.js @@ -0,0 +1,9 @@ +document.addEventListener("DOMContentLoaded", () => { + const flagAnchors = document.getElementsByClassName("flag-anchor") + Array.from(flagAnchors).forEach(flagAnchor => { + flagAnchor.addEventListener("click", (e) => { + e.preventDefault() + document.location = flagAnchor.href + location.hash + }) + }) +}) \ No newline at end of file diff --git a/js/index.js b/js/index.js new file mode 100644 index 0000000000..761c53e711 --- /dev/null +++ b/js/index.js @@ -0,0 +1,382 @@ +(async function () { + let DELAY = 0; + const DISTR = 0.33; + + class User { + constructor(name) { + this.userWindow = document.querySelector(`#demo .user.${name}`); + this.terminal = this.userWindow.querySelector(`.terminal`); + this.input = this.terminal.querySelector(".input"); + this.demoInput = this.terminal.querySelector("input"); + this.resetInput(); + this.setupDemo(); + this.group = []; + this.display = this.terminal.querySelector(".display"); + this.setupMoveWindow(); + this.name = name; + } + + reset() { + this.resetInput(); + this.display.innerHTML = ""; + } + + setGroup(groupName, users) { + this.users = users; + this.group = users.filter((u) => u !== this); + this.groupName = groupName; + } + + tryDemo() { + this.reset(); + show(this.demoInput); + this.demoInput.value = ""; + } + + async send(to, message, typeTo, paste, secret) { + await this._sendMsg(`@${to.name}`, message, typeTo, paste, secret); + await to.receive(this, toSecret(secret, message)); + await delay(20); + } + + async sendGroup(message, typeTo, paste) { + await this._sendMsg(`#${this.groupName}`, message, typeTo, paste); + await this.receiveGroup(message); + await delay(10); + } + + async _sendMsg(toStr, message, typeTo, paste, secret) { + await this.type(`${toStr} `, !typeTo); + if (secret) await this.type("#"); + await this.type(message, paste); + if (secret) await this.type("#"); + await delay(10); + this.resetInput(); + this.show("sent", `${toStr} ${toSecret(secret, message)}`); + } + + async type(str, paste) { + if (paste) { + await delay(10); + this.input.insertAdjacentHTML("beforeend", str); + } else { + for (const char of str) { + await delay(isAlpha(char) ? 1 : 2); + this.input.insertAdjacentHTML("beforeend", char); + } + } + await delay(2); + } + + resetInput() { + this.input.innerHTML = "> "; + show(this.demoInput, false); + } + + async receive(from, message, edit, group) { + await delay(10); + let g = group ? `#${this.groupName} ` : ""; + this.show("received", `${g}${from.name}> ${message}`, edit); + } + + async receiveGroup(message, edit) { + await Promise.all(this.group.map((u) => u.receive(this, message, edit, true))); + } + + show(mode, str, edit) { + if (edit && this.lastMessage) { + this.lastMessage.innerHTML = highlight(str); + return; + } + this.display.insertAdjacentHTML("beforeend", `
${highlight(str)}
`); + } + + setupDemo() { + if (!this.demoInput) return; + let editMode = false; + + on("keypress", this.demoInput, async ({ key }) => { + if (key === "Enter") { + const edit = editMode; + editMode = false; + const [to, ...words] = this.demoInput.value.trim().split(" "); + const message = words.join(" "); + switch (to[0]) { + case undefined: + if (message !== "") { + this.show("error", "Message should start with @user or #group"); + } + break; + case "@": + await this.sendInput(to.slice(1), message, edit); + break; + case "#": + await this.sendInputGroup(to.slice(1), message, edit); + break; + default: + this.show("error", "Message should start with @user or #group"); + } + } else if (this.demoInput.value === "" && key !== "@" && key !== "#") { + const channel = this.currentChannel(); + if (channel) this.demoInput.value = channel + " "; + } + }); + on("keydown", this.demoInput, async (e) => { + switch (e.key) { + case "ArrowUp": + if (this.demoInput.value === "" && this.lastMessage) { + const str = (this.demoInput.value = this.lastMessage.innerText); + editMode = true; + await delay(0); + this.demoInput.selectionStart = str.length; + } + break; + case "Tab": { + e.preventDefault(); + const userIndex = this.users.indexOf(this); + const nextIndex = (userIndex + 1) % this.users.length; + this.users[nextIndex].demoInput.focus(); + } + } + }); + } + + async sendInput(name, message, edit) { + if (name === this.name) { + this.show("error", "Can't send message to yourself"); + return; + } + const recipient = this.group.find((u) => u.name === name); + if (recipient === undefined) { + const knownNames = this.group.map((u) => `@${u.name}`).join(", ") + ` or @${this.name}`; + this.show("error", `Unknown recipient @${name} (try ${knownNames})`); + return; + } + this.show("sent", `@${name} ${message}`, edit); + this.demoInput.value = ""; + await recipient.receive(this, message, edit); + } + + async sendInputGroup(name, message, edit) { + if (name !== this.groupName) { + this.show("error", `Unknown group #${name} (try #team)`); + return; + } + this.show("sent", `#${name} ${message}`, edit); + this.demoInput.value = ""; + await this.receiveGroup(message, edit); + } + + get lastMessage() { + const messages = this.display.childNodes; + return messages[messages.length - 1]; + } + + currentChannel() { + return this.lastMessage && toContact(this.lastMessage.childNodes[0].innerHTML); + } + + setupMoveWindow() { + let moving = false; + let startX, startY; + const user = this.userWindow; + const parent = user.parentNode; + + on("mousedown", this.terminal, (e) => { + if (e.clientY - this.terminal.getBoundingClientRect().top > 20) return; + moving = true; + startX = user.offsetLeft - e.clientX; + startY = user.offsetTop - e.clientY; + parent.removeChild(user); + parent.appendChild(user); + }); + on("mouseup", this.terminal, () => (moving = false)); + on("mouseleave", this.terminal, () => (moving = false)); + on("mousemove", this.terminal, (e) => { + if (!moving) return; + user.style.left = e.clientX + startX + "px"; + user.style.top = e.clientY + startY + "px"; + }); + } + } + + function toContact(str) { + return str.endsWith(">") ? "@" + str.slice(0, -4) : str; + } + + function setGroup(groupName, users) { + users.forEach((u) => u.setGroup(groupName, users)); + } + + const alice = new User("alice"); + const bob = new User("bob"); + const tom = new User("tom"); + const team = [alice, bob, tom]; + setGroup("team", team); + + async function chatDemo() { + team.forEach((u) => u.reset()); + await alice.sendGroup("please review my PR project/site#72", true); + await tom.sendGroup("anybody got application key 🔑?"); + await bob.sendGroup("looking at it now @alice 👀"); + await alice.sendGroup("thanks @bob!"); + await alice.sendGroup("will DM @tom"); + await alice.send(tom, "w3@o6CewoZx#%$SQETXbWnus", true, true, true); + await tom.send(alice, "you're the savior 🙏!"); + await alice.send(bob, "please check the tests too", true); + await bob.send(alice, "all looks good 👍"); + await alice.send(bob, "thank you!"); + DELAY = 80; + } + + const invitation = + "smp::example.com:5223#1XNE1m2E1m0lm92​WG​Ket9CL6+lO742Vy5​G6nsrkvgs8=::St9hPY+k6nfrbaXj::rsa:MII​BoTANBgkqhkiG9w0B​AQEFAAOCAY4AMIIBiQKCAQEA03XGpEqh3faDN​Gl06pPhaT=="; + + async function establishConnection() { + team.forEach((u) => u.reset()); + await alice.type("/add bob"); + await delay(10); + alice.resetInput(); + // alice.show("/add bob"); + alice.show("sent", "pass this invitation to your contact (via any channel):"); + alice.show("sent", " "); + alice.show("sent", invitation); + alice.show("sent", " "); + alice.show("sent", "and ask them to connect:"); + alice.show("sent", "/c name_for_you invitation_above"); + await delay(20); + await bob.type("/connect alice "); + await bob.type(invitation, true); + await delay(20); + bob.resetInput(); + await bob.show("received", "/connect alice " + invitation); + await delay(10); + bob.show("received", "@alice connected"); + await delay(2); + alice.show("received", "@bob connected"); + await alice.send(bob, "hello bob"); + await bob.send(alice, "hi alice"); + } + + await chatDemo(); + const RUN_DEMO = "#demo .run-demo"; + const RUN_FASTER = "#demo .run-faster"; + const TRY_IT = "#demo .try-it"; + onClick(RUN_DEMO, runChatDemo); + // onClick(RUN_DEMO, establishConnection); + onClick(RUN_FASTER, () => (DELAY /= 2)); + onClick(TRY_IT, tryChatDemo); + + async function runChatDemo() { + document.querySelectorAll('.all-users div.user').forEach(e => e.classList.remove('d-none')); + document.querySelector('.all-users div.simplex_mobile').classList.add('d-none'); + show(RUN_DEMO, false); + show(RUN_FASTER); + enable(TRY_IT, false); + await chatDemo(); + show(RUN_DEMO); + show(RUN_FASTER, false); + enable(TRY_IT); + } + + function tryChatDemo() { + document.querySelectorAll('.all-users div.user').forEach(e => e.classList.remove('d-none')); + document.querySelector('.all-users div.simplex_mobile').classList.add('d-none'); + team.forEach((u) => u.tryDemo()); + alice.demoInput.focus(); + } + + async function delay(units) { + // delay is random with `1 +/- DISTR` range + const ms = units * DELAY * (1 - DISTR + 2 * DISTR * Math.random()); + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + function highlight(str) { + return str + .replace(/(@[a-z]+)([^0-9]|$)/gi, `$1$2`) + .replace(/([a-z]+>)([^0-9]|$)/gi, `$1$2`) + .replace(/(#[a-z]+)([^0-9]|$)/gi, `$1$2`) + .replace(/#([^\s]+)#([\s]|$)/gi, `#$1#$2`); + } + + function toSecret(secret, message) { + return secret ? `#${message}#` : message; + } + + function isAlpha(c) { + c = c.toUpperCase(); + return c >= "A" && c <= "Z"; + } + + let flipper = setInterval(flipProblem, 10000); + + onClick("#problem .pagination", () => { + clearInterval(flipper); + flipper = setInterval(flipProblem, 20000); + }); + + function flipProblem() { + if (isElementInViewport(document.getElementById("problem"))) { + window.location.hash = + window.location.hash === "#problem-explained" ? "#problem-intro" : "#problem-explained"; + } + } + + function isElementInViewport(el) { + const r = el.getBoundingClientRect(); + return r.bottom >= 0 && r.top <= window.innerHeight; + } + + function onClick(selector, handler, enable = true) { + const el = document.querySelector(selector); + if (el) on("click", el, handler, enable); + } + + function on(event, el, handler, enable = true) { + const method = enable ? "addEventListener" : "removeEventListener"; + el[method](event, handler); + } + + function show(selector, visible = true) { + const el = typeof selector === "string" ? document.querySelector(selector) : selector; + if (el) el.style.display = visible ? "block" : "none"; + } + + function enable(selector, enabled = true) { + const el = document.querySelector(selector); + el.disabled = enabled ? "" : "true"; + } + + const copyEls = document.querySelectorAll(".content_copy_with_tooltip"); + if (navigator.clipboard) { + copyEls.forEach(contentCopyWithTooltip) + } else { + copyEls.forEach(el => el.style.visibility = "hidden") + } + + function contentCopyWithTooltip(parent) { + const content = parent.querySelector(".content"); + const tooltip = parent.querySelector(".tooltiptext"); + const copyButton = parent.querySelector(".content_copy"); + copyButton.addEventListener("click", copyAddress) + copyButton.addEventListener("mouseout", resetTooltip) + + function copyAddress() { + navigator.clipboard.writeText(content.innerText || content.value); + tooltip.innerHTML = "Copied!"; + } + + function resetTooltip() { + tooltip.innerHTML = "Copy to clipboard"; + } + } + + // Setting width for scrollable sections + const element = document.querySelector('.container'); + const computedStyle = getComputedStyle(element); + const screenWidth = element.clientWidth - (parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight)); + document.querySelector('.table-holder').style.width = `${screenWidth}px`; + Array.from(document.querySelectorAll('.problem-section')).forEach(ele => ele.style.width = `${screenWidth}px`); + +})(); diff --git a/js/lottie.min.js b/js/lottie.min.js new file mode 100644 index 0000000000..db3599b9c9 --- /dev/null +++ b/js/lottie.min.js @@ -0,0 +1 @@ +"undefined"!=typeof navigator&&function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lottie=e()}(this,(function(){"use strict";var svgNS="http://www.w3.org/2000/svg",locationHref="",_useWebWorker=!1,initialDefaultFrame=-999999,setWebWorker=function(t){_useWebWorker=!!t},getWebWorker=function(){return _useWebWorker},setLocationHref=function(t){locationHref=t},getLocationHref=function(){return locationHref};function createTag(t){return document.createElement(t)}function extendPrototype(t,e){var i,r,s=t.length;for(i=0;i1?i[1]=1:i[1]<=0&&(i[1]=0),HSVtoRGB(i[0],i[1],i[2])}function addBrightnessToRGB(t,e){var i=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return i[2]+=e,i[2]>1?i[2]=1:i[2]<0&&(i[2]=0),HSVtoRGB(i[0],i[1],i[2])}function addHueToRGB(t,e){var i=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return i[0]+=e/360,i[0]>1?i[0]-=1:i[0]<0&&(i[0]+=1),HSVtoRGB(i[0],i[1],i[2])}var rgbToHex=function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1===e.length?"0"+e:e;return function(t,e,r){return t<0&&(t=0),e<0&&(e=0),r<0&&(r=0),"#"+i[t]+i[e]+i[r]}}(),setSubframeEnabled=function(t){subframeEnabled=!!t},getSubframeEnabled=function(){return subframeEnabled},setExpressionsPlugin=function(t){expressionsPlugin=t},getExpressionsPlugin=function(){return expressionsPlugin},setExpressionInterfaces=function(t){expressionsInterfaces=t},getExpressionInterfaces=function(){return expressionsInterfaces},setDefaultCurveSegments=function(t){defaultCurveSegments=t},getDefaultCurveSegments=function(){return defaultCurveSegments},setIdPrefix=function(t){idPrefix$1=t},getIdPrefix=function(){return idPrefix$1};function createNS(t){return document.createElementNS(svgNS,t)}function _typeof$5(t){return _typeof$5="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof$5(t)}var dataManager=function(){var t,e,i=1,r=[],s={onmessage:function(){},postMessage:function(e){t({data:e})}},a={postMessage:function(t){s.onmessage({data:t})}};function n(){e||(e=function(e){if(window.Worker&&window.Blob&&getWebWorker()){var i=new Blob(["var _workerSelf = self; self.onmessage = ",e.toString()],{type:"text/javascript"}),r=URL.createObjectURL(i);return new Worker(r)}return t=e,s}((function(t){if(a.dataManager||(a.dataManager=function(){function t(s,a){var n,o,h,l,p,m,c=s.length;for(o=0;o=0;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)r(t[e].ks.k);else for(a=t[e].ks.k.length,s=0;si[0]||!(i[0]>t[0])&&(t[1]>i[1]||!(i[1]>t[1])&&(t[2]>i[2]||!(i[2]>t[2])&&null))}var a,n=function(){var t=[4,4,14];function e(t){var e,i,r,s=t.length;for(e=0;e=0;i-=1)if("sh"===t[i].ty)if(t[i].ks.k.i)t[i].ks.k.c=t[i].closed;else for(s=t[i].ks.k.length,r=0;r500)&&(this._imageLoaded(),clearInterval(i)),e+=1}.bind(this),50)}function a(t){var e={assetData:t},i=r(t,this.assetsPath,this.path);return dataManager.loadData(i,function(t){e.img=t,this._footageLoaded()}.bind(this),function(){e.img={},this._footageLoaded()}.bind(this)),e}function n(){this._imageLoaded=e.bind(this),this._footageLoaded=i.bind(this),this.testImageLoaded=s.bind(this),this.createFootageData=a.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.totalFootages=0,this.loadedAssets=0,this.loadedFootagesCount=0,this.imagesLoadedCb=null,this.images=[]}return n.prototype={loadAssets:function(t,e){var i;this.imagesLoadedCb=e;var r=t.length;for(i=0;ithis.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,i,r=this.animationData.layers,s=r.length,a=t.layers,n=a.length;for(i=0;ithis.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame(),this.trigger("drawnFrame")},AnimationItem.prototype.renderFrame=function(){if(!1!==this.isLoaded&&this.renderer)try{this.expressionsPlugin&&this.expressionsPlugin.resetFrame(),this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},AnimationItem.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.trigger("_play"),this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this.trigger("_pause"),this._idle=!0,this.trigger("_idle"),this.audioController.pause())},AnimationItem.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},AnimationItem.prototype.getMarkerData=function(t){for(var e,i=0;i=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(i=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(i=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),i&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},AnimationItem.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var i=-1;this.isPaused&&(this.currentRawFrame+this.firstFramee&&(i=e-t)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==i&&this.goToAndStop(i,!0)},AnimationItem.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"===_typeof$4(t[0])){var i,r=t.length;for(i=0;i=0;i-=1)e[i].animation.destroy(t)},t.freeze=function(){n=!0},t.unfreeze=function(){n=!1,d()},t.setVolume=function(t,i){var s;for(s=0;s=.001?function(t,e,i,r){for(var s=0;s<4;++s){var a=h(e,i,r);if(0===a)return e;e-=(o(e,i,r)-t)/a}return e}(t,l,e,r):0===p?l:function(t,e,i,r,s){var a,n,h=0;do{(a=o(n=e+(i-e)/2,r,s)-t)>0?i=n:e=n}while(Math.abs(a)>1e-7&&++h<10);return n}(t,a,a+i,e,r)}},t}(),pooling={double:function(t){return t.concat(createSizedArray(t.length))}},poolFactory=function(t,e,i){var r=0,s=t,a=createSizedArray(s);return{newElement:function(){return r?a[r-=1]:e()},release:function(t){r===s&&(a=pooling.double(a),s*=2),i&&i(t),a[r]=t,r+=1}}},bezierLengthPool=poolFactory(8,(function(){return{addedLength:0,percents:createTypedArray("float32",getDefaultCurveSegments()),lengths:createTypedArray("float32",getDefaultCurveSegments())}})),segmentsLengthPool=poolFactory(8,(function(){return{lengths:[],totalLength:0}}),(function(t){var e,i=t.lengths.length;for(e=0;e-.001&&n<.001}var i=function(t,e,i,r){var s,a,n,o,h,l,p=getDefaultCurveSegments(),f=0,m=[],c=[],d=bezierLengthPool.newElement();for(n=i.length,s=0;sn?-1:1,l=!0;l;)if(r[a]<=n&&r[a+1]>n?(o=(n-r[a])/(r[a+1]-r[a]),l=!1):a+=h,a<0||a>=s-1){if(a===s-1)return i[a];l=!1}return i[a]+(i[a+1]-i[a])*o}var h=createTypedArray("float32",8);return{getSegmentsLength:function(t){var e,r=segmentsLengthPool.newElement(),s=t.c,a=t.v,n=t.o,o=t.i,h=t._length,l=r.lengths,p=0;for(e=0;e1&&(a=1);var p,f=o(a,l),m=o(n=n>1?1:n,l),c=e.length,d=1-f,u=1-m,y=d*d*d,g=f*d*d*3,v=f*f*d*3,b=f*f*f,x=d*d*u,P=f*d*u+d*f*u+d*d*m,E=f*f*u+d*f*m+f*d*m,S=f*f*m,C=d*u*u,_=f*u*u+d*m*u+d*u*m,A=f*m*u+d*m*m+f*u*m,T=f*m*m,M=u*u*u,k=m*u*u+u*m*u+u*u*m,D=m*m*u+u*m*m+m*u*m,F=m*m*m;for(p=0;pc?m>d?m-c-d:d-c-m:d>c?d-c-m:c-m-d)>-1e-4&&f<1e-4}}}var bez=bezFunction(),initFrame=initialDefaultFrame,mathAbs=Math.abs;function interpolateValue(t,e){var i,r=this.offsetTime;"multidimensional"===this.propType&&(i=createTypedArray("float32",this.pv.length));for(var s,a,n,o,h,l,p,f,m,c=e.lastIndex,d=c,u=this.keyframes.length-1,y=!0;y;){if(s=this.keyframes[d],a=this.keyframes[d+1],d===u-1&&t>=a.t-r){s.h&&(s=a),c=0;break}if(a.t-r>t){c=d;break}d=v||t=v?x.points.length-1:0;for(h=x.points[P].point.length,o=0;o=C&&S=v)i[0]=g[0],i[1]=g[1],i[2]=g[2];else if(t<=b)i[0]=s.s[0],i[1]=s.s[1],i[2]=s.s[2];else{quaternionToEuler(i,slerp(createQuaternion(s.s),createQuaternion(g),(t-b)/(v-b)))}else for(d=0;d=v?l=1:t1e-6?(r=Math.acos(s),a=Math.sin(r),n=Math.sin((1-i)*r)/a,o=Math.sin(i*r)/a):(n=1-i,o=i),h[0]=n*l+o*c,h[1]=n*p+o*d,h[2]=n*f+o*u,h[3]=n*m+o*y,h}function quaternionToEuler(t,e){var i=e[0],r=e[1],s=e[2],a=e[3],n=Math.atan2(2*r*a-2*i*s,1-2*r*r-2*s*s),o=Math.asin(2*i*r+2*s*a),h=Math.atan2(2*i*a-2*r*s,1-2*i*i-2*s*s);t[0]=n/degToRads,t[1]=o/degToRads,t[2]=h/degToRads}function createQuaternion(t){var e=t[0]*degToRads,i=t[1]*degToRads,r=t[2]*degToRads,s=Math.cos(e/2),a=Math.cos(i/2),n=Math.cos(r/2),o=Math.sin(e/2),h=Math.sin(i/2),l=Math.sin(r/2);return[o*h*n+s*a*l,o*a*n+s*h*l,s*h*n-o*a*l,s*a*n-o*h*l]}function getValueAtCurrentTime(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,i=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==initFrame&&(this._caching.lastFrame>=i&&t>=i||this._caching.lastFrame=t&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var r=this.interpolateValue(t,this._caching);this.pv=r}return this._caching.lastFrame=t,this.pv}function setVValue(t){var e;if("unidimensional"===this.propType)e=t*this.mult,mathAbs(this.v-e)>1e-5&&(this.v=e,this._mdf=!0);else for(var i=0,r=this.v.length;i1e-5&&(this.v[i]=e,this._mdf=!0),i+=1}function processEffectsSequence(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,i=this.kf?this.pv:this.data.k;for(t=0;t=this._maxLength&&this.doubleArrayLength(),i){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o;break;default:a=[]}(!a[r]||a[r]&&!s)&&(a[r]=pointPool.newElement()),a[r][0]=t,a[r][1]=e},ShapePath.prototype.setTripleAt=function(t,e,i,r,s,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(i,r,"o",n,o),this.setXYAt(s,a,"i",n,o)},ShapePath.prototype.reverse=function(){var t=new ShapePath;t.setPathData(this.c,this._length);var e=this.v,i=this.o,r=this.i,s=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],r[0][0],r[0][1],i[0][0],i[0][1],0,!1),s=1);var a,n=this._length-1,o=this._length;for(a=s;a=c[c.length-1].t-this.offsetTime)r=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var d,u,y,g=m,v=c.length-1,b=!0;b&&(d=c[g],!((u=c[g+1]).t-this.offsetTime>t));)g=u.t-this.offsetTime)p=1;else if(tr&&e>r)||(this._caching.lastIndex=s0||t>-1e-6&&t<0?r(1e4*t)/1e4:t}function I(){var t=this.props;return"matrix("+w(t[0])+","+w(t[1])+","+w(t[4])+","+w(t[5])+","+w(t[12])+","+w(t[13])+")"}return function(){this.reset=s,this.rotate=a,this.rotateX=n,this.rotateY=o,this.rotateZ=h,this.skew=p,this.skewFromAxis=f,this.shear=l,this.scale=m,this.setTransform=c,this.translate=d,this.transform=u,this.multiply=y,this.applyToPoint=P,this.applyToX=E,this.applyToY=S,this.applyToZ=C,this.applyToPointArray=k,this.applyToTriplePoints=M,this.applyToPointStringified=D,this.toCSS=F,this.to2dCSS=I,this.clone=b,this.cloneFromProps=x,this.equals=v,this.inversePoints=T,this.inversePoint=A,this.getInverseMatrix=_,this._t=this.transform,this.isIdentity=g,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();function _typeof$3(t){return _typeof$3="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof$3(t)}var lottie={},standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";function setLocation(t){setLocationHref(t)}function searchAnimations(){!0===standalone?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function setSubframeRendering(t){setSubframeEnabled(t)}function setPrefix(t){setIdPrefix(t)}function loadAnimation(t){return!0===standalone&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":setDefaultCurveSegments(200);break;default:case"medium":setDefaultCurveSegments(50);break;case"low":setDefaultCurveSegments(10)}else!isNaN(t)&&t>1&&setDefaultCurveSegments(t);getDefaultCurveSegments()>=50?roundValues(!1):roundValues(!0)}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&setExpressionsPlugin(e)}function getFactory(t){switch(t){case"propertyFactory":return PropertyFactory;case"shapePropertyFactory":return ShapePropertyFactory;case"matrix":return Matrix;default:return null}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),i=0;i=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;nr+i))p=o.s*s<=r?0:(o.s*s-r)/i,f=o.e*s>=r+i?1:(o.e*s-r)/i,h.push([p,f])}return h.length||h.push([0,0]),h},TrimModifier.prototype.releasePathsData=function(t){var e,i=t.length;for(e=0;e1?1+a:this.s.v<0?0+a:this.s.v+a)>(i=this.e.v>1?1+a:this.e.v<0?0+a:this.e.v+a)){var n=e;e=i,i=n}e=1e-4*Math.round(1e4*e),i=1e-4*Math.round(1e4*i),this.sValue=e,this.eValue=i}else e=this.sValue,i=this.eValue;var o,h,l,p,f,m=this.shapes.length,c=0;if(i===e)for(s=0;s=0;s-=1)if((d=this.shapes[s]).shape._mdf){for((u=d.localShapeCollection).releaseShapes(),2===this.m&&m>1?(g=this.calculateShapeEdges(e,i,d.totalShapeLength,x,c),x+=d.totalShapeLength):g=[[v,b]],h=g.length,o=0;o=1?y.push({s:d.totalShapeLength*(v-1),e:d.totalShapeLength*(b-1)}):(y.push({s:d.totalShapeLength*v,e:d.totalShapeLength}),y.push({s:0,e:d.totalShapeLength*(b-1)}));var P=this.addShapes(d,y[0]);if(y[0].s!==y[0].e){if(y.length>1)if(d.shape.paths.shapes[d.shape.paths._length-1].c){var E=P.pop();this.addPaths(P,u),P=this.addShapes(d,y[1],E)}else this.addPaths(P,u),P=this.addShapes(d,y[1]);this.addPaths(P,u)}}d.shape.paths=u}}},TrimModifier.prototype.addPaths=function(t,e){var i,r=t.length;for(i=0;ie.e){i.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(m[r].v[s-1],m[r].o[s-1],m[r].i[s],m[r].v[s],i,o,y),y=!1):(l=bez.getNewSegment(m[r].v[s-1],m[r].v[s],m[r].o[s-1],m[r].i[s],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[s-1]),this.addSegmentFromArray(l,i,o,y),y=!1,i.c=!1),d+=n.addedLength,o+=1}if(m[r].c&&h.length){if(n=h[s-1],d<=e.e){var g=h[s-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(m[r].v[s-1],m[r].o[s-1],m[r].i[0],m[r].v[0],i,o,y),y=!1):(l=bez.getNewSegment(m[r].v[s-1],m[r].v[0],m[r].o[s-1],m[r].i[0],(e.s-d)/g,(e.e-d)/g,h[s-1]),this.addSegmentFromArray(l,i,o,y),y=!1,i.c=!1)}else i.c=!1;d+=n.addedLength,o+=1}if(i._length&&(i.setXYAt(i.v[p][0],i.v[p][1],"i",p),i.setXYAt(i.v[i._length-1][0],i.v[i._length-1][1],"o",i._length-1)),d>e.e)break;r=this.p.keyframes[this.p.keyframes.length-1].t?(r=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),s=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/i,0)):(r=this.p.pv,s=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){r=[],s=[];var a=this.px,n=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(r[0]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),r[1]=n.getValueAtTime((n.keyframes[0].t+.01)/i,0),s[0]=a.getValueAtTime(a.keyframes[0].t/i,0),s[1]=n.getValueAtTime(n.keyframes[0].t/i,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(r[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),r[1]=n.getValueAtTime(n.keyframes[n.keyframes.length-1].t/i,0),s[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0),s[1]=n.getValueAtTime((n.keyframes[n.keyframes.length-1].t-.01)/i,0)):(r=[a.pv,n.pv],s[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime),s[1]=n.getValueAtTime((n._caching.lastFrame+n.offsetTime-.01)/i,n.offsetTime))}else r=s=t;this.v.rotate(-Math.atan2(r[1]-s[1],r[0]-s[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(this.appliedTransformations=0,this.pre.reset(),!this.a.effectsSequence.length&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},extendPrototype([DynamicPropertyContainer],e),e.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},e.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty,{getTransformProperty:function(t,i,r){return new e(t,i,r)}}}();function RepeaterModifier(){}function RoundCornersModifier(){}function floatEqual(t,e){return 1e5*Math.abs(t-e)<=Math.min(Math.abs(t),Math.abs(e))}function floatZero(t){return Math.abs(t)<=1e-5}function lerp(t,e,i){return t*(1-i)+e*i}function lerpPoint(t,e,i){return[lerp(t[0],e[0],i),lerp(t[1],e[1],i)]}function quadRoots(t,e,i){if(0===t)return[];var r=e*e-4*t*i;if(r<0)return[];var s=-e/(2*t);if(0===r)return[s];var a=Math.sqrt(r)/(2*t);return[s-a,s+a]}function polynomialCoefficients(t,e,i,r){return[3*e-t-3*i+r,3*t-6*e+3*i,-3*t+3*e,t]}function singlePoint(t){return new PolynomialBezier(t,t,t,t,!1)}function PolynomialBezier(t,e,i,r,s){s&&pointEqual(t,e)&&(e=lerpPoint(t,r,1/3)),s&&pointEqual(i,r)&&(i=lerpPoint(t,r,2/3));var a=polynomialCoefficients(t[0],e[0],i[0],r[0]),n=polynomialCoefficients(t[1],e[1],i[1],r[1]);this.a=[a[0],n[0]],this.b=[a[1],n[1]],this.c=[a[2],n[2]],this.d=[a[3],n[3]],this.points=[t,e,i,r]}function extrema(t,e){var i=t.points[0][e],r=t.points[t.points.length-1][e];if(i>r){var s=r;r=i,i=s}for(var a=quadRoots(3*t.a[e],2*t.b[e],t.c[e]),n=0;n0&&a[n]<1){var o=t.point(a[n])[e];or&&(r=o)}return{min:i,max:r}}function intersectData(t,e,i){var r=t.boundingBox();return{cx:r.cx,cy:r.cy,width:r.width,height:r.height,bez:t,t:(e+i)/2,t1:e,t2:i}}function splitData(t){var e=t.bez.split(.5);return[intersectData(e[0],t.t1,t.t),intersectData(e[1],t.t,t.t2)]}function boxIntersect(t,e){return 2*Math.abs(t.cx-e.cx)=a||t.width<=r&&t.height<=r&&e.width<=r&&e.height<=r)s.push([t.t,e.t]);else{var n=splitData(t),o=splitData(e);intersectsImpl(n[0],o[0],i+1,r,s,a),intersectsImpl(n[0],o[1],i+1,r,s,a),intersectsImpl(n[1],o[0],i+1,r,s,a),intersectsImpl(n[1],o[1],i+1,r,s,a)}}function crossProduct(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function lineIntersection(t,e,i,r){var s=[t[0],t[1],1],a=[e[0],e[1],1],n=[i[0],i[1],1],o=[r[0],r[1],1],h=crossProduct(crossProduct(s,a),crossProduct(n,o));return floatZero(h[2])?null:[h[0]/h[2],h[1]/h[2]]}function polarOffset(t,e,i){return[t[0]+Math.cos(e)*i,t[1]-Math.sin(e)*i]}function pointDistance(t,e){return Math.hypot(t[0]-e[0],t[1]-e[1])}function pointEqual(t,e){return floatEqual(t[0],e[0])&&floatEqual(t[1],e[1])}function ZigZagModifier(){}function setPoint(t,e,i,r,s,a,n){var o=i-Math.PI/2,h=i+Math.PI/2,l=e[0]+Math.cos(i)*r*s,p=e[1]-Math.sin(i)*r*s;t.setTripleAt(l,p,l+Math.cos(o)*a,p-Math.sin(o)*a,l+Math.cos(h)*n,p-Math.sin(h)*n,t.length())}function getPerpendicularVector(t,e){var i=[e[0]-t[0],e[1]-t[1]],r=.5*-Math.PI;return[Math.cos(r)*i[0]-Math.sin(r)*i[1],Math.sin(r)*i[0]+Math.cos(r)*i[1]]}function getProjectingAngle(t,e){var i=0===e?t.length()-1:e-1,r=(e+1)%t.length(),s=getPerpendicularVector(t.v[i],t.v[r]);return Math.atan2(0,1)-Math.atan2(s[1],s[0])}function zigZagCorner(t,e,i,r,s,a,n){var o=getProjectingAngle(e,i),h=e.v[i%e._length],l=e.v[0===i?e._length-1:i-1],p=e.v[(i+1)%e._length],f=2===a?Math.sqrt(Math.pow(h[0]-l[0],2)+Math.pow(h[1]-l[1],2)):0,m=2===a?Math.sqrt(Math.pow(h[0]-p[0],2)+Math.pow(h[1]-p[1],2)):0;setPoint(t,e.v[i%e._length],o,n,r,m/(2*(s+1)),f/(2*(s+1)),a)}function zigZagSegment(t,e,i,r,s,a){for(var n=0;n1&&e.length>1&&(s=getIntersection(t[0],e[e.length-1]))?[[t[0].split(s[0])[0]],[e[e.length-1].split(s[1])[1]]]:[i,r]}function pruneIntersections(t){for(var e,i=1;i1&&(e=pruneSegmentIntersection(t[t.length-1],t[0]),t[t.length-1]=e[0],t[0]=e[1]),t}function offsetSegmentSplit(t,e){var i,r,s,a,n=t.inflectionPoints();if(0===n.length)return[offsetSegment(t,e)];if(1===n.length||floatEqual(n[1],1))return i=(s=t.split(n[0]))[0],r=s[1],[offsetSegment(i,e),offsetSegment(r,e)];i=(s=t.split(n[0]))[0];var o=(n[1]-n[0])/(1-n[0]);return a=(s=s[1].split(o))[0],r=s[1],[offsetSegment(i,e),offsetSegment(a,e),offsetSegment(r,e)]}function OffsetPathModifier(){}function getFontProperties(t){for(var e=t.fStyle?t.fStyle.split(" "):[],i="normal",r="normal",s=e.length,a=0;a0;)i-=1,this._elements.unshift(e[i]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(t){var e,i=t.length;for(e=0;e0?Math.floor(m):Math.ceil(m),u=this.pMatrix.props,y=this.rMatrix.props,g=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var v,b,x=0;if(m>0){for(;xd;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),x-=1;c&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-c,!0),x-=c)}for(r=1===this.data.m?0:this._currentCopies-1,s=1===this.data.m?1:-1,a=this._currentCopies;a;){if(b=(i=(e=this.elemsData[r].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(r/(this._currentCopies-1)),0!==x){for((0!==r&&1===s||r!==this._currentCopies-1&&-1===s)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]),this.matrix.transform(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15]),v=0;v0&&r<1?[e]:[]:[e-r,e+r].filter((function(t){return t>0&&t<1}))},PolynomialBezier.prototype.split=function(t){if(t<=0)return[singlePoint(this.points[0]),this];if(t>=1)return[this,singlePoint(this.points[this.points.length-1])];var e=lerpPoint(this.points[0],this.points[1],t),i=lerpPoint(this.points[1],this.points[2],t),r=lerpPoint(this.points[2],this.points[3],t),s=lerpPoint(e,i,t),a=lerpPoint(i,r,t),n=lerpPoint(s,a,t);return[new PolynomialBezier(this.points[0],e,s,n,!0),new PolynomialBezier(n,a,r,this.points[3],!0)]},PolynomialBezier.prototype.bounds=function(){return{x:extrema(this,0),y:extrema(this,1)}},PolynomialBezier.prototype.boundingBox=function(){var t=this.bounds();return{left:t.x.min,right:t.x.max,top:t.y.min,bottom:t.y.max,width:t.x.max-t.x.min,height:t.y.max-t.y.min,cx:(t.x.max+t.x.min)/2,cy:(t.y.max+t.y.min)/2}},PolynomialBezier.prototype.intersections=function(t,e,i){void 0===e&&(e=2),void 0===i&&(i=7);var r=[];return intersectsImpl(intersectData(this,0,1),intersectData(t,0,1),0,e,r,i),r},PolynomialBezier.shapeSegment=function(t,e){var i=(e+1)%t.length();return new PolynomialBezier(t.v[e],t.o[e],t.i[i],t.v[i],!0)},PolynomialBezier.shapeSegmentInverted=function(t,e){var i=(e+1)%t.length();return new PolynomialBezier(t.v[i],t.i[i],t.o[e],t.v[e],!0)},extendPrototype([ShapeModifier],ZigZagModifier),ZigZagModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amplitude=PropertyFactory.getProp(t,e.s,0,null,this),this.frequency=PropertyFactory.getProp(t,e.r,0,null,this),this.pointsType=PropertyFactory.getProp(t,e.pt,0,null,this),this._isAnimated=0!==this.amplitude.effectsSequence.length||0!==this.frequency.effectsSequence.length||0!==this.pointsType.effectsSequence.length},ZigZagModifier.prototype.processPath=function(t,e,i,r){var s=t._length,a=shapePool.newElement();if(a.c=t.c,t.c||(s-=1),0===s)return a;var n=-1,o=PolynomialBezier.shapeSegment(t,0);zigZagCorner(a,t,0,e,i,r,n);for(var h=0;h=0;a-=1)o=PolynomialBezier.shapeSegmentInverted(t,a),l.push(offsetSegmentSplit(o,e));l=pruneIntersections(l);var p=null,f=null;for(a=0;a=55296&&i<=56319){var r=t.charCodeAt(1);r>=56320&&r<=57343&&(e=1024*(i-55296)+r-56320+65536)}return e}function o(t){var e=n(t);return e>=127462&&e<=127487}var h=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};h.isModifier=function(t,e){var i=t.toString(16)+e.toString(16);return-1!==r.indexOf(i)},h.isZeroWidthJoiner=function(t){return 8205===t},h.isFlagEmoji=function(t){return o(t.substr(0,2))&&o(t.substr(2,2))},h.isRegionalCode=o,h.isCombinedCharacter=function(t){return-1!==e.indexOf(t)},h.isRegionalFlag=function(t,e){var r=n(t.substr(e,2));if(r!==i)return!1;var s=0;for(e+=2;s<5;){if((r=n(t.substr(e,2)))<917601||r>917626)return!1;s+=1,e+=2}return 917631===n(t.substr(e,2))},h.isVariationSelector=function(t){return 65039===t},h.BLACK_FLAG_CODE_POINT=i;var l={addChars:function(t){if(t){var e;this.chars||(this.chars=[]);var i,r,s=t.length,a=this.chars.length;for(e=0;e0&&(p=!1),p){var f=createTag("style");f.setAttribute("f-forigin",r[i].fOrigin),f.setAttribute("f-origin",r[i].origin),f.setAttribute("f-family",r[i].fFamily),f.type="text/css",f.innerText="@font-face {font-family: "+r[i].fFamily+"; font-style: normal; src: url('"+r[i].fPath+"');}",e.appendChild(f)}}else if("g"===r[i].fOrigin||1===r[i].origin){for(h=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),l=0;lt?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},AudioElement.prototype.show=function(){},AudioElement.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},AudioElement.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},AudioElement.prototype.resume=function(){this._canPlay=!0},AudioElement.prototype.setRate=function(t){this.audio.rate(t)},AudioElement.prototype.volume=function(t){this._volumeMultiplier=t,this._previousVolume=t*this._volume,this.audio.volume(this._previousVolume)},AudioElement.prototype.getBaseElement=function(){return null},AudioElement.prototype.destroy=function(){},AudioElement.prototype.sourceRectAtTime=function(){},AudioElement.prototype.initExpressions=function(){},BaseRenderer.prototype.checkLayers=function(t){var e,i,r=this.layers.length;for(this.completeLayers=!0,e=r-1;e>=0;e-=1)this.elements[e]||(i=this.layers[e]).ip-i.st<=t-this.layers[e].st&&i.op-i.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:default:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);case 15:return this.createFootage(t)}},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.createAudio=function(t){return new AudioElement(t,this.globalData,this)},BaseRenderer.prototype.createFootage=function(t){return new FootageElement(t,this.globalData,this)},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t0&&(this.maskElement.setAttribute("id",y),this.element.maskedElement.setAttribute(v,"url("+getLocationHref()+"#"+y+")"),a.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}TransformElement.prototype={initTransform:function(){var t=new Matrix;this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_localMatMdf:!1,_opMdf:!1,mat:t,localMat:t,localOpacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,i=0,r=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;i1&&(a+=" C"+e.o[r-1][0]+","+e.o[r-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),i.lastPath!==a){var n="";i.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),i.elem.setAttribute("d",n)),i.lastPath=a}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};var filtersFactory=function(){var t={};return t.createFilter=function(t,e){var i=createNS("filter");i.setAttribute("id",t),!0!==e&&(i.setAttribute("filterUnits","objectBoundingBox"),i.setAttribute("x","0%"),i.setAttribute("y","0%"),i.setAttribute("width","100%"),i.setAttribute("height","100%"));return i},t.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),t},t}(),featureSupport=function(){var t={maskType:!0,svgLumaHidden:!0,offscreenCanvas:"undefined"!=typeof OffscreenCanvas};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),/firefox/i.test(navigator.userAgent)&&(t.svgLumaHidden=!1),t}(),registeredEffects$1={},idPrefix="filter_result_";function SVGEffects(t){var e,i,r="SourceGraphic",s=t.data.ef?t.data.ef.length:0,a=createElementID(),n=filtersFactory.createFilter(a,!0),o=0;for(this.filters=[],e=0;e=0&&!this.shapeModifiers[t].processShapes(this._isFirstFrame);t-=1);}},searchProcessedElement:function(t){for(var e=this.processedElements,i=0,r=e.length;i.01)return!1;i+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t0;)h=r.transformers[d].mProps._mdf||h,c-=1,d-=1;if(h)for(c=y-r.styles[p].lvl,d=r.transformers.length-1;c>0;)m.multiply(r.transformers[d].mProps.v),c-=1,d-=1}else m=t;if(n=(f=r.sh.paths)._length,h){for(o="",a=0;a=1?v=.99:v<=-1&&(v=-.99);var b=o*v,x=Math.cos(g+e.a.v)*b+p[0],P=Math.sin(g+e.a.v)*b+p[1];h.setAttribute("fx",x),h.setAttribute("fy",P),l&&!e.g._collapsable&&(e.of.setAttribute("fx",x),e.of.setAttribute("fy",P))}}function h(t,e,i){var r=e.style,s=e.d;s&&(s._mdf||i)&&s.dashStr&&(r.pElem.setAttribute("stroke-dasharray",s.dashStr),r.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c._mdf||i)&&r.pElem.setAttribute("stroke","rgb("+bmFloor(e.c.v[0])+","+bmFloor(e.c.v[1])+","+bmFloor(e.c.v[2])+")"),(e.o._mdf||i)&&r.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||i)&&(r.pElem.setAttribute("stroke-width",e.w.v),r.msElem&&r.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){switch(t.ty){case"fl":return a;case"gf":return o;case"gs":return n;case"st":return h;case"sh":case"el":case"rc":case"sr":return s;case"tr":return i;case"no":return r;default:return null}}}}();function SVGShapeElement(t,e,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,i),this.prevViewData=[]}function LetterProps(t,e,i,r,s,a){this.o=t,this.sw=e,this.sc=i,this.fc=r,this.m=s,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!i,fc:!!r,m:!0,p:!0}}function TextProperty(t,e){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,e.d&&e.d.sid&&(e.d=t.globalData.slotManager.getProp(e.d)),this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var t,e,i,r,s=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(i=0;i1&&o&&this.setShapesAsAnimated(n)}},SVGShapeElement.prototype.setShapesAsAnimated=function(t){var e,i=t.length;for(e=0;e=0;o-=1){if((m=this.searchProcessedElement(t[o]))?e[o]=i[m-1]:t[o]._render=n,"fl"===t[o].ty||"st"===t[o].ty||"gf"===t[o].ty||"gs"===t[o].ty||"no"===t[o].ty)m?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],s),t[o]._render&&e[o].style.pElem.parentNode!==r&&r.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"===t[o].ty){if(m)for(l=e[o].it.length,h=0;h1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,i=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var r;this.lock=!0,this._mdf=!1;var s=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(r=0;re);)i+=1;return this.keysIndex!==i&&(this.keysIndex=i),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(t){for(var e,i,r=[],s=0,a=t.length,n=!1,o=!1,h="";s=55296&&e<=56319?FontManager.isRegionalFlag(t,s)?h=t.substr(s,14):(i=t.charCodeAt(s+1))>=56320&&i<=57343&&(FontManager.isModifier(e,i)?(h=t.substr(s,2),n=!0):h=FontManager.isFlagEmoji(t.substr(s,4))?t.substr(s,4):t.substr(s,2)):e>56319?(i=t.charCodeAt(s+1),FontManager.isVariationSelector(e)&&(n=!0)):FontManager.isZeroWidthJoiner(e)&&(n=!0,o=!0),n?(r[r.length-1]+=h,n=!1):r.push(h),s+=h.length;return r},TextProperty.prototype.completeTextData=function(t){t.__complete=!0;var e,i,r,s,a,n,o,h=this.elem.globalData.fontManager,l=this.data,p=[],f=0,m=l.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),x=0,P=getFontProperties(b);t.fWeight=P.weight,t.fStyle=P.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),i=t.finalText.length,t.finalLineHeight=t.lh;var E,S=t.tr/1e3*t.finalSize;if(t.sz)for(var C,_,A=!0,T=t.sz[0],M=t.sz[1];A;){C=0,g=0,i=(_=this.buildFinalText(t.t)).length,S=t.tr/1e3*t.finalSize;var k=-1;for(e=0;eT&&" "!==_[e]?(-1===k?i+=1:e=k,C+=t.finalLineHeight||1.2*t.finalSize,_.splice(e,k===e?1:0,"\r"),k=-1,g=0):(g+=x,g+=S);C+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&Mv?g:v,g=-2*S,s="",r=!0,u+=1):s=D,h.chars?(o=h.getCharData(D,b.fStyle,h.getFontByName(t.f).fFamily),x=r?0:o.w*t.finalSize/100):x=h.measureText(s,t.f,t.finalSize)," "===D?F+=x+S:(g+=x+S+F,F=0),p.push({l:x,an:x,add:c,n:r,anIndexes:[],val:s,line:u,animatorJustifyOffset:0}),2==m){if(c+=x,""===s||" "===s||e===i-1){for(""!==s&&" "!==s||(c-=x);d<=e;)p[d].an=c,p[d].ind=f,p[d].extra=x,d+=1;f+=1,c=0}}else if(3==m){if(c+=x,""===s||e===i-1){for(""===s&&(c-=x);d<=e;)p[d].an=c,p[d].ind=f,p[d].extra=x,d+=1;c=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var w,I,V,B,R=l.a;n=R.length;var L=[];for(a=0;a0?s=this.ne.v/100:a=-this.ne.v/100,this.xe.v>0?n=1-this.xe.v/100:o=1+this.xe.v/100;var h=BezierFactory.getBezierEasing(s,a,n,o).get,l=0,p=this.finalS,f=this.finalE,m=this.data.sh;if(2===m)l=h(l=f===p?r>=f?1:0:t(0,e(.5/(f-p)+(r-p)/(f-p),1)));else if(3===m)l=h(l=f===p?r>=f?0:1:1-t(0,e(.5/(f-p)+(r-p)/(f-p),1)));else if(4===m)f===p?l=0:(l=t(0,e(.5/(f-p)+(r-p)/(f-p),1)))<.5?l*=2:l=1-2*(l-.5),l=h(l);else if(5===m){if(f===p)l=0;else{var c=f-p,d=-c/2+(r=e(t(0,r+.5-p),f-p)),u=c/2;l=Math.sqrt(1-d*d/(u*u))}l=h(l)}else 6===m?(f===p?l=0:(r=e(t(0,r+.5-p),f-p),l=(1+Math.cos(Math.PI+2*Math.PI*r/(f-p)))/2),l=h(l)):(r>=i(p)&&(l=t(0,e(r-p<0?e(f,1)-(p-r):f-r,1))),l=h(l));if(100!==this.sm.v){var y=.01*this.sm.v;0===y&&(y=1e-8);var g=.5-.5*y;l1&&(l=1)}return l*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,i=this.o.v/e,r=this.s.v/e+i,s=this.e.v/e+i;if(r>s){var a=r;r=s,s=a}this.finalS=r,this.finalE=s}},extendPrototype([DynamicPropertyContainer],r),{getTextSelectorProp:function(t,e,i){return new r(t,e,i)}}}();function TextAnimatorDataProperty(t,e,i){var r={propType:!1},s=PropertyFactory.getProp,a=e.a;this.a={r:a.r?s(t,a.r,0,degToRads,i):r,rx:a.rx?s(t,a.rx,0,degToRads,i):r,ry:a.ry?s(t,a.ry,0,degToRads,i):r,sk:a.sk?s(t,a.sk,0,degToRads,i):r,sa:a.sa?s(t,a.sa,0,degToRads,i):r,s:a.s?s(t,a.s,1,.01,i):r,a:a.a?s(t,a.a,1,0,i):r,o:a.o?s(t,a.o,0,.01,i):r,p:a.p?s(t,a.p,1,0,i):r,sw:a.sw?s(t,a.sw,0,0,i):r,sc:a.sc?s(t,a.sc,1,0,i):r,fc:a.fc?s(t,a.fc,1,0,i):r,fh:a.fh?s(t,a.fh,0,0,i):r,fs:a.fs?s(t,a.fs,0,.01,i):r,fb:a.fb?s(t,a.fb,0,.01,i):r,t:a.t?s(t,a.t,0,0,i):r},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,i),this.s.t=e.s.t}function TextAnimatorProperty(t,e,i){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=i,this._animatorsData=createSizedArray(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(i)}function ITextElement(){}TextAnimatorProperty.prototype.searchProperties=function(){var t,e,i=this._textData.a.length,r=PropertyFactory.getProp;for(t=0;t=o+ot||!d?(v=(o+ot-l)/h.partialLength,G=c.point[0]+(h.point[0]-c.point[0])*v,z=c.point[1]+(h.point[1]-c.point[1])*v,C.translate(-P[0]*T[s].an*.005,-P[1]*B*.01),p=!1):d&&(l+=h.partialLength,(f+=1)>=d.length&&(f=0,u[m+=1]?d=u[m].points:x.v.c?(f=0,d=u[m=0].points):(l-=h.partialLength,d=null)),d&&(c=h,y=(h=d[f]).partialLength));L=T[s].an/2-T[s].add,C.translate(-L,0,0)}else L=T[s].an/2-T[s].add,C.translate(-L,0,0),C.translate(-P[0]*T[s].an*.005,-P[1]*B*.01,0);for(F=0;Ft?this.textSpans[t].span:createNS(h?"g":"text"),y<=t){if(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t].span=n,h){var g=createNS("g");n.appendChild(g),this.textSpans[t].childSpan=g}this.textSpans[t].span=n,this.layerElement.appendChild(n)}n.style.display="inherit"}if(l.reset(),p&&(o[t].n&&(f=-d,m+=i.yOffset,m+=c?1:0,c=!1),this.applyTextPropertiesToMatrix(i,l,o[t].line,f,m),f+=o[t].l||0,f+=d),h){var v;if(1===(u=this.globalData.fontManager.getCharData(i.finalText[t],r.fStyle,this.globalData.fontManager.getFontByName(i.f).fFamily)).t)v=new SVGCompElement(u.data,this.globalData,this);else{var b=emptyShapeData;u.data&&u.data.shapes&&(b=this.buildShapeData(u.data,i.finalSize)),v=new SVGShapeElement(b,this.globalData,this)}if(this.textSpans[t].glyph){var x=this.textSpans[t].glyph;this.textSpans[t].childSpan.removeChild(x.layerElement),x.destroy()}this.textSpans[t].glyph=v,v._debug=!0,v.prepareFrame(0),v.renderFrame(),this.textSpans[t].childSpan.appendChild(v.layerElement),1===u.t&&this.textSpans[t].childSpan.setAttribute("transform","scale("+i.finalSize/100+","+i.finalSize/100+")")}else p&&n.setAttribute("transform","translate("+l.props[12]+","+l.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}p&&n&&n.setAttribute("d","")}else{var P=this.textContainer,E="start";switch(i.j){case 1:E="end";break;case 2:E="middle";break;default:E="start"}P.setAttribute("text-anchor",E),P.setAttribute("letter-spacing",d);var S=this.buildTextContents(i.finalText);for(e=S.length,m=i.ps?i.ps[1]+i.ascent:0,t=0;t=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e=0;i-=1)(this.completeLayers||this.elements[i])&&(this.elements[i].prepareFrame(this.renderedFrame-this.layers[i].st),this.elements[i]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t=0;i-=1)t.finalTransform.multiply(t.transforms[i].transform.mProps.v);t._mdf=s},processSequences:function(t){var e,i=this.sequenceList.length;for(e=0;e=1){this.buffers=[];var t=this.globalData.canvasContext,e=assetLoader.createCanvas(t.canvas.width,t.canvas.height);this.buffers.push(e);var i=assetLoader.createCanvas(t.canvas.width,t.canvas.height);this.buffers.push(i),this.data.tt>=3&&!document._isProxy&&assetLoader.loadLumaCanvas()}this.canvasContext=this.globalData.canvasContext,this.transformCanvas=this.globalData.transformCanvas,this.renderableEffectsManager=new CVEffects(this),this.searchEffectTransforms()},createContent:function(){},setBlendMode:function(){var t=this.globalData;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=getBlendMode(this.data.bm);t.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this),this.transformEffects=this.renderableEffectsManager.getEffects(effectTypes.TRANSFORM_EFFECT)},hideElement:function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},clearCanvas:function(t){t.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy)},prepareLayer:function(){if(this.data.tt>=1){var t=this.buffers[0].getContext("2d");this.clearCanvas(t),t.drawImage(this.canvasContext.canvas,0,0),this.currentTransform=this.canvasContext.getTransform(),this.canvasContext.setTransform(1,0,0,1,0,0),this.clearCanvas(this.canvasContext),this.canvasContext.setTransform(this.currentTransform)}},exitLayer:function(){if(this.data.tt>=1){var t=this.buffers[1],e=t.getContext("2d");if(this.clearCanvas(e),e.drawImage(this.canvasContext.canvas,0,0),this.canvasContext.setTransform(1,0,0,1,0,0),this.clearCanvas(this.canvasContext),this.canvasContext.setTransform(this.currentTransform),this.comp.getElementById("tp"in this.data?this.data.tp:this.data.ind-1).renderFrame(!0),this.canvasContext.setTransform(1,0,0,1,0,0),this.data.tt>=3&&!document._isProxy){var i=assetLoader.getLumaCanvas(this.canvasContext.canvas);i.getContext("2d").drawImage(this.canvasContext.canvas,0,0),this.clearCanvas(this.canvasContext),this.canvasContext.drawImage(i,0,0)}this.canvasContext.globalCompositeOperation=operationsMap[this.data.tt],this.canvasContext.drawImage(t,0,0),this.canvasContext.globalCompositeOperation="destination-over",this.canvasContext.drawImage(this.buffers[0],0,0),this.canvasContext.setTransform(this.currentTransform),this.canvasContext.globalCompositeOperation="source-over"}},renderFrame:function(t){if(!this.hidden&&!this.data.hd&&(1!==this.data.td||t)){this.renderTransform(),this.renderRenderable(),this.renderLocalTransform(),this.setBlendMode();var e=0===this.data.ty;this.prepareLayer(),this.globalData.renderer.save(e),this.globalData.renderer.ctxTransform(this.finalTransform.localMat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.localOpacity),this.renderInnerContent(),this.globalData.renderer.restore(e),this.exitLayer(),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1)}},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(t,e){var i={data:t,type:t.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:!0===t.hd},r={};if("fl"===t.ty||"st"===t.ty?(r.c=PropertyFactory.getProp(this,t.c,1,255,this),r.c.k||(i.co="rgb("+bmFloor(r.c.v[0])+","+bmFloor(r.c.v[1])+","+bmFloor(r.c.v[2])+")")):"gf"!==t.ty&&"gs"!==t.ty||(r.s=PropertyFactory.getProp(this,t.s,1,null,this),r.e=PropertyFactory.getProp(this,t.e,1,null,this),r.h=PropertyFactory.getProp(this,t.h||{k:0},0,.01,this),r.a=PropertyFactory.getProp(this,t.a||{k:0},0,degToRads,this),r.g=new GradientProperty(this,t.g,this)),r.o=PropertyFactory.getProp(this,t.o,0,.01,this),"st"===t.ty||"gs"===t.ty){if(i.lc=lineCapEnum[t.lc||2],i.lj=lineJoinEnum[t.lj||2],1==t.lj&&(i.ml=t.ml),r.w=PropertyFactory.getProp(this,t.w,0,null,this),r.w.k||(i.wi=r.w.v),t.d){var s=new DashProperty(this,t.d,"canvas",this);r.d=s,r.d.k||(i.da=r.d.dashArray,i.do=r.d.dashoffset[0])}}else i.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(i),r.style=i,r},CVShapeElement.prototype.createGroupElement=function(){return{it:[],prevViewData:[]}},CVShapeElement.prototype.createTransformElement=function(t){return{transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,t.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,t,this)}}},CVShapeElement.prototype.createShapeElement=function(t){var e=new CVShapeData(this,t,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},CVShapeElement.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t=0;a-=1){if((h=this.searchProcessedElement(t[a]))?e[a]=i[h-1]:t[a]._shouldRender=r,"fl"===t[a].ty||"st"===t[a].ty||"gf"===t[a].ty||"gs"===t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],d),m.push(e[a].style);else if("gr"===t[a].ty){if(h)for(o=e[a].it.length,n=0;n=0;s-=1)"tr"===e[s].ty?(a=i[s].transform,this.renderShapeTransform(t,a)):"sh"===e[s].ty||"el"===e[s].ty||"rc"===e[s].ty||"sr"===e[s].ty?this.renderPath(e[s],i[s]):"fl"===e[s].ty?this.renderFill(e[s],i[s],a):"st"===e[s].ty?this.renderStroke(e[s],i[s],a):"gf"===e[s].ty||"gs"===e[s].ty?this.renderGradientFill(e[s],i[s],a):"gr"===e[s].ty?this.renderShape(a,e[s].it,i[s].it):e[s].ty;r&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var i,r,s,a=t.trNodes,n=e.paths,o=n._length;a.length=0;var h=t.transforms.finalTransform;for(s=0;s=1?f=.99:f<=-1&&(f=-.99);var m=l*f,c=Math.cos(p+e.a.v)*m+o[0],d=Math.sin(p+e.a.v)*m+o[1];r=n.createRadialGradient(c,d,0,o[0],o[1],l)}var u=t.g.p,y=e.g.c,g=1;for(a=0;ao&&"xMidYMid slice"===h||ns&&"meet"===o||as&&"slice"===o)?(i-this.transformCanvas.w*(r/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===l&&(as&&"slice"===o)?(i-this.transformCanvas.w*(r/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===p&&(a>s&&"meet"===o||as&&"meet"===o||a=0;t-=1)this.elements[t]&&this.elements[t].destroy&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){var i;this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var r=this.layers.length;for(this.completeLayers||this.checkLayers(t),i=r-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&this.elements[i].prepareFrame(t-this.layers[i].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),i=r-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&this.elements[i].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){var i=this.createItem(this.layers[t],this,this.globalData);e[t]=i,i.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},CVContextData.prototype.duplicate=function(){var t=2*this._length,e=0;for(e=this._length;e=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var t;for(t=this.layers.length-1;t>=0;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},CVCompElement.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},extendPrototype([CanvasRendererBase],CanvasRenderer),CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},HBaseElement.prototype={checkBlendMode:function(){},initRendererElement:function(){this.baseElement=createTag(this.data.tg||"div"),this.data.hasMask?(this.svgElement=createNS("svg"),this.layerElement=createNS("g"),this.maskedElement=this.layerElement,this.svgElement.appendChild(this.layerElement),this.baseElement.appendChild(this.svgElement)):this.layerElement=this.baseElement,styleDiv(this.baseElement)},createContainerElements:function(){this.renderableEffectsManager=new CVEffects(this),this.transformedElement=this.baseElement,this.maskedElement=this.layerElement,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0!==this.data.bm&&this.setBlendMode()},renderElement:function(){var t=this.transformedElement?this.transformedElement.style:{};if(this.finalTransform._matMdf){var e=this.finalTransform.mat.toCSS();t.transform=e,t.webkitTransform=e}this.finalTransform._opMdf&&(t.opacity=this.finalTransform.mProp.o.v)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.layerElement=null,this.transformedElement=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData)},addEffects:function(){},setMatte:function(){}},HBaseElement.prototype.getBaseElement=SVGBaseElement.prototype.getBaseElement,HBaseElement.prototype.destroyBaseElement=HBaseElement.prototype.destroy,HBaseElement.prototype.buildElementParenting=BaseRenderer.prototype.buildElementParenting,extendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],HSolidElement),HSolidElement.prototype.createContent=function(){var t;this.data.hasMask?((t=createNS("rect")).setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.svgElement.setAttribute("width",this.data.sw),this.svgElement.setAttribute("height",this.data.sh)):((t=createTag("div")).style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this.layerElement.appendChild(t)},extendPrototype([BaseElement,TransformElement,HSolidElement,SVGShapeElement,HBaseElement,HierarchyElement,FrameElement,RenderableElement],HShapeElement),HShapeElement.prototype._renderShapeFrame=HShapeElement.prototype.renderInnerContent,HShapeElement.prototype.createContent=function(){var t;if(this.baseElement.style.fontSize=0,this.data.hasMask)this.layerElement.appendChild(this.shapesContainer),t=this.svgElement;else{t=createNS("svg");var e=this.comp.data?this.comp.data:this.globalData.compSize;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this.layerElement.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,0,[],!0),this.filterUniqueShapes(),this.shapeCont=t},HShapeElement.prototype.getTransformedPoint=function(t,e){var i,r=t.length;for(i=0;i0&&o<1&&f[m].push(this.calculateF(o,t,e,i,r,m)):(h=a*a-4*n*s)>=0&&((l=(-a+bmSqrt(h))/(2*s))>0&&l<1&&f[m].push(this.calculateF(l,t,e,i,r,m)),(p=(-a-bmSqrt(h))/(2*s))>0&&p<1&&f[m].push(this.calculateF(p,t,e,i,r,m))));this.shapeBoundingBox.left=bmMin.apply(null,f[0]),this.shapeBoundingBox.top=bmMin.apply(null,f[1]),this.shapeBoundingBox.right=bmMax.apply(null,f[0]),this.shapeBoundingBox.bottom=bmMax.apply(null,f[1])},HShapeElement.prototype.calculateF=function(t,e,i,r,s,a){return bmPow(1-t,3)*e[a]+3*bmPow(1-t,2)*t*i[a]+3*(1-t)*bmPow(t,2)*r[a]+bmPow(t,3)*s[a]},HShapeElement.prototype.calculateBoundingBox=function(t,e){var i,r=t.length;for(i=0;ii&&(i=s)}i*=t.mult}else i=t.v*t.mult;e.x-=i,e.xMax+=i,e.y-=i,e.yMax+=i},HShapeElement.prototype.currentBoxContains=function(t){return this.currentBBox.x<=t.x&&this.currentBBox.y<=t.y&&this.currentBBox.width+this.currentBBox.x>=t.x+t.width&&this.currentBBox.height+this.currentBBox.y>=t.y+t.height},HShapeElement.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&(this._isFirstFrame||this._mdf)){var t=this.tempBoundingBox,e=999999;if(t.x=e,t.xMax=-e,t.y=e,t.yMax=-e,this.calculateBoundingBox(this.itemsData,t),t.width=t.xMax=0;t-=1){var r=this.hierarchy[t].finalTransform.mProp;this.mat.translate(-r.p.v[0],-r.p.v[1],r.p.v[2]),this.mat.rotateX(-r.or.v[0]).rotateY(-r.or.v[1]).rotateZ(r.or.v[2]),this.mat.rotateX(-r.rx.v).rotateY(-r.ry.v).rotateZ(r.rz.v),this.mat.scale(1/r.s.v[0],1/r.s.v[1],1/r.s.v[2]),this.mat.translate(r.a.v[0],r.a.v[1],r.a.v[2])}if(this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var s;s=this.p?[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]]:[this.px.v-this.a.v[0],this.py.v-this.a.v[1],this.pz.v-this.a.v[2]];var a=Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2)+Math.pow(s[2],2)),n=[s[0]/a,s[1]/a,s[2]/a],o=Math.sqrt(n[2]*n[2]+n[0]*n[0]),h=Math.atan2(n[1],o),l=Math.atan2(n[0],-n[2]);this.mat.rotateY(l).rotateX(-h)}this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v);var p=!this._prevMat.equals(this.mat);if((p||this.pe._mdf)&&this.comp.threeDElements){var f,m,c;for(e=this.comp.threeDElements.length,t=0;t=t)return this.threeDElements[e].perspectiveElem;e+=1}return null},HybridRendererBase.prototype.createThreeDContainer=function(t,e){var i,r,s=createTag("div");styleDiv(s);var a=createTag("div");if(styleDiv(a),"3d"===e){(i=s.style).width=this.globalData.compSize.w+"px",i.height=this.globalData.compSize.h+"px";var n="50% 50%";i.webkitTransformOrigin=n,i.mozTransformOrigin=n,i.transformOrigin=n;var o="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)";(r=a.style).transform=o,r.webkitTransform=o}s.appendChild(a);var h={container:a,perspectiveElem:s,startPos:t,endPos:t,type:e};return this.threeDElements.push(h),h},HybridRendererBase.prototype.build3dContainers=function(){var t,e,i=this.layers.length,r="";for(t=0;t=0;t-=1)this.resizerElem.appendChild(this.threeDElements[t].perspectiveElem)},HybridRendererBase.prototype.addTo3dContainer=function(t,e){for(var i=0,r=this.threeDElements.length;in?(t=s/this.globalData.compSize.w,e=s/this.globalData.compSize.w,i=0,r=(a-this.globalData.compSize.h*(s/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,i=(s-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,r=0);var o=this.resizerElem.style;o.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+i+","+r+",0,1)",o.transform=o.webkitTransform},HybridRendererBase.prototype.renderFrame=SVGRenderer.prototype.renderFrame,HybridRendererBase.prototype.hide=function(){this.resizerElem.style.display="none"},HybridRendererBase.prototype.show=function(){this.resizerElem.style.display="block"},HybridRendererBase.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,i=this.globalData.compSize.h,r=this.threeDElements.length;for(t=0;t=o;)t/=2,e/=2,i>>>=1;return(t+i)/e};return b.int32=function(){return 0|v.g(4)},b.quick=function(){return v.g(4)/4294967296},b.double=b,m(c(v.S),t),(d.pass||u||function(t,i,r,s){return s&&(s.S&&p(s,v),t.state=function(){return p(v,{})}),r?(e.random=t,i):t})(b,g,"global"in d?d.global:this==e,d.state)},m(e.random(),t)}function initialize$2(t){seedRandom([],t)}var propTypes={SHAPE:"shape"};function _typeof$1(t){return _typeof$1="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof$1(t)}var ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null,XMLHttpRequest=null,fetch=null,frames=null,_lottieGlobal={};function resetFrame(){_lottieGlobal={}}function $bm_isInstanceOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function isNumerable(t,e){return"number"===t||e instanceof Number||"boolean"===t||"string"===t}function $bm_neg(t){var e=_typeof$1(t);if("number"===e||t instanceof Number||"boolean"===e)return-t;if($bm_isInstanceOfArray(t)){var i,r=t.length,s=[];for(i=0;ii){var r=i;i=e,e=r}return Math.min(Math.max(t,e),i)}function radiansToDegrees(t){return t/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(t){return t*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);var i;e||(e=helperLengthArray);var r=Math.min(t.length,e.length),s=0;for(i=0;i.5?l/(2-n-o):l/(n+o),n){case r:e=(s-a)/l+(s1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}function hslToRgb(t){var e,i,r,s=t[0],a=t[1],n=t[2];if(0===a)e=n,r=n,i=n;else{var o=n<.5?n*(1+a):n+a-n*a,h=2*n-o;e=hue2rgb(h,o,s+1/3),i=hue2rgb(h,o,s),r=hue2rgb(h,o,s-1/3)}return[e,i,r,t[3]]}function linear(t,e,i,r,s){if(void 0!==r&&void 0!==s||(r=e,s=i,e=0,i=1),i=i)return s;var n,o=i===e?0:(t-e)/(i-e);if(!r.length)return r+(s-r)*o;var h=r.length,l=createTypedArray("float32",h);for(n=0;n1){for(r=0;r1?e=1:e<0&&(e=0);var n=t(e);if($bm_isInstanceOfArray(s)){var o,h=s.length,l=createTypedArray("float32",h);for(o=0;odata.k[e].t&&tdata.k[e+1].t-t?(i=e+2,r=data.k[e+1].t):(i=e+1,r=data.k[e].t);break}}-1===i&&(i=e+1,r=data.k[e].t)}else i=0,r=0;var a={};return a.index=i,a.time=r/elem.comp.globalData.frameRate,a}function key(t){var e,i,r;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);t-=1,e={time:data.k[t].t/elem.comp.globalData.frameRate,value:[]};var s=Object.prototype.hasOwnProperty.call(data.k[t],"s")?data.k[t].s:data.k[t-1].e;for(r=s.length,i=0;il.length-1)&&(e=l.length-1),r=p-(s=l[l.length-1-e].t)),"pingpong"===t){if(Math.floor((h-s)/r)%2!=0)return this.getValueAtTime((r-(h-s)%r+s)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(s/this.comp.globalData.frameRate,0),m=this.getValueAtTime(p/this.comp.globalData.frameRate,0),c=this.getValueAtTime(((h-s)%r+s)/this.comp.globalData.frameRate,0),d=Math.floor((h-s)/r);if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a=p)return this.pv;if(i?s=p+(r=e?Math.abs(this.elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-p)):((!e||e>l.length-1)&&(e=l.length-1),r=(s=l[e].t)-p),"pingpong"===t){if(Math.floor((p-h)/r)%2==0)return this.getValueAtTime(((p-h)%r+p)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(p/this.comp.globalData.frameRate,0),m=this.getValueAtTime(s/this.comp.globalData.frameRate,0),c=this.getValueAtTime((r-(p-h)%r+p)/this.comp.globalData.frameRate,0),d=Math.floor((p-h)/r)+1;if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a1?(s+t-a)/(e-1):1,o=0,h=0;for(i=this.pv.length?createTypedArray("float32",this.pv.length):0;on){var p=o,f=i.c&&o===h-1?0:o+1,m=(n-l)/a[o].addedLength;r=bez.getPointInSegment(i.v[p],i.v[f],i.o[p],i.i[f],m,a[o]);break}l+=a[o].addedLength,o+=1}return r||(r=i.c?[i.v[0][0],i.v[0][1]]:[i.v[i._length-1][0],i.v[i._length-1][1]]),r},vectorOnPath:function(t,e,i){1==t?t=this.v.c:0==t&&(t=.999);var r=this.pointOnPath(t,e),s=this.pointOnPath(t+.001,e),a=s[0]-r[0],n=s[1]-r[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2));return 0===o?[0,0]:"tangent"===i?[a/o,n/o]:[-n/o,a/o]},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},setGroupProperty:expressionHelpers.setGroupProperty,getValueAtTime:expressionHelpers.getStaticValueAtTime},extendPrototype([l],o),extendPrototype([l],h),h.prototype.getValueAtTime=function(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shapePool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastTime=l?c<0?r:s:r+m*Math.pow((a-t)/c,1/i),p[f]=n,f+=1,o+=256/255;return p.join(" ")},SVGProLevelsFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e,i=this.filterManager.effectElements;this.feFuncRComposed&&(t||i[3].p._mdf||i[4].p._mdf||i[5].p._mdf||i[6].p._mdf||i[7].p._mdf)&&(e=this.getTableValue(i[3].p.v,i[4].p.v,i[5].p.v,i[6].p.v,i[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||i[10].p._mdf||i[11].p._mdf||i[12].p._mdf||i[13].p._mdf||i[14].p._mdf)&&(e=this.getTableValue(i[10].p.v,i[11].p.v,i[12].p.v,i[13].p.v,i[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||i[17].p._mdf||i[18].p._mdf||i[19].p._mdf||i[20].p._mdf||i[21].p._mdf)&&(e=this.getTableValue(i[17].p.v,i[18].p.v,i[19].p.v,i[20].p.v,i[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||i[24].p._mdf||i[25].p._mdf||i[26].p._mdf||i[27].p._mdf||i[28].p._mdf)&&(e=this.getTableValue(i[24].p.v,i[25].p.v,i[26].p.v,i[27].p.v,i[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||i[31].p._mdf||i[32].p._mdf||i[33].p._mdf||i[34].p._mdf||i[35].p._mdf)&&(e=this.getTableValue(i[31].p.v,i[32].p.v,i[33].p.v,i[34].p.v,i[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},extendPrototype([SVGComposableEffect],SVGDropShadowEffect),SVGDropShadowEffect.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){if((t||this.filterManager.effectElements[4].p._mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p._mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p._mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p._mdf||this.filterManager.effectElements[3].p._mdf){var i=this.filterManager.effectElements[3].p.v,r=(this.filterManager.effectElements[2].p.v-90)*degToRads,s=i*Math.cos(r),a=i*Math.sin(r);this.feOffset.setAttribute("dx",s),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[];function SVGMatte3Effect(t,e,i){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=i,i.matteElement=createNS("g"),i.matteElement.appendChild(i.layerElement),i.matteElement.appendChild(i.transformedElement),i.baseElement=i.matteElement}function SVGGaussianBlurEffect(t,e,i,r){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","300%"),t.setAttribute("height","300%"),this.filterManager=e;var s=createNS("feGaussianBlur");s.setAttribute("result",r),t.appendChild(s),this.feGaussianBlur=s}function TransformEffect(){}function SVGTransformEffect(t,e){this.init(e)}function CVTransformEffect(t){this.init(t)}return SVGMatte3Effect.prototype.findSymbol=function(t){for(var e=0,i=_svgMatteSymbols.length;e=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); +!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); +!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); +!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); +!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; +Prism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"]; +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism); +Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; +!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); +!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); +!function(a){function e(a,e){return RegExp(a.replace(//g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r|.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}; +!function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],i=r.pattern.source;function o(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function p(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function l(t){var n={};n["interpolation-punctuation"]=a;var i=e.tokenize(t,n);if(3===i.length){var o=[1,1];o.push.apply(o,p(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,o)}return new e.Token("interpolation",i,r.alias,t)}function g(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),o=0,g={},u=p(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(o++,r)););return g[n]=a,n})).join(""),n,r),c=Object.keys(g);return o=0,function e(t){for(var n=0;n=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); +Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); +Prism.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}; +!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism); +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); +Prism.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},Prism.languages.pq=Prism.languages.powerquery,Prism.languages.mscript=Prism.languages.powerquery; +!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); +!function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^\d+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism); +!function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism); +!function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof Prism){var e=Object.assign||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},t={"remove-trailing":"boolean","remove-indent":"boolean","left-trim":"boolean","right-trim":"boolean","break-lines":"number",indent:"number","remove-initial-line-feed":"boolean","tabs-to-spaces":"number","spaces-to-tabs":"number"};n.prototype={setDefaults:function(t){this.defaults=e(this.defaults,t)},normalize:function(t,n){for(var r in n=e(this.defaults,n)){var i=r.replace(/-(\w)/g,(function(e,t){return t.toUpperCase()}));"normalize"!==r&&"setDefaults"!==i&&n[r]&&this[i]&&(t=this[i].call(this,t,n[r]))}return t},leftTrim:function(e){return e.replace(/^\s+/,"")},rightTrim:function(e){return e.replace(/\s+$/,"")},tabsToSpaces:function(e,t){return t=0|t||4,e.replace(/\t/g,new Array(++t).join(" "))},spacesToTabs:function(e,t){return t=0|t||4,e.replace(RegExp(" {"+t+"}","g"),"\t")},removeTrailing:function(e){return e.replace(/\s*?$/gm,"")},removeInitialLineFeed:function(e){return e.replace(/^(?:\r?\n|\r)/,"")},removeIndent:function(e){var t=e.match(/^[^\S\n\r]*(?=\S)/gm);return t&&t[0].length?(t.sort((function(e,t){return e.length-t.length})),t[0].length?e.replace(RegExp("^"+t[0],"gm"),""):e):e},indent:function(e,t){return e.replace(/^[^\S\n\r]*(?=\S)/gm,new Array(++t).join("\t")+"$&")},breakLines:function(e,t){t=!0===t?80:0|t||80;for(var n=e.split("\n"),i=0;it&&(o[l]="\n"+o[l],a=s)}n[i]=o.join("")}return n.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var r=e.element.parentNode;if(e.code&&r&&"pre"===r.nodeName.toLowerCase()){for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){var o=t[i];if(r.hasAttribute("data-"+i))try{var a=JSON.parse(r.getAttribute("data-"+i)||"true");typeof a===o&&(e.settings[i]=a)}catch(e){}}for(var l=r.childNodes,s="",c="",u=!1,m=0;m40)throw new Error('"version" should be in range from 1 to 40');return 4*t+17},a=function(t){return n[t]},i=function(t){for(var r=0;0!==t;)r++,t>>>=1;return r},u=function(t){if("function"!=typeof t)throw new Error('"toSJISFunc" is not a valid function.');r=t},s=function(){return void 0!==r},f=function(t){return r(t)};function h(t,r){return t(r={exports:{}},r.exports),r.exports}var c=h((function(t,r){r.L={bit:1},r.M={bit:0},r.Q={bit:3},r.H={bit:2},r.isValid=function(t){return t&&void 0!==t.bit&&t.bit>=0&&t.bit<4},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"l":case"low":return r.L;case"m":case"medium":return r.M;case"q":case"quartile":return r.Q;case"h":case"high":return r.H;default:throw new Error("Unknown EC Level: "+t)}}(t)}catch(t){return e}}}));function g(){this.buffer=[],this.length=0}c.L,c.M,c.Q,c.H,c.isValid,g.prototype={get:function(t){var r=Math.floor(t/8);return 1==(this.buffer[r]>>>7-t%8&1)},put:function(t,r){for(var e=0;e>>r-e-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}};var d=g;function l(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}l.prototype.set=function(t,r,e,n){var o=t*this.size+r;this.data[o]=e,n&&(this.reservedBit[o]=!0)},l.prototype.get=function(t,r){return this.data[t*this.size+r]},l.prototype.xor=function(t,r,e){this.data[t*this.size+r]^=e},l.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]};var v=l,p=h((function(t,r){var e=o;r.getRowColCoords=function(t){if(1===t)return[];for(var r=Math.floor(t/7)+2,n=e(t),o=145===n?26:2*Math.ceil((n-13)/(2*r-2)),a=[n-7],i=1;i=0&&t<=7},r.from=function(t){return r.isValid(t)?parseInt(t,10):void 0},r.getPenaltyN1=function(t){for(var r=t.size,n=0,o=0,a=0,i=null,u=null,s=0;s=5&&(n+=e+(o-5)),i=h,o=1),(h=t.get(f,s))===u?a++:(a>=5&&(n+=e+(a-5)),u=h,a=1)}o>=5&&(n+=e+(o-5)),a>=5&&(n+=e+(a-5))}return n},r.getPenaltyN2=function(t){for(var r=t.size,e=0,o=0;o=10&&(1488===n||93===n)&&e++,a=a<<1&2047|t.get(u,i),u>=10&&(1488===a||93===a)&&e++}return e*o},r.getPenaltyN4=function(t){for(var r=0,e=t.data.length,n=0;n=0;){for(var n=e[0],o=0;o0){var o=new Uint8Array(this.degree);return o.set(e,n),o}return e};var L=T,b=function(t){return!isNaN(t)&&t>=1&&t<=40},U="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+",x="(?:(?![A-Z0-9 $%*+\\-./:]|"+(U=U.replace(/u/g,"\\u"))+")(?:.|[\r\n]))+",k=new RegExp(U,"g"),F=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),S=new RegExp(x,"g"),D=new RegExp("[0-9]+","g"),Y=new RegExp("[A-Z $%*+\\-./:]+","g"),_=new RegExp("^"+U+"$"),z=new RegExp("^[0-9]+$"),H=new RegExp("^[A-Z0-9 $%*+\\-./:]+$"),J={KANJI:k,BYTE_KANJI:F,BYTE:S,NUMERIC:D,ALPHANUMERIC:Y,testKanji:function(t){return _.test(t)},testNumeric:function(t){return z.test(t)},testAlphanumeric:function(t){return H.test(t)}},K=h((function(t,r){r.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},r.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},r.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},r.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},r.MIXED={bit:-1},r.getCharCountIndicator=function(t,r){if(!t.ccBits)throw new Error("Invalid mode: "+t);if(!b(r))throw new Error("Invalid version: "+r);return r>=1&&r<10?t.ccBits[0]:r<27?t.ccBits[1]:t.ccBits[2]},r.getBestModeForData=function(t){return J.testNumeric(t)?r.NUMERIC:J.testAlphanumeric(t)?r.ALPHANUMERIC:J.testKanji(t)?r.KANJI:r.BYTE},r.toString=function(t){if(t&&t.id)return t.id;throw new Error("Invalid mode")},r.isValid=function(t){return t&&t.bit&&t.ccBits},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return r.NUMERIC;case"alphanumeric":return r.ALPHANUMERIC;case"kanji":return r.KANJI;case"byte":return r.BYTE;default:throw new Error("Unknown mode: "+t)}}(t)}catch(t){return e}}}));K.NUMERIC,K.ALPHANUMERIC,K.BYTE,K.KANJI,K.MIXED,K.getCharCountIndicator,K.getBestModeForData,K.isValid;var O=h((function(t,r){var e=i(7973);function n(t,r){return K.getCharCountIndicator(t,r)+4}function o(t,r){var e=0;return t.forEach((function(t){var o=n(t.mode,r);e+=o+t.getBitsLength()})),e}r.from=function(t,r){return b(t)?parseInt(t,10):r},r.getCapacity=function(t,r,e){if(!b(t))throw new Error("Invalid QR Code version");void 0===e&&(e=K.BYTE);var o=8*(a(t)-M(t,r));if(e===K.MIXED)return o;var i=o-n(e,t);switch(e){case K.NUMERIC:return Math.floor(i/10*3);case K.ALPHANUMERIC:return Math.floor(i/11*2);case K.KANJI:return Math.floor(i/13);case K.BYTE:default:return Math.floor(i/8)}},r.getBestVersionForData=function(t,e){var n,a=c.from(e,c.M);if(Array.isArray(t)){if(t.length>1)return function(t,e){for(var n=1;n<=40;n++){if(o(t,n)<=r.getCapacity(n,e,K.MIXED))return n}}(t,a);if(0===t.length)return 1;n=t[0]}else n=t;return function(t,e,n){for(var o=1;o<=40;o++)if(e<=r.getCapacity(o,n,t))return o}(n.mode,n.getLength(),a)},r.getEncodedBits=function(t){if(!b(t)||t<7)throw new Error("Invalid QR Code version");for(var r=t<<12;i(r)-e>=0;)r^=7973<=0;)n^=1335<0&&(e=this.data.substr(r),n=parseInt(e,10),t.put(n,3*o+1))};var j=q,$=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function X(t){this.mode=K.ALPHANUMERIC,this.data=t}X.getBitsLength=function(t){return 11*Math.floor(t/2)+t%2*6},X.prototype.getLength=function(){return this.data.length},X.prototype.getBitsLength=function(){return X.getBitsLength(this.data.length)},X.prototype.write=function(t){var r;for(r=0;r+2<=this.data.length;r+=2){var e=45*$.indexOf(this.data[r]);e+=$.indexOf(this.data[r+1]),t.put(e,11)}this.data.length%2&&t.put($.indexOf(this.data[r]),6)};var Z=X;function W(t){this.mode=K.BYTE,"string"==typeof t&&(t=function(t){for(var r=[],e=t.length,n=0;n=55296&&o<=56319&&e>n+1){var a=t.charCodeAt(n+1);a>=56320&&a<=57343&&(o=1024*(o-55296)+a-56320+65536,n+=1)}o<128?r.push(o):o<2048?(r.push(o>>6|192),r.push(63&o|128)):o<55296||o>=57344&&o<65536?(r.push(o>>12|224),r.push(o>>6&63|128),r.push(63&o|128)):o>=65536&&o<=1114111?(r.push(o>>18|240),r.push(o>>12&63|128),r.push(o>>6&63|128),r.push(63&o|128)):r.push(239,191,189)}return new Uint8Array(r).buffer}(t)),this.data=new Uint8Array(t)}W.getBitsLength=function(t){return 8*t},W.prototype.getLength=function(){return this.data.length},W.prototype.getBitsLength=function(){return W.getBitsLength(this.data.length)},W.prototype.write=function(t){for(var r=0,e=this.data.length;r=33088&&e<=40956)e-=33088;else{if(!(e>=57408&&e<=60351))throw new Error("Invalid SJIS character: "+this.data[r]+"\nMake sure your charset is UTF-8");e-=49472}e=192*(e>>>8&255)+(255&e),t.put(e,13)}};var rt=tt,et=h((function(t){var r={single_source_shortest_paths:function(t,e,n){var o={},a={};a[e]=0;var i,u,s,f,h,c,g,d=r.PriorityQueue.make();for(d.push(e,0);!d.empty();)for(s in u=(i=d.pop()).value,f=i.cost,h=t[u]||{})h.hasOwnProperty(s)&&(c=f+h[s],g=a[s],(void 0===a[s]||g>c)&&(a[s]=c,d.push(s,c),o[s]=u));if(void 0!==n&&void 0===a[n]){var l=["Could not find a path from ",e," to ",n,"."].join("");throw new Error(l)}return o},extract_shortest_path_from_predecessor_list:function(t,r){for(var e=[],n=r;n;)e.push(n),n=t[n];return e.reverse(),e},find_path:function(t,e,n){var o=r.single_source_shortest_paths(t,e,n);return r.extract_shortest_path_from_predecessor_list(o,n)},PriorityQueue:{make:function(t){var e,n=r.PriorityQueue,o={};for(e in t=t||{},n)n.hasOwnProperty(e)&&(o[e]=n[e]);return o.queue=[],o.sorter=t.sorter||n.default_sorter,o},default_sorter:function(t,r){return t.cost-r.cost},push:function(t,r){var e={value:t,cost:r};this.queue.push(e),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};t.exports=r})),nt=h((function(t,r){function e(t){return unescape(encodeURIComponent(t)).length}function n(t,r,e){for(var n,o=[];null!==(n=t.exec(e));)o.push({data:n[0],index:n.index,mode:r,length:n[0].length});return o}function o(t){var r,e,o=n(J.NUMERIC,K.NUMERIC,t),a=n(J.ALPHANUMERIC,K.ALPHANUMERIC,t);return s()?(r=n(J.BYTE,K.BYTE,t),e=n(J.KANJI,K.KANJI,t)):(r=n(J.BYTE_KANJI,K.BYTE,t),e=[]),o.concat(a,r,e).sort((function(t,r){return t.index-r.index})).map((function(t){return{data:t.data,mode:t.mode,length:t.length}}))}function a(t,r){switch(r){case K.NUMERIC:return j.getBitsLength(t);case K.ALPHANUMERIC:return Z.getBitsLength(t);case K.KANJI:return rt.getBitsLength(t);case K.BYTE:return G.getBitsLength(t)}}function i(t,r){var e,n=K.getBestModeForData(t);if((e=K.from(r,n))!==K.BYTE&&e.bit=0?t[t.length-1]:null;return e&&e.mode===r.mode?(t[t.length-1].data+=r.data,t):(t.push(r),t)}),[])}(s))},r.rawSplit=function(t){return r.fromArray(o(t))}}));function ot(t,r,e){var n,o,a=t.size,i=V(r,e);for(n=0;n<15;n++)o=1==(i>>n&1),n<6?t.set(n,8,o,!0):n<8?t.set(n+1,8,o,!0):t.set(a-15+n,8,o,!0),n<8?t.set(8,a-n-1,o,!0):n<9?t.set(8,15-n-1+1,o,!0):t.set(8,15-n-1,o,!0);t.set(a-8,8,1,!0)}function at(t,r,e){var n=new d;e.forEach((function(r){n.put(r.mode.bit,4),n.put(r.getLength(),K.getCharCountIndicator(r.mode,t)),r.write(n)}));var o=8*(a(t)-M(t,r));for(n.getLengthInBits()+4<=o&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(0);for(var i=(o-n.getLengthInBits())/8,u=0;u=0&&u<=6&&(0===s||6===s)||s>=0&&s<=6&&(0===u||6===u)||u>=2&&u<=4&&s>=2&&s<=4?t.set(a+u,i+s,!0,!0):t.set(a+u,i+s,!1,!0))}(c,r),function(t){for(var r=t.size,e=8;e=7&&function(t,r){for(var e,n,o,a=t.size,i=O.getEncodedBits(r),u=0;u<18;u++)e=Math.floor(u/3),n=u%3+a-8-3,o=1==(i>>u&1),t.set(e,n,o,!0),t.set(n,e,o,!0)}(c,r),function(t,r){for(var e=t.size,n=-1,o=e-1,a=7,i=0,u=e-1;u>0;u-=2)for(6===u&&u--;;){for(var s=0;s<2;s++)if(!t.isReserved(o,u-s)){var f=!1;i>>a&1)),t.set(o,u-s,f),-1===--a&&(i++,a=7)}if((o+=n)<0||e<=o){o-=n,n=-n;break}}}(c,f),isNaN(n)&&(n=E.getBestMask(c,ot.bind(null,c,e))),E.applyMask(n,c),ot(c,e,n),{modules:c,version:r,errorCorrectionLevel:e,maskPattern:n,segments:a}}nt.fromArray,nt.fromString,nt.rawSplit;var ut=function(t,r){if(void 0===t||""===t)throw new Error("No input text");var e,n,o=c.M;return void 0!==r&&(o=c.from(r.errorCorrectionLevel,c.M),e=O.from(r.version),n=E.from(r.maskPattern),r.toSJISFunc&&u(r.toSJISFunc)),it(t,e,o,n)},st=h((function(t,r){function e(t){if("number"==typeof t&&(t=t.toString()),"string"!=typeof t)throw new Error("Color should be defined as hex string");var r=t.slice().replace("#","").split("");if(r.length<3||5===r.length||r.length>8)throw new Error("Invalid hex color: "+t);3!==r.length&&4!==r.length||(r=Array.prototype.concat.apply([],r.map((function(t){return[t,t]})))),6===r.length&&r.push("F","F");var e=parseInt(r.join(""),16);return{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:255&e,hex:"#"+r.slice(0,6).join("")}}r.getOptions=function(t){t||(t={}),t.color||(t.color={});var r=void 0===t.margin||null===t.margin||t.margin<0?4:t.margin,n=t.width&&t.width>=21?t.width:void 0,o=t.scale||4;return{width:n,scale:n?4:o,margin:r,color:{dark:e(t.color.dark||"#000000ff"),light:e(t.color.light||"#ffffffff")},type:t.type,rendererOpts:t.rendererOpts||{}}},r.getScale=function(t,r){return r.width&&r.width>=t+2*r.margin?r.width/(t+2*r.margin):r.scale},r.getImageWidth=function(t,e){var n=r.getScale(t,e);return Math.floor((t+2*e.margin)*n)},r.qrToImageData=function(t,e,n){for(var o=e.modules.size,a=e.modules.data,i=r.getScale(o,n),u=Math.floor((o+2*n.margin)*i),s=n.margin*i,f=[n.color.light,n.color.dark],h=0;h=s&&c>=s&&h':"",s="0&&s>0&&t[u-1]||(n+=a?ct("M",s+e,.5+f+e):ct("m",o,0),o=0,a=!1),s+1',f='viewBox="0 0 '+i+" "+i+'"',h=''+u+s+"\n";return"function"==typeof e&&e(null,h),h};function dt(t,r,n,o,a){var i=[].slice.call(arguments,1),u=i.length,s="function"==typeof i[u-1];if(!s&&!e())throw new Error("Callback required as last argument");if(!s){if(u<1)throw new Error("Too few arguments provided");return 1===u?(n=r,r=o=void 0):2!==u||r.getContext||(o=n,n=r,r=void 0),new Promise((function(e,a){try{var i=ut(n,o);e(t(i,r,o))}catch(t){a(t)}}))}if(u<2)throw new Error("Too few arguments provided");2===u?(a=n,n=r,r=o=void 0):3===u&&(r.getContext&&void 0===a?(a=o,o=void 0):(a=o,o=n,n=r,r=void 0));try{var f=ut(n,o);a(null,t(f,r,o))}catch(t){a(t)}}var lt=ut,vt=dt.bind(null,ft.render),pt=dt.bind(null,ft.renderToDataURL),wt=dt.bind(null,(function(t,r,e){return gt(t,e)})),mt={create:lt,toCanvas:vt,toDataURL:pt,toString:wt};return t.create=lt,t.default=mt,t.toCanvas=vt,t.toDataURL=pt,t.toString=wt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); diff --git a/js/script.js b/js/script.js new file mode 100644 index 0000000000..cf240dd375 --- /dev/null +++ b/js/script.js @@ -0,0 +1,312 @@ +const uniqueSwiper = new Swiper('.unique-swiper', { + slidesPerView: 1, + spaceBetween: 80, + allowTouchMove: true, + breakpoints: { + 1400: { + allowTouchMove: false, + }, + 1200: { + allowTouchMove: true, + }, + 768: { + allowTouchMove: true, + } + }, + direction: 'horizontal', + pagination: { + el: '.simplex-unique-swiper-pagination', + clickable: true, + }, + navigation: { + nextEl: '.unique-swiper-button-next', + prevEl: '.unique-swiper-button-prev', + }, +}); + +const isMobile = { + Android: () => navigator.userAgent.match(/Android/i), + iOS: () => navigator.userAgent.match(/iPhone|iPad|iPod/i), + any: () => navigator.userAgent.match(/Android|iPhone|iPad|iPod/i) +}; + +const privateSwiper = new Swiper('.private-swiper', { + slidesPerView: 1, + slidesPerGroup: 1, + spaceBetween: 20, + allowTouchMove: true, + scrollbar: { + el: '.swiper-scrollbar', + draggable: true, + snapOnRelease: true, + dragSize: 100, + }, + direction: 'horizontal', + navigation: { + nextEl: '.private-swiper-button-next', + prevEl: '.private-swiper-button-prev', + }, + breakpoints: { + 1400: { + slidesPerView: 4, + slidesPerGroup: 4, + spaceBetween: 20, + allowTouchMove: false, + }, + 1200: { + slidesPerView: 3, + slidesPerGroup: 3, + spaceBetween: 20, + allowTouchMove: true, + }, + 768: { + slidesPerView: 2, + slidesPerGroup: 2, + spaceBetween: 20, + allowTouchMove: true, + } + }, + on: { + slideChange: function () { + const privateSwiperGlossaryTerms = document.querySelectorAll('.private-swiper .glossary-term'); + privateSwiperGlossaryTerms.forEach(function (glossaryTerm) { + var tooltipId = glossaryTerm.getAttribute('data-glossary'); + var tooltip = document.getElementById(tooltipId); + tooltip.style.visibility = 'hidden'; + tooltip.style.opacity = '0'; + const privateSwiper = glossaryTerm.closest('.private-swiper') + if (privateSwiper) glossaryTerm.closest('.card').classList.remove('hovered'); + }) + } + } +}); + +const simplexExplainedSwiper = new Swiper(".simplex-explained-swiper", { + slidesPerView: 1, + spaceBetween: 80, + allowTouchMove: true, + breakpoints: { + 1400: { + allowTouchMove: false, + }, + 1200: { + allowTouchMove: true, + }, + 768: { + allowTouchMove: true, + } + }, + direction: "horizontal", + pagination: { + el: ".simplex-explained-swiper-pagination", + clickable: true + }, + on: { + slideChange: function () { + const explainedSwiperGlossaryTerms = document.querySelectorAll('.simplex-explained-swiper .glossary-term'); + explainedSwiperGlossaryTerms.forEach(function (glossaryTerm) { + var tooltipId = glossaryTerm.getAttribute('data-glossary'); + var tooltip = document.getElementById(tooltipId); + tooltip.style.visibility = 'hidden'; + tooltip.style.opacity = '0'; + }) + } + } +}); + +function closeOverlay(e) { + e.target.closest('.overlay').classList.remove('flex'); + e.target.closest('.overlay').classList.add('hidden'); + document.body.classList.remove('lock-scroll'); + history.replaceState(null, null, ' '); +} + +window.addEventListener('click', clickHandler) + +if (isMobile.iOS) { + for (const btn of document.getElementsByClassName("close-overlay-btn")) { + btn.addEventListener("touchend", (e) => setTimeout(() => closeOverlay(e), 100)) + } +} + +function clickHandler(e) { + if (e.target.closest('.card')) { + e.target.closest('.card').classList.toggle('card-active'); + e.target.closest('.card').classList.toggle('no-hover'); + } + + // ---------------For Overlay-------------------- + else if (e.target.closest('.close-overlay-btn')) { + closeOverlay(e); + } + else if (e.target.closest('.overlay-card')) { + return; + } + else if (e.target.closest('.overlay')) { + closeOverlay(e); + } + else if (e.target.closest('.open-overlay-btn')) { + let id = e.target.closest('.open-overlay-btn').dataset.showOverlay; + window.location.hash = id; + } + // ----------------------------------------------- + // ---------- For Contact & Invitation Page tabs + else if (e.target.closest('.contact-tab-btn')) { + e.target.closest('.contact-tab').classList.toggle('active') + } +} + +window.addEventListener('load', () => { + const googlePlayBtn = document.querySelector('.google-play-btn'); + const appleStoreBtn = document.querySelector('.apple-store-btn'); + const fDroidBtn = document.querySelector('.f-droid-btn'); + if (!googlePlayBtn || !appleStoreBtn || !fDroidBtn) return; + + + if (isMobile.Android()) { + googlePlayBtn.classList.remove('hidden'); + fDroidBtn.classList.remove('hidden'); + } + else if (isMobile.iOS()) { + appleStoreBtn.classList.remove('hidden'); + } + else { + appleStoreBtn.classList.remove('hidden'); + googlePlayBtn.classList.remove('hidden'); + fDroidBtn.classList.remove('hidden'); + } +}) + +function openOverlay() { + let hash = window.location.hash + if (hash) { + const id = hash.split('#')[1]; + const el = document.getElementById(id) + if (el.classList.contains('overlay')) { + const scrollTo = el.getAttribute('data-scroll-to') + if (scrollTo) { + const scrollToEl = document.getElementById(scrollTo) + if (scrollToEl) scrollToEl.scrollIntoView(true) + } + + const currentOpenedGlossaryOverlay = document.querySelector('.glossary-overlay.flex') + if (currentOpenedGlossaryOverlay) { + currentOpenedGlossaryOverlay.classList.remove('flex') + currentOpenedGlossaryOverlay.classList.add('hidden') + } + + el.classList.remove('hidden') + el.classList.add('flex') + document.body.classList.add('lock-scroll') + } + } +} + +function updatePointerEventsInPrivateSwiperCards() { + var privateSwiperCards = document.querySelectorAll('.private-swiper .card') + + privateSwiperCards.forEach(function (card) { + var cardContent = card.querySelector('.card-content') + + function updatePointerEvents() { + var cardContentGlossaryTerms = cardContent.querySelectorAll('.glossary-term') + cardContentGlossaryTerms.forEach(function (glossaryTerm) { + if (cardContent.offsetHeight >= 270) { + glossaryTerm.style.pointerEvents = 'all' + } else { + glossaryTerm.style.pointerEvents = 'none' + } + }) + } + updatePointerEvents() + + cardContent.addEventListener('click', updatePointerEvents) + cardContent.addEventListener('mousemove', updatePointerEvents) + }) +} + +function updateTooltipPosition(glossaryTerm, tooltip) { + var glossaryTermOffset = glossaryTerm.getBoundingClientRect() + var tooltipOffset = tooltip.getBoundingClientRect() + + if (glossaryTermOffset.top >= tooltipOffset.height) { + tooltip.style.top = glossaryTermOffset.top - tooltipOffset.height + 'px' + } else { + tooltip.style.top = glossaryTermOffset.bottom + 'px' + } + + var leftPosition = glossaryTermOffset.left + glossaryTerm.offsetWidth / 2 - tooltip.offsetWidth / 2 + if (leftPosition < 0) { + tooltip.style.left = '0px' + } else if (leftPosition + tooltip.offsetWidth > window.innerWidth) { + tooltip.style.left = window.innerWidth - tooltip.offsetWidth + 'px' + } else { + tooltip.style.left = leftPosition + 'px' + } +} + +function setupTooltip(glossaryTerm) { + var tooltipId = glossaryTerm.getAttribute('data-glossary') + var tooltip = document.getElementById(tooltipId) + + function showTooltip() { + tooltip.style.visibility = 'visible' + tooltip.style.opacity = '1' + updateTooltipPosition(glossaryTerm, tooltip) + const privateSwiper = glossaryTerm.closest('.private-swiper') + if (privateSwiper) glossaryTerm.closest('.card').classList.add('hovered') + } + + function hideTooltip() { + tooltip.style.visibility = 'hidden' + tooltip.style.opacity = '0' + const privateSwiper = glossaryTerm.closest('.private-swiper') + if (privateSwiper) glossaryTerm.closest('.card').classList.remove('hovered') + if (!glossaryTerm.matches(':hover') && !tooltip.matches(':hover')) { + glossaryTerm.classList.remove('active-term') + tooltip.removeEventListener('mouseover', showTooltip) + tooltip.removeEventListener('mouseout', hideTooltip) + } + } + + let click = 0 + glossaryTerm.addEventListener('mouseover', () => { + glossaryTerm.classList.add('active-term') + showTooltip() + tooltip.addEventListener('mouseover', showTooltip) + tooltip.addEventListener('mouseout', hideTooltip) + }) + glossaryTerm.addEventListener('mouseout', function (event) { + click = 0 + hideTooltip() + }) + glossaryTerm.addEventListener('click', function (event) { + event.stopPropagation() + if (click == 1) { + hideTooltip() + click = 0 + } + else { + showTooltip() + click = 1 + } + }) +} + +window.addEventListener('load', () => { + openOverlay() + updatePointerEventsInPrivateSwiperCards() + + window.addEventListener('scroll', function () { + let activeTerm = document.querySelector('.active-term') + if (activeTerm) { + var tooltipId = activeTerm.getAttribute('data-glossary') + var tooltip = document.getElementById(tooltipId) + updateTooltipPosition(activeTerm, tooltip) + } + }) + + const glossaryTerms = document.querySelectorAll('.glossary-term') + glossaryTerms.forEach(setupTooltip) +}) +window.addEventListener('hashchange', openOverlay) diff --git a/js/swiper-bundle.min.js b/js/swiper-bundle.min.js new file mode 100644 index 0000000000..0c347e3e06 --- /dev/null +++ b/js/swiper-bundle.min.js @@ -0,0 +1,14 @@ +/** + * Swiper 8.4.3 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2022 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 6, 2022 + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Swiper=t()}(this,(function(){"use strict";function e(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function t(s,a){void 0===s&&(s={}),void 0===a&&(a={}),Object.keys(a).forEach((i=>{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])}))}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}class n extends Array{constructor(e){"number"==typeof e?super(e):(super(...e||[]),function(e){const t=e.__proto__;Object.defineProperty(e,"__proto__",{get:()=>t,set(e){t.__proto__=e}})}(this))}}function l(e){void 0===e&&(e=[]);const t=[];return e.forEach((e=>{Array.isArray(e)?t.push(...l(e)):t.push(e)})),t}function o(e,t){return Array.prototype.filter.call(e,t)}function d(e,t){const s=r(),i=a();let l=[];if(!t&&e instanceof n)return e;if(!e)return new n(l);if("string"==typeof e){const s=e.trim();if(s.indexOf("<")>=0&&s.indexOf(">")>=0){let e="div";0===s.indexOf("e.split(" "))));return this.forEach((e=>{e.classList.add(...a)})),this},removeClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));return this.forEach((e=>{e.classList.remove(...a)})),this},hasClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));return o(this,(e=>a.filter((t=>e.classList.contains(t))).length>0)).length>0},toggleClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));this.forEach((e=>{a.forEach((t=>{e.classList.toggle(t)}))}))},attr:function(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(let s=0;s=0;e-=1){const i=a[e];r&&i.listener===r||r&&i.listener&&i.listener.dom7proxy&&i.listener.dom7proxy===r?(s.removeEventListener(t,i.proxyListener,n),a.splice(e,1)):r||(s.removeEventListener(t,i.proxyListener,n),a.splice(e,1))}}}return this},trigger:function(){const e=r();for(var t=arguments.length,s=new Array(t),a=0;at>0)),i.dispatchEvent(t),i.dom7EventData=[],delete i.dom7EventData}}}return this},transitionEnd:function(e){const t=this;return e&&t.on("transitionend",(function s(a){a.target===this&&(e.call(this,a),t.off("transitionend",s))})),this},outerWidth:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetWidth+parseFloat(e.getPropertyValue("margin-right"))+parseFloat(e.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetHeight+parseFloat(e.getPropertyValue("margin-top"))+parseFloat(e.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){const e=r();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){const e=r(),t=a(),s=this[0],i=s.getBoundingClientRect(),n=t.body,l=s.clientTop||n.clientTop||0,o=s.clientLeft||n.clientLeft||0,d=s===e?e.scrollY:s.scrollTop,c=s===e?e.scrollX:s.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}return null},css:function(e,t){const s=r();let a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a{e.apply(t,[t,s])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(let t=0;tt-1)return d([]);if(e<0){const s=t+e;return d(s<0?[]:[this[s]])}return d([this[e]])},append:function(){let e;const t=a();for(let s=0;s=0;i-=1)this[s].insertBefore(a.childNodes[i],this[s].childNodes[0])}else if(e instanceof n)for(i=0;i0?e?this[0].nextElementSibling&&d(this[0].nextElementSibling).is(e)?d([this[0].nextElementSibling]):d([]):this[0].nextElementSibling?d([this[0].nextElementSibling]):d([]):d([])},nextAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.nextElementSibling;){const a=s.nextElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},prev:function(e){if(this.length>0){const t=this[0];return e?t.previousElementSibling&&d(t.previousElementSibling).is(e)?d([t.previousElementSibling]):d([]):t.previousElementSibling?d([t.previousElementSibling]):d([])}return d([])},prevAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.previousElementSibling;){const a=s.previousElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},parent:function(e){const t=[];for(let s=0;s6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function m(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function f(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function g(){const e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"];for(let s=1;st.indexOf(e)<0));for(let t=0,i=s.length;tn?"next":"prev",p=(e,t)=>"next"===c&&e>=t||"prev"===c&&e<=t,u=()=>{l=(new Date).getTime(),null===o&&(o=l);const e=Math.max(Math.min((l-o)/d,1),0),r=.5-Math.cos(e*Math.PI)/2;let c=n+r*(s-n);if(p(c,s)&&(c=s),t.wrapperEl.scrollTo({[a]:c}),p(c,s))return t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.scrollSnapType="",setTimeout((()=>{t.wrapperEl.style.overflow="",t.wrapperEl.scrollTo({[a]:c})})),void i.cancelAnimationFrame(t.cssModeFrameID);t.cssModeFrameID=i.requestAnimationFrame(u)};u()}let b,x,y;function E(){return b||(b=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),passiveListener:function(){let t=!1;try{const s=Object.defineProperty({},"passive",{get(){t=!0}});e.addEventListener("testPassiveListener",null,s)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),b}function C(e){return void 0===e&&(e={}),x||(x=function(e){let{userAgent:t}=void 0===e?{}:e;const s=E(),a=r(),i=a.navigator.platform,n=t||a.navigator.userAgent,l={ios:!1,android:!1},o=a.screen.width,d=a.screen.height,c=n.match(/(Android);?[\s\/]+([\d.]+)?/);let p=n.match(/(iPad).*OS\s([\d_]+)/);const u=n.match(/(iPod)(.*OS\s([\d_]+))?/),h=!p&&n.match(/(iPhone\sOS|iOS)\s([\d_]+)/),m="Win32"===i;let f="MacIntel"===i;return!p&&f&&s.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${o}x${d}`)>=0&&(p=n.match(/(Version)\/([\d.]+)/),p||(p=[0,1,"13_0_0"]),f=!1),c&&!m&&(l.os="android",l.android=!0),(p||h||u)&&(l.os="ios",l.ios=!0),l}(e)),x}function T(){return y||(y=function(){const e=r();return{isSafari:function(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}(),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent)}}()),y}Object.keys(c).forEach((e=>{Object.defineProperty(d.fn,e,{value:c[e],writable:!0})}));var $={on(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;function i(){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy;for(var s=arguments.length,r=new Array(s),n=0;n=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(){const e=this;if(!e.eventsListeners||e.destroyed)return e;if(!e.eventsListeners)return e;let t,s,a;for(var i=arguments.length,r=new Array(i),n=0;n{e.eventsAnyListeners&&e.eventsAnyListeners.length&&e.eventsAnyListeners.forEach((e=>{e.apply(a,[t,...s])})),e.eventsListeners&&e.eventsListeners[t]&&e.eventsListeners[t].forEach((e=>{e.apply(a,s)}))})),e}};var S={updateSize:function(){const e=this;let t,s;const a=e.$el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a[0].clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a[0].clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(a.css("padding-left")||0,10)-parseInt(a.css("padding-right")||0,10),s=s-parseInt(a.css("padding-top")||0,10)-parseInt(a.css("padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function s(e,s){return parseFloat(e.getPropertyValue(t(s))||0)}const a=e.params,{$wrapperEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&a.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=i.children(`.${e.params.slideClass}`),p=o?e.virtual.slides.length:c.length;let u=[];const h=[],m=[];let f=a.slidesOffsetBefore;"function"==typeof f&&(f=a.slidesOffsetBefore.call(e));let g=a.slidesOffsetAfter;"function"==typeof g&&(g=a.slidesOffsetAfter.call(e));const w=e.snapGrid.length,b=e.slidesGrid.length;let x=a.spaceBetween,y=-f,E=0,C=0;if(void 0===r)return;"string"==typeof x&&x.indexOf("%")>=0&&(x=parseFloat(x.replace("%",""))/100*r),e.virtualSize=-x,n?c.css({marginLeft:"",marginBottom:"",marginTop:""}):c.css({marginRight:"",marginBottom:"",marginTop:""}),a.centeredSlides&&a.cssMode&&(v(e.wrapperEl,"--swiper-centered-offset-before",""),v(e.wrapperEl,"--swiper-centered-offset-after",""));const T=a.grid&&a.grid.rows>1&&e.grid;let $;T&&e.grid.initSlides(p);const S="auto"===a.slidesPerView&&a.breakpoints&&Object.keys(a.breakpoints).filter((e=>void 0!==a.breakpoints[e].slidesPerView)).length>0;for(let i=0;i1&&u.push(e.virtualSize-r)}if(0===u.length&&(u=[0]),0!==a.spaceBetween){const s=e.isHorizontal()&&n?"marginLeft":t("marginRight");c.filter(((e,t)=>!a.cssMode||t!==c.length-1)).css({[s]:`${x}px`})}if(a.centeredSlides&&a.centeredSlidesBounds){let e=0;m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween;const t=e-r;u=u.map((e=>e<0?-f:e>t?t+g:e))}if(a.centerInsufficientSlides){let e=0;if(m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween,e{u[s]=e-t})),h.forEach(((e,s)=>{h[s]=e+t}))}}if(Object.assign(e,{slides:c,snapGrid:u,slidesGrid:h,slidesSizesGrid:m}),a.centeredSlides&&a.cssMode&&!a.centeredSlidesBounds){v(e.wrapperEl,"--swiper-centered-offset-before",-u[0]+"px"),v(e.wrapperEl,"--swiper-centered-offset-after",e.size/2-m[m.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}if(p!==d&&e.emit("slidesLengthChange"),u.length!==w&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),a.watchSlidesProgress&&e.updateSlidesOffset(),!(o||a.cssMode||"slide"!==a.effect&&"fade"!==a.effect)){const t=`${a.containerModifierClass}backface-hidden`,s=e.$el.hasClass(t);p<=a.maxBackfaceHiddenSlides?s||e.$el.addClass(t):s&&e.$el.removeClass(t)}},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides.filter((t=>parseInt(t.getAttribute("data-swiper-slide-index"),10)===e))[0]:t.slides.eq(e)[0];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||d([])).each((e=>{s.push(e)}));else for(i=0;it.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;ir?e:r}(r||0===r)&&t.$wrapperEl.css("height",`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides;for(let s=0;s=0&&p1&&u<=t.size||p<=0&&u>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(e),a.eq(e).addClass(s.slideVisibleClass)),l.progress=i?-d:d,l.originalProgress=i?-c:c}t.visibleSlides=d(t.visibleSlides)},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n}=t;const l=r,o=n;0===a?(i=0,r=!0,n=!0):(i=(e-t.minTranslate())/a,r=i<=0,n=i>=1),Object.assign(t,{progress:i,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!l&&t.emit("reachBeginning toEdge"),n&&!o&&t.emit("reachEnd toEdge"),(l&&!r||o&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,$wrapperEl:a,activeIndex:i,realIndex:r}=e,n=e.virtual&&s.virtual.enabled;let l;t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`),l=n?e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`):t.eq(i),l.addClass(s.slideActiveClass),s.loop&&(l.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass));let o=l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass);s.loop&&0===o.length&&(o=t.eq(0),o.addClass(s.slideNextClass));let d=l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass);s.loop&&0===d.length&&(d=t.eq(-1),d.addClass(s.slidePrevClass)),s.loop&&(o.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass),d.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{slidesGrid:a,snapGrid:i,params:r,activeIndex:n,realIndex:l,snapIndex:o}=t;let d,c=e;if(void 0===c){for(let e=0;e=a[e]&&s=a[e]&&s=a[e]&&(c=e);r.normalizeSlideIndex&&(c<0||void 0===c)&&(c=0)}if(i.indexOf(s)>=0)d=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,c);d=e+Math.floor((c-e)/r.slidesPerGroup)}if(d>=i.length&&(d=i.length-1),c===n)return void(d!==o&&(t.snapIndex=d,t.emit("snapIndexChange")));const p=parseInt(t.slides.eq(c).attr("data-swiper-slide-index")||c,10);Object.assign(t,{snapIndex:d,realIndex:p,previousIndex:n,activeIndex:c}),t.emit("activeIndexChange"),t.emit("snapIndexChange"),l!==p&&t.emit("realIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&t.emit("slideChange")},updateClickedSlide:function(e){const t=this,s=t.params,a=d(e).closest(`.${s.slideClass}`)[0];let i,r=!1;if(a)for(let e=0;eo?o:a&&en?"next":r=o.length&&(g=o.length-1);const v=-o[g];if(l.normalizeSlideIndex)for(let e=0;e=s&&t=s&&t=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&vr.translate&&v>r.maxTranslate()&&(p||0)!==n)return!1}let b;if(n!==(c||0)&&s&&r.emit("beforeSlideChangeStart"),r.updateProgress(v),b=n>p?"next":n{r.wrapperEl.style.scrollSnapType="",r._swiperImmediateVirtual=!1}))}else{if(!r.support.smoothScroll)return w({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return r.setTransition(t),r.setTranslate(v),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),0===t?r.transitionEnd(s,b):r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.$wrapperEl[0].addEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e,t,s,a){if(void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===s&&(s=!0),"string"==typeof e){const t=parseInt(e,10);if(!isFinite(t))throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`);e=t}const i=this;let r=e;return i.params.loop&&(r+=i.loopedSlides),i.slideTo(r,t,s,a)},slideNext:function(e,t,s){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);const a=this,{animating:i,enabled:r,params:n}=a;if(!r)return a;let l=n.slidesPerGroup;"auto"===n.slidesPerView&&1===n.slidesPerGroup&&n.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndexc(e)));let h=n[u.indexOf(p)-1];if(void 0===h&&i.cssMode){let e;n.forEach(((t,s)=>{p>=t&&(e=s)})),void 0!==e&&(h=n[e>0?e-1:e])}let m=0;if(void 0!==h&&(m=l.indexOf(h),m<0&&(m=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(m=m-a.slidesPerViewDynamic("previous",!0)+1,m=Math.max(m,0))),i.rewind&&a.isBeginning){const i=a.params.virtual&&a.params.virtual.enabled&&a.virtual?a.virtual.slides.length-1:a.slides.length-1;return a.slideTo(i,e,t,s)}return a.slideTo(m,e,t,s)},slideReset:function(e,t,s){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,s)},slideToClosest:function(e,t,s,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===a&&(a=.5);const i=this;let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this,{params:t,$wrapperEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;if(t.loop){if(e.animating)return;i=parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10),t.centeredSlides?re.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}};var z={loopCreate:function(){const e=this,t=a(),{params:s,$wrapperEl:i}=e,r=i.children().length>0?d(i.children()[0].parentNode):i;r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove();let n=r.children(`.${s.slideClass}`);if(s.loopFillGroupWithBlank){const e=s.slidesPerGroup-n.length%s.slidesPerGroup;if(e!==s.slidesPerGroup){for(let a=0;an.length&&e.params.loopedSlidesLimit&&(e.loopedSlides=n.length);const l=[],o=[];n.each(((e,t)=>{d(e).attr("data-swiper-slide-index",t)}));for(let t=0;t=0;e-=1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass))},loopFix:function(){const e=this;e.emit("beforeLoopFix");const{activeIndex:t,slides:s,loopedSlides:a,allowSlidePrev:i,allowSlideNext:r,snapGrid:n,rtlTranslate:l}=e;let o;e.allowSlidePrev=!0,e.allowSlideNext=!0;const d=-n[t]-e.getTranslate();if(t=s.length-a){o=-s.length+t+a,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}e.allowSlidePrev=i,e.allowSlideNext=r,e.emit("loopFix")},loopDestroy:function(){const{$wrapperEl:e,params:t,slides:s}=this;e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(),s.removeAttr("data-swiper-slide-index")}};function L(e){const t=this,s=a(),i=r(),n=t.touchEventsData,{params:l,touches:o,enabled:c}=t;if(!c)return;if(t.animating&&l.preventInteractionOnTransition)return;!t.animating&&l.cssMode&&l.loop&&t.loopFix();let p=e;p.originalEvent&&(p=p.originalEvent);let h=d(p.target);if("wrapper"===l.touchEventsTarget&&!h.closest(t.wrapperEl).length)return;if(n.isTouchEvent="touchstart"===p.type,!n.isTouchEvent&&"which"in p&&3===p.which)return;if(!n.isTouchEvent&&"button"in p&&p.button>0)return;if(n.isTouched&&n.isMoved)return;const m=!!l.noSwipingClass&&""!==l.noSwipingClass,f=e.composedPath?e.composedPath():e.path;m&&p.target&&p.target.shadowRoot&&f&&(h=d(f[0]));const g=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,v=!(!p.target||!p.target.shadowRoot);if(l.noSwiping&&(v?function(e,t){return void 0===t&&(t=this),function t(s){if(!s||s===a()||s===r())return null;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(e);return i||s.getRootNode?i||t(s.getRootNode().host):null}(t)}(g,h[0]):h.closest(g)[0]))return void(t.allowClick=!0);if(l.swipeHandler&&!h.closest(l.swipeHandler)[0])return;o.currentX="touchstart"===p.type?p.targetTouches[0].pageX:p.pageX,o.currentY="touchstart"===p.type?p.targetTouches[0].pageY:p.pageY;const w=o.currentX,b=o.currentY,x=l.edgeSwipeDetection||l.iOSEdgeSwipeDetection,y=l.edgeSwipeThreshold||l.iOSEdgeSwipeThreshold;if(x&&(w<=y||w>=i.innerWidth-y)){if("prevent"!==x)return;e.preventDefault()}if(Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=w,o.startY=b,n.touchStartTime=u(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1),"touchstart"!==p.type){let e=!0;h.is(n.focusableElements)&&(e=!1,"SELECT"===h[0].nodeName&&(n.isTouched=!1)),s.activeElement&&d(s.activeElement).is(n.focusableElements)&&s.activeElement!==h[0]&&s.activeElement.blur();const a=e&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!a||h[0].isContentEditable||p.preventDefault()}t.params.freeMode&&t.params.freeMode.enabled&&t.freeMode&&t.animating&&!l.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",p)}function O(e){const t=a(),s=this,i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:o}=s;if(!o)return;let c=e;if(c.originalEvent&&(c=c.originalEvent),!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",c));if(i.isTouchEvent&&"touchmove"!==c.type)return;const p="touchmove"===c.type&&c.targetTouches&&(c.targetTouches[0]||c.changedTouches[0]),h="touchmove"===c.type?p.pageX:c.pageX,m="touchmove"===c.type?p.pageY:c.pageY;if(c.preventedByNestedSwiper)return n.startX=h,void(n.startY=m);if(!s.allowTouchMove)return d(c.target).is(i.focusableElements)||(s.allowClick=!1),void(i.isTouched&&(Object.assign(n,{startX:h,startY:m,currentX:h,currentY:m}),i.touchStartTime=u()));if(i.isTouchEvent&&r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(mn.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(hn.startX&&s.translate>=s.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&c.target===t.activeElement&&d(c.target).is(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);if(i.allowTouchCallbacks&&s.emit("touchMove",c),c.targetTouches&&c.targetTouches.length>1)return;n.currentX=h,n.currentY=m;const f=n.currentX-n.startX,g=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(f**2+g**2)=25&&(e=180*Math.atan2(Math.abs(g),Math.abs(f))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",c),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&c.cancelable&&c.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&c.stopPropagation(),i.isMoved||(r.loop&&!r.cssMode&&s.loopFix(),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating&&s.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",c)),s.emit("sliderMove",c),i.isMoved=!0;let v=s.isHorizontal()?f:g;n.diff=v,v*=r.touchRatio,l&&(v=-v),s.swipeDirection=v>0?"prev":"next",i.currentTranslate=v+i.startTranslate;let w=!0,b=r.resistanceRatio;if(r.touchReleaseOnEdges&&(b=0),v>0&&i.currentTranslate>s.minTranslate()?(w=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+v)**b)):v<0&&i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(v)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),s.params.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function I(e){const t=this,s=t.touchEventsData,{params:a,touches:i,rtlTranslate:r,slidesGrid:n,enabled:l}=t;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),s.allowTouchCallbacks&&t.emit("touchEnd",o),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&a.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);a.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const d=u(),c=d-s.touchStartTime;if(t.allowClick){const e=o.path||o.composedPath&&o.composedPath();t.updateClickedSlide(e&&e[0]||o.target),t.emit("tap click",o),c<300&&d-s.lastClickTime<300&&t.emit("doubleTap doubleClick",o)}if(s.lastClickTime=u(),p((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===i.diff||s.currentTranslate===s.startTranslate)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=a.followFinger?r?t.translate:-t.translate:-s.currentTranslate,a.cssMode)return;if(t.params.freeMode&&a.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});let m=0,f=t.slidesSizesGrid[0];for(let e=0;e=n[e]&&h=n[e]&&(m=e,f=n[n.length-1]-n[n.length-2])}let g=null,v=null;a.rewind&&(t.isBeginning?v=t.params.virtual&&t.params.virtual.enabled&&t.virtual?t.virtual.slides.length-1:t.slides.length-1:t.isEnd&&(g=0));const w=(h-n[m])/f,b=ma.longSwipesMs){if(!a.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(w>=a.longSwipesRatio?t.slideTo(a.rewind&&t.isEnd?g:m+b):t.slideTo(m)),"prev"===t.swipeDirection&&(w>1-a.longSwipesRatio?t.slideTo(m+b):null!==v&&w<0&&Math.abs(w)>a.longSwipesRatio?t.slideTo(v):t.slideTo(m))}else{if(!a.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(o.target===t.navigation.nextEl||o.target===t.navigation.prevEl)?o.target===t.navigation.nextEl?t.slideTo(m+b):t.slideTo(m):("next"===t.swipeDirection&&t.slideTo(null!==g?g:m+b),"prev"===t.swipeDirection&&t.slideTo(null!==v?v:m))}}function A(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function D(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function G(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}let N=!1;function B(){}const H=(e,t)=>{const s=a(),{params:i,touchEvents:r,el:n,wrapperEl:l,device:o,support:d}=e,c=!!i.nested,p="on"===t?"addEventListener":"removeEventListener",u=t;if(d.touch){const t=!("touchstart"!==r.start||!d.passiveListener||!i.passiveListeners)&&{passive:!0,capture:!1};n[p](r.start,e.onTouchStart,t),n[p](r.move,e.onTouchMove,d.passiveListener?{passive:!1,capture:c}:c),n[p](r.end,e.onTouchEnd,t),r.cancel&&n[p](r.cancel,e.onTouchEnd,t)}else n[p](r.start,e.onTouchStart,!1),s[p](r.move,e.onTouchMove,c),s[p](r.end,e.onTouchEnd,!1);(i.preventClicks||i.preventClicksPropagation)&&n[p]("click",e.onClick,!0),i.cssMode&&l[p]("scroll",e.onScroll),i.updateOnWindowResize?e[u](o.ios||o.android?"resize orientationchange observerUpdate":"resize observerUpdate",A,!0):e[u]("observerUpdate",A,!0)};var X={attachEvents:function(){const e=this,t=a(),{params:s,support:i}=e;e.onTouchStart=L.bind(e),e.onTouchMove=O.bind(e),e.onTouchEnd=I.bind(e),s.cssMode&&(e.onScroll=G.bind(e)),e.onClick=D.bind(e),i.touch&&!N&&(t.addEventListener("touchstart",B),N=!0),H(e,"on")},detachEvents:function(){H(this,"off")}};const Y=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var R={addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,$el:i,device:r,support:n}=e,l=function(e,t){const s=[];return e.forEach((e=>{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}(["initialized",s.direction,{"pointer-events":!n.touch},{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...l),i.addClass([...t].join(" ")),e.emitContainerClasses()},removeClasses:function(){const{$el:e,classNames:t}=this;e.removeClass(t.join(" ")),this.emitContainerClasses()}};var W={init:!0,direction:"horizontal",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopedSlidesLimit:!0,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1};function q(e,t){return function(s){void 0===s&&(s={});const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(["navigation","pagination","scrollbar"].indexOf(a)>=0&&!0===e[a]&&(e[a]={auto:!0}),a in e&&"enabled"in i?(!0===e[a]&&(e[a]={enabled:!0}),"object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),g(t,s)):g(t,s)):g(t,s)}}const j={eventsEmitter:$,update:S,translate:M,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||s.$wrapperEl.transition(e),s.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;a.cssMode||(a.autoHeight&&s.updateAutoHeight(),P({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;s.animating=!1,a.cssMode||(s.setTransition(0),P({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:k,loop:z,grabCursor:{setGrabCursor:function(e){const t=this;if(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;s.style.cursor="move",s.style.cursor=e?"grabbing":"grab"},unsetGrabCursor:function(){const e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="")}},events:X,breakpoints:{setBreakpoint:function(){const e=this,{activeIndex:t,initialized:s,loopedSlides:a=0,params:i,$el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;const l=e.getBreakpoint(n,e.params.breakpointsBase,e.el);if(!l||e.currentBreakpoint===l)return;const o=(l in n?n[l]:void 0)||e.originalParams,d=Y(e,i),c=Y(e,o),p=i.enabled;d&&!c?(r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!d&&c&&(r.addClass(`${i.containerModifierClass}grid`),(o.grid.fill&&"column"===o.grid.fill||!o.grid.fill&&"column"===i.grid.fill)&&r.addClass(`${i.containerModifierClass}grid-column`),e.emitContainerClasses()),["navigation","pagination","scrollbar"].forEach((t=>{const s=i[t]&&i[t].enabled,a=o[t]&&o[t].enabled;s&&!a&&e[t].disable(),!s&&a&&e[t].enable()}));const u=o.direction&&o.direction!==i.direction,h=i.loop&&(o.slidesPerView!==i.slidesPerView||u);u&&s&&e.changeDirection(),g(e.params,o);const m=e.params.enabled;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),p&&!m?e.disable():!p&&m&&e.enable(),e.currentBreakpoint=l,e.emit("_beforeBreakpoint",o),h&&s&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-a+e.loopedSlides,0,!1)),e.emit("breakpoint",o)},getBreakpoint:function(e,t,s){if(void 0===t&&(t="window"),!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}}));l.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;es}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:R,images:{loadImage:function(e,t,s,a,i,n){const l=r();let o;function c(){n&&n()}d(e).parent("picture")[0]||e.complete&&i?c():t?(o=new l.Image,o.onload=c,o.onerror=c,a&&(o.sizes=a),s&&(o.srcset=s),t&&(o.src=t)):c()},preloadImages:function(){const e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(let s=0;s1){const e=[];return d(t.el).each((s=>{const a=g({},t,{el:s});e.push(new V(a))})),e}const r=this;r.__swiper__=!0,r.support=E(),r.device=C({userAgent:t.userAgent}),r.browser=T(),r.eventsListeners={},r.eventsAnyListeners=[],r.modules=[...r.__modules__],t.modules&&Array.isArray(t.modules)&&r.modules.push(...t.modules);const n={};r.modules.forEach((e=>{e({swiper:r,extendParams:q(t,n),on:r.on.bind(r),once:r.once.bind(r),off:r.off.bind(r),emit:r.emit.bind(r)})}));const l=g({},W,n);return r.params=g({},l,_,t),r.originalParams=g({},r.params),r.passedParams=g({},t),r.params&&r.params.on&&Object.keys(r.params.on).forEach((e=>{r.on(e,r.params.on[e])})),r.params&&r.params.onAny&&r.onAny(r.params.onAny),r.$=d,Object.assign(r,{enabled:r.params.enabled,el:e,classNames:[],slides:d(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===r.params.direction,isVertical:()=>"vertical"===r.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:r.params.allowSlideNext,allowSlidePrev:r.params.allowSlidePrev,touchEvents:function(){const e=["touchstart","touchmove","touchend","touchcancel"],t=["pointerdown","pointermove","pointerup"];return r.touchEventsTouch={start:e[0],move:e[1],end:e[2],cancel:e[3]},r.touchEventsDesktop={start:t[0],move:t[1],end:t[2]},r.support.touch||!r.params.simulateTouch?r.touchEventsTouch:r.touchEventsDesktop}(),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:r.params.focusableElements,lastClickTime:u(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:r.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),r.emit("_swiper"),r.params.init&&r.init(),r}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return t.destroyed?"":e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.each((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e,t){void 0===e&&(e="current"),void 0===t&&(t=!1);const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if(s.centeredSlides){let e,t=a[l].swiperSlideSize;for(let s=l+1;sn&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e=0;e-=1){i[l]-i[e]1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),i||a()),s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t){void 0===t&&(t=!0);const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.each((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.$el.addClass(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.$el.removeClass(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;const s=d(e||t.params.el);if(!(e=s[0]))return!1;e.swiper=t;const i=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let r=(()=>{if(e&&e.shadowRoot&&e.shadowRoot.querySelector){const t=d(e.shadowRoot.querySelector(i()));return t.children=e=>s.children(e),t}return s.children?s.children(i()):d(s).children(i())})();if(0===r.length&&t.params.createElements){const e=a().createElement("div");r=d(e),e.className=t.params.wrapperClass,s.append(e),s.children(`.${t.params.slideClass}`).each((e=>{r.append(e)}))}return Object.assign(t,{$el:s,el:e,$wrapperEl:r,wrapperEl:r[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction")),wrongRTL:"-webkit-box"===r.css("display")}),!0}init(e){const t=this;if(t.initialized)return t;return!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t}destroy(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);const s=this,{params:a,$el:i,$wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([a.slideVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.$el[0].swiper=null,function(e){const t=e;Object.keys(t).forEach((e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}(s)),s.destroyed=!0),null}static extendDefaults(e){g(_,e)}static get extendedDefaults(){return _}static get defaults(){return W}static installModule(e){V.prototype.__modules__||(V.prototype.__modules__=[]);const t=V.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>V.installModule(e))),V):(V.installModule(e),V)}}function F(e,t,s,i){const r=a();return e.params.createElements&&Object.keys(i).forEach((a=>{if(!s[a]&&!0===s.auto){let n=e.$el.children(`.${i[a]}`)[0];n||(n=r.createElement("div"),n.className=i[a],e.$el.append(n)),s[a]=n,t[a]=n}})),s}function U(e){return void 0===e&&(e=""),`.${e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}`}function K(e){const t=this,{$wrapperEl:s,params:a}=t;if(a.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(let t=0;t=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides.eq(t);e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;ee?n+t.length:n}else a.append(t);for(let e=0;e{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)})),a("transitionEnd",(()=>{if(s.params.effect===t&&o){if(!d||!d().slideShadows)return;s.slides.each((e=>{s.$(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").remove()})),o()}})),a("virtualUpdate",(()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame((()=>{c&&s.slides&&s.slides.length&&(i(),c=!1)})))}))}function se(e,t){return e.transformEl?t.find(e.transformEl).css({"backface-visibility":"hidden","-webkit-backface-visibility":"hidden"}):t}function ae(e){let{swiper:t,duration:s,transformEl:a,allSlides:i}=e;const{slides:r,activeIndex:n,$wrapperEl:l}=t;if(t.params.virtualTranslate&&0!==s){let e,s=!1;e=i?a?r.find(a):r:a?r.eq(n).find(a):r.eq(n),e.transitionEnd((()=>{if(s)return;if(!t||t.destroyed)return;s=!0,t.animating=!1;const e=["webkitTransitionEnd","transitionend"];for(let t=0;t`),i.append(r)),r}Object.keys(j).forEach((e=>{Object.keys(j[e]).forEach((t=>{V.prototype[t]=j[e][t]}))})),V.use([function(e){let{swiper:t,on:s,emit:a}=e;const i=r();let n=null,l=null;const o=()=>{t&&!t.destroyed&&t.initialized&&(a("beforeResize"),a("resize"))},d=()=>{t&&!t.destroyed&&t.initialized&&a("orientationchange")};s("init",(()=>{t.params.resizeObserver&&void 0!==i.ResizeObserver?t&&!t.destroyed&&t.initialized&&(n=new ResizeObserver((e=>{l=i.requestAnimationFrame((()=>{const{width:s,height:a}=t;let i=s,r=a;e.forEach((e=>{let{contentBoxSize:s,contentRect:a,target:n}=e;n&&n!==t.el||(i=a?a.width:(s[0]||s).inlineSize,r=a?a.height:(s[0]||s).blockSize)})),i===s&&r===a||o()}))})),n.observe(t.el)):(i.addEventListener("resize",o),i.addEventListener("orientationchange",d))})),s("destroy",(()=>{l&&i.cancelAnimationFrame(l),n&&n.unobserve&&t.el&&(n.unobserve(t.el),n=null),i.removeEventListener("resize",o),i.removeEventListener("orientationchange",d)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=[],l=r(),o=function(e,t){void 0===t&&(t={});const s=new(l.MutationObserver||l.WebkitMutationObserver)((e=>{if(1===e.length)return void i("observerUpdate",e[0]);const t=function(){i("observerUpdate",e[0])};l.requestAnimationFrame?l.requestAnimationFrame(t):l.setTimeout(t,0)}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),n.push(s)};s({observer:!1,observeParents:!1,observeSlideChildren:!1}),a("init",(()=>{if(t.params.observer){if(t.params.observeParents){const e=t.$el.parents();for(let t=0;t{n.forEach((e=>{e.disconnect()})),n.splice(0,n.length)}))}]);const re=[function(e){let t,{swiper:s,extendParams:a,on:i,emit:r}=e;function n(e,t){const a=s.params.virtual;if(a.cache&&s.virtual.cache[t])return s.virtual.cache[t];const i=a.renderSlide?d(a.renderSlide.call(s,e,t)):d(`
${e}
`);return i.attr("data-swiper-slide-index")||i.attr("data-swiper-slide-index",t),a.cache&&(s.virtual.cache[t]=i),i}function l(e){const{slidesPerView:t,slidesPerGroup:a,centeredSlides:i}=s.params,{addSlidesBefore:l,addSlidesAfter:o}=s.params.virtual,{from:d,to:c,slides:p,slidesGrid:u,offset:h}=s.virtual;s.params.cssMode||s.updateActiveIndex();const m=s.activeIndex||0;let f,g,v;f=s.rtlTranslate?"right":s.isHorizontal()?"left":"top",i?(g=Math.floor(t/2)+a+o,v=Math.floor(t/2)+a+l):(g=t+(a-1)+o,v=a+l);const w=Math.max((m||0)-v,0),b=Math.min((m||0)+g,p.length-1),x=(s.slidesGrid[w]||0)-(s.slidesGrid[0]||0);function y(){s.updateSlides(),s.updateProgress(),s.updateSlidesClasses(),s.lazy&&s.params.lazy.enabled&&s.lazy.load(),r("virtualUpdate")}if(Object.assign(s.virtual,{from:w,to:b,offset:x,slidesGrid:s.slidesGrid}),d===w&&c===b&&!e)return s.slidesGrid!==u&&x!==h&&s.slides.css(f,`${x}px`),s.updateProgress(),void r("virtualUpdate");if(s.params.virtual.renderExternal)return s.params.virtual.renderExternal.call(s,{offset:x,from:w,to:b,slides:function(){const e=[];for(let t=w;t<=b;t+=1)e.push(p[t]);return e}()}),void(s.params.virtual.renderExternalUpdate?y():r("virtualUpdate"));const E=[],C=[];if(e)s.$wrapperEl.find(`.${s.params.slideClass}`).remove();else for(let e=d;e<=c;e+=1)(eb)&&s.$wrapperEl.find(`.${s.params.slideClass}[data-swiper-slide-index="${e}"]`).remove();for(let t=0;t=w&&t<=b&&(void 0===c||e?C.push(t):(t>c&&C.push(t),t{s.$wrapperEl.append(n(p[e],e))})),E.sort(((e,t)=>t-e)).forEach((e=>{s.$wrapperEl.prepend(n(p[e],e))})),s.$wrapperEl.children(".swiper-slide").css(f,`${x}px`),y()}a({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),s.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]},i("beforeInit",(()=>{s.params.virtual.enabled&&(s.virtual.slides=s.params.virtual.slides,s.classNames.push(`${s.params.containerModifierClass}virtual`),s.params.watchSlidesProgress=!0,s.originalParams.watchSlidesProgress=!0,s.params.initialSlide||l())})),i("setTranslate",(()=>{s.params.virtual.enabled&&(s.params.cssMode&&!s._immediateVirtual?(clearTimeout(t),t=setTimeout((()=>{l()}),100)):l())})),i("init update resize",(()=>{s.params.virtual.enabled&&s.params.cssMode&&v(s.wrapperEl,"--swiper-virtual-size",`${s.virtualSize}px`)})),Object.assign(s.virtual,{appendSlide:function(e){if("object"==typeof e&&"length"in e)for(let t=0;t{const a=e[s],r=a.attr("data-swiper-slide-index");r&&a.attr("data-swiper-slide-index",parseInt(r,10)+i),t[parseInt(s,10)+i]=a})),s.virtual.cache=t}l(!0),s.slideTo(a,0)},removeSlide:function(e){if(null==e)return;let t=s.activeIndex;if(Array.isArray(e))for(let a=e.length-1;a>=0;a-=1)s.virtual.slides.splice(e[a],1),s.params.virtual.cache&&delete s.virtual.cache[e[a]],e[a]0&&0===t.$el.parents(`.${t.params.slideActiveClass}`).length)return;const a=t.$el,i=a[0].clientWidth,r=a[0].clientHeight,n=o.innerWidth,l=o.innerHeight,d=t.$el.offset();s&&(d.left-=t.$el[0].scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let t=0;t=0&&s[0]<=n&&s[1]>=0&&s[1]<=l){if(0===s[0]&&0===s[1])continue;e=!0}}if(!e)return}t.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&t.slideNext(),((d||p)&&!s||(c||u)&&s)&&t.slidePrev()):((d||c||h||m)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||m)&&t.slideNext(),(d||h)&&t.slidePrev()),n("keyPress",i)}}function p(){t.keyboard.enabled||(d(l).on("keydown",c),t.keyboard.enabled=!0)}function u(){t.keyboard.enabled&&(d(l).off("keydown",c),t.keyboard.enabled=!1)}t.keyboard={enabled:!1},s({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),i("init",(()=>{t.params.keyboard.enabled&&p()})),i("destroy",(()=>{t.keyboard.enabled&&u()})),Object.assign(t.keyboard,{enable:p,disable:u})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();let l;s({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}}),t.mousewheel={enabled:!1};let o,c=u();const h=[];function m(){t.enabled&&(t.mouseEntered=!0)}function f(){t.enabled&&(t.mouseEntered=!1)}function g(e){return!(t.params.mousewheel.thresholdDelta&&e.delta=6&&u()-c<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),i("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),i("scroll",e.raw)),c=(new n.Date).getTime(),!1)))}function v(e){let s=e,a=!0;if(!t.enabled)return;const r=t.params.mousewheel;t.params.cssMode&&s.preventDefault();let n=t.$el;if("container"!==t.params.mousewheel.eventsTarget&&(n=d(t.params.mousewheel.eventsTarget)),!t.mouseEntered&&!n[0].contains(s.target)&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let c=0;const m=t.rtlTranslate?-1:1,f=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(t.isHorizontal()){if(!(Math.abs(f.pixelX)>Math.abs(f.pixelY)))return!0;c=-f.pixelX*m}else{if(!(Math.abs(f.pixelY)>Math.abs(f.pixelX)))return!0;c=-f.pixelY}else c=Math.abs(f.pixelX)>Math.abs(f.pixelY)?-f.pixelX*m:-f.pixelY;if(0===c)return!0;r.invert&&(c=-c);let v=t.getTranslate()+c*r.sensitivity;if(v>=t.minTranslate()&&(v=t.minTranslate()),v<=t.maxTranslate()&&(v=t.maxTranslate()),a=!!t.params.loop||!(v===t.minTranslate()||v===t.maxTranslate()),a&&t.params.nested&&s.stopPropagation(),t.params.freeMode&&t.params.freeMode.enabled){const e={time:u(),delta:Math.abs(c),direction:Math.sign(c)},a=o&&e.time=t.minTranslate()&&(n=t.minTranslate()),n<=t.maxTranslate()&&(n=t.maxTranslate()),t.setTransition(0),t.setTranslate(n),t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses(),(!d&&t.isBeginning||!u&&t.isEnd)&&t.updateSlidesClasses(),t.params.freeMode.sticky){clearTimeout(l),l=void 0,h.length>=15&&h.shift();const s=h.length?h[h.length-1]:void 0,a=h[0];if(h.push(e),s&&(e.delta>s.delta||e.direction!==s.direction))h.splice(0);else if(h.length>=15&&e.time-a.time<500&&a.delta-e.delta>=1&&e.delta<=6){const s=c>0?.8:.2;o=e,h.splice(0),l=p((()=>{t.slideToClosest(t.params.speed,!0,void 0,s)}),0)}l||(l=p((()=>{o=e,h.splice(0),t.slideToClosest(t.params.speed,!0,void 0,.5)}),500))}if(a||i("scroll",s),t.params.autoplay&&t.params.autoplayDisableOnInteraction&&t.autoplay.stop(),n===t.minTranslate()||n===t.maxTranslate())return!0}}else{const s={time:u(),delta:Math.abs(c),direction:Math.sign(c),raw:e};h.length>=2&&h.shift();const a=h.length?h[h.length-1]:void 0;if(h.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&g(s):g(s),function(e){const s=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&s.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function w(e){let s=t.$el;"container"!==t.params.mousewheel.eventsTarget&&(s=d(t.params.mousewheel.eventsTarget)),s[e]("mouseenter",m),s[e]("mouseleave",f),s[e]("wheel",v)}function b(){return t.params.cssMode?(t.wrapperEl.removeEventListener("wheel",v),!0):!t.mousewheel.enabled&&(w("on"),t.mousewheel.enabled=!0,!0)}function x(){return t.params.cssMode?(t.wrapperEl.addEventListener(event,v),!0):!!t.mousewheel.enabled&&(w("off"),t.mousewheel.enabled=!1,!0)}a("init",(()=>{!t.params.mousewheel.enabled&&t.params.cssMode&&x(),t.params.mousewheel.enabled&&b()})),a("destroy",(()=>{t.params.cssMode&&b(),t.mousewheel.enabled&&x()})),Object.assign(t.mousewheel,{enable:b,disable:x})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;function r(e){let s;return e&&(s=d(e),t.params.uniqueNavElements&&"string"==typeof e&&s.length>1&&1===t.$el.find(e).length&&(s=t.$el.find(e))),s}function n(e,s){const a=t.params.navigation;e&&e.length>0&&(e[s?"addClass":"removeClass"](a.disabledClass),e[0]&&"BUTTON"===e[0].tagName&&(e[0].disabled=s),t.params.watchOverflow&&t.enabled&&e[t.isLocked?"addClass":"removeClass"](a.lockClass))}function l(){if(t.params.loop)return;const{$nextEl:e,$prevEl:s}=t.navigation;n(s,t.isBeginning&&!t.params.rewind),n(e,t.isEnd&&!t.params.rewind)}function o(e){e.preventDefault(),(!t.isBeginning||t.params.loop||t.params.rewind)&&(t.slidePrev(),i("navigationPrev"))}function c(e){e.preventDefault(),(!t.isEnd||t.params.loop||t.params.rewind)&&(t.slideNext(),i("navigationNext"))}function p(){const e=t.params.navigation;if(t.params.navigation=F(t,t.originalParams.navigation,t.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!e.nextEl&&!e.prevEl)return;const s=r(e.nextEl),a=r(e.prevEl);s&&s.length>0&&s.on("click",c),a&&a.length>0&&a.on("click",o),Object.assign(t.navigation,{$nextEl:s,nextEl:s&&s[0],$prevEl:a,prevEl:a&&a[0]}),t.enabled||(s&&s.addClass(e.lockClass),a&&a.addClass(e.lockClass))}function u(){const{$nextEl:e,$prevEl:s}=t.navigation;e&&e.length&&(e.off("click",c),e.removeClass(t.params.navigation.disabledClass)),s&&s.length&&(s.off("click",o),s.removeClass(t.params.navigation.disabledClass))}s({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),t.navigation={nextEl:null,$nextEl:null,prevEl:null,$prevEl:null},a("init",(()=>{!1===t.params.navigation.enabled?h():(p(),l())})),a("toEdge fromEdge lock unlock",(()=>{l()})),a("destroy",(()=>{u()})),a("enable disable",(()=>{const{$nextEl:e,$prevEl:s}=t.navigation;e&&e[t.enabled?"removeClass":"addClass"](t.params.navigation.lockClass),s&&s[t.enabled?"removeClass":"addClass"](t.params.navigation.lockClass)})),a("click",((e,s)=>{const{$nextEl:a,$prevEl:r}=t.navigation,n=s.target;if(t.params.navigation.hideOnClick&&!d(n).is(r)&&!d(n).is(a)){if(t.pagination&&t.params.pagination&&t.params.pagination.clickable&&(t.pagination.el===n||t.pagination.el.contains(n)))return;let e;a?e=a.hasClass(t.params.navigation.hiddenClass):r&&(e=r.hasClass(t.params.navigation.hiddenClass)),i(!0===e?"navigationShow":"navigationHide"),a&&a.toggleClass(t.params.navigation.hiddenClass),r&&r.toggleClass(t.params.navigation.hiddenClass)}}));const h=()=>{t.$el.addClass(t.params.navigation.navigationDisabledClass),u()};Object.assign(t.navigation,{enable:()=>{t.$el.removeClass(t.params.navigation.navigationDisabledClass),p(),l()},disable:h,update:l,init:p,destroy:u})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const r="swiper-pagination";let n;s({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${r}-bullet`,bulletActiveClass:`${r}-bullet-active`,modifierClass:`${r}-`,currentClass:`${r}-current`,totalClass:`${r}-total`,hiddenClass:`${r}-hidden`,progressbarFillClass:`${r}-progressbar-fill`,progressbarOppositeClass:`${r}-progressbar-opposite`,clickableClass:`${r}-clickable`,lockClass:`${r}-lock`,horizontalClass:`${r}-horizontal`,verticalClass:`${r}-vertical`,paginationDisabledClass:`${r}-disabled`}}),t.pagination={el:null,$el:null,bullets:[]};let l=0;function o(){return!t.params.pagination.el||!t.pagination.el||!t.pagination.$el||0===t.pagination.$el.length}function c(e,s){const{bulletActiveClass:a}=t.params.pagination;e[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`)}function p(){const e=t.rtl,s=t.params.pagination;if(o())return;const a=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.slides.length,r=t.pagination.$el;let p;const u=t.params.loop?Math.ceil((a-2*t.loopedSlides)/t.params.slidesPerGroup):t.snapGrid.length;if(t.params.loop?(p=Math.ceil((t.activeIndex-t.loopedSlides)/t.params.slidesPerGroup),p>a-1-2*t.loopedSlides&&(p-=a-2*t.loopedSlides),p>u-1&&(p-=u),p<0&&"bullets"!==t.params.paginationType&&(p=u+p)):p=void 0!==t.snapIndex?t.snapIndex:t.activeIndex||0,"bullets"===s.type&&t.pagination.bullets&&t.pagination.bullets.length>0){const a=t.pagination.bullets;let i,o,u;if(s.dynamicBullets&&(n=a.eq(0)[t.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(t.isHorizontal()?"width":"height",n*(s.dynamicMainBullets+4)+"px"),s.dynamicMainBullets>1&&void 0!==t.previousIndex&&(l+=p-(t.previousIndex-t.loopedSlides||0),l>s.dynamicMainBullets-1?l=s.dynamicMainBullets-1:l<0&&(l=0)),i=Math.max(p-l,0),o=i+(Math.min(a.length,s.dynamicMainBullets)-1),u=(o+i)/2),a.removeClass(["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`)).join(" ")),r.length>1)a.each((e=>{const t=d(e),a=t.index();a===p&&t.addClass(s.bulletActiveClass),s.dynamicBullets&&(a>=i&&a<=o&&t.addClass(`${s.bulletActiveClass}-main`),a===i&&c(t,"prev"),a===o&&c(t,"next"))}));else{const e=a.eq(p),r=e.index();if(e.addClass(s.bulletActiveClass),s.dynamicBullets){const e=a.eq(i),n=a.eq(o);for(let e=i;e<=o;e+=1)a.eq(e).addClass(`${s.bulletActiveClass}-main`);if(t.params.loop)if(r>=a.length){for(let e=s.dynamicMainBullets;e>=0;e-=1)a.eq(a.length-e).addClass(`${s.bulletActiveClass}-main`);a.eq(a.length-s.dynamicMainBullets-1).addClass(`${s.bulletActiveClass}-prev`)}else c(e,"prev"),c(n,"next");else c(e,"prev"),c(n,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),r=(n*i-n)/2-u*n,l=e?"right":"left";a.css(t.isHorizontal()?l:"top",`${r}px`)}}if("fraction"===s.type&&(r.find(U(s.currentClass)).text(s.formatFractionCurrent(p+1)),r.find(U(s.totalClass)).text(s.formatFractionTotal(u))),"progressbar"===s.type){let e;e=s.progressbarOpposite?t.isHorizontal()?"vertical":"horizontal":t.isHorizontal()?"horizontal":"vertical";const a=(p+1)/u;let i=1,n=1;"horizontal"===e?i=a:n=a,r.find(U(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${n})`).transition(t.params.speed)}"custom"===s.type&&s.renderCustom?(r.html(s.renderCustom(t,p+1,u)),i("paginationRender",r[0])):i("paginationUpdate",r[0]),t.params.watchOverflow&&t.enabled&&r[t.isLocked?"addClass":"removeClass"](s.lockClass)}function u(){const e=t.params.pagination;if(o())return;const s=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.slides.length,a=t.pagination.$el;let r="";if("bullets"===e.type){let i=t.params.loop?Math.ceil((s-2*t.loopedSlides)/t.params.slidesPerGroup):t.snapGrid.length;t.params.freeMode&&t.params.freeMode.enabled&&!t.params.loop&&i>s&&(i=s);for(let s=0;s`;a.html(r),t.pagination.bullets=a.find(U(e.bulletClass))}"fraction"===e.type&&(r=e.renderFraction?e.renderFraction.call(t,e.currentClass,e.totalClass):` / `,a.html(r)),"progressbar"===e.type&&(r=e.renderProgressbar?e.renderProgressbar.call(t,e.progressbarFillClass):``,a.html(r)),"custom"!==e.type&&i("paginationRender",t.pagination.$el[0])}function h(){t.params.pagination=F(t,t.originalParams.pagination,t.params.pagination,{el:"swiper-pagination"});const e=t.params.pagination;if(!e.el)return;let s=d(e.el);0!==s.length&&(t.params.uniqueNavElements&&"string"==typeof e.el&&s.length>1&&(s=t.$el.find(e.el),s.length>1&&(s=s.filter((e=>d(e).parents(".swiper")[0]===t.el)))),"bullets"===e.type&&e.clickable&&s.addClass(e.clickableClass),s.addClass(e.modifierClass+e.type),s.addClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),"bullets"===e.type&&e.dynamicBullets&&(s.addClass(`${e.modifierClass}${e.type}-dynamic`),l=0,e.dynamicMainBullets<1&&(e.dynamicMainBullets=1)),"progressbar"===e.type&&e.progressbarOpposite&&s.addClass(e.progressbarOppositeClass),e.clickable&&s.on("click",U(e.bulletClass),(function(e){e.preventDefault();let s=d(this).index()*t.params.slidesPerGroup;t.params.loop&&(s+=t.loopedSlides),t.slideTo(s)})),Object.assign(t.pagination,{$el:s,el:s[0]}),t.enabled||s.addClass(e.lockClass))}function m(){const e=t.params.pagination;if(o())return;const s=t.pagination.$el;s.removeClass(e.hiddenClass),s.removeClass(e.modifierClass+e.type),s.removeClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),t.pagination.bullets&&t.pagination.bullets.removeClass&&t.pagination.bullets.removeClass(e.bulletActiveClass),e.clickable&&s.off("click",U(e.bulletClass))}a("init",(()=>{!1===t.params.pagination.enabled?f():(h(),u(),p())})),a("activeIndexChange",(()=>{(t.params.loop||void 0===t.snapIndex)&&p()})),a("snapIndexChange",(()=>{t.params.loop||p()})),a("slidesLengthChange",(()=>{t.params.loop&&(u(),p())})),a("snapGridLengthChange",(()=>{t.params.loop||(u(),p())})),a("destroy",(()=>{m()})),a("enable disable",(()=>{const{$el:e}=t.pagination;e&&e[t.enabled?"removeClass":"addClass"](t.params.pagination.lockClass)})),a("lock unlock",(()=>{p()})),a("click",((e,s)=>{const a=s.target,{$el:r}=t.pagination;if(t.params.pagination.el&&t.params.pagination.hideOnClick&&r&&r.length>0&&!d(a).hasClass(t.params.pagination.bulletClass)){if(t.navigation&&(t.navigation.nextEl&&a===t.navigation.nextEl||t.navigation.prevEl&&a===t.navigation.prevEl))return;const e=r.hasClass(t.params.pagination.hiddenClass);i(!0===e?"paginationShow":"paginationHide"),r.toggleClass(t.params.pagination.hiddenClass)}}));const f=()=>{t.$el.addClass(t.params.pagination.paginationDisabledClass),t.pagination.$el&&t.pagination.$el.addClass(t.params.pagination.paginationDisabledClass),m()};Object.assign(t.pagination,{enable:()=>{t.$el.removeClass(t.params.pagination.paginationDisabledClass),t.pagination.$el&&t.pagination.$el.removeClass(t.params.pagination.paginationDisabledClass),h(),u(),p()},disable:f,render:u,update:p,init:h,destroy:m})},function(e){let{swiper:t,extendParams:s,on:i,emit:r}=e;const n=a();let l,o,c,u,h=!1,m=null,f=null;function g(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e,rtlTranslate:s,progress:a}=t,{$dragEl:i,$el:r}=e,n=t.params.scrollbar;let l=o,d=(c-o)*a;s?(d=-d,d>0?(l=o-d,d=0):-d+o>c&&(l=c+d)):d<0?(l=o+d,d=0):d+o>c&&(l=c-d),t.isHorizontal()?(i.transform(`translate3d(${d}px, 0, 0)`),i[0].style.width=`${l}px`):(i.transform(`translate3d(0px, ${d}px, 0)`),i[0].style.height=`${l}px`),n.hide&&(clearTimeout(m),r[0].style.opacity=1,m=setTimeout((()=>{r[0].style.opacity=0,r.transition(400)}),1e3))}function v(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e}=t,{$dragEl:s,$el:a}=e;s[0].style.width="",s[0].style.height="",c=t.isHorizontal()?a[0].offsetWidth:a[0].offsetHeight,u=t.size/(t.virtualSize+t.params.slidesOffsetBefore-(t.params.centeredSlides?t.snapGrid[0]:0)),o="auto"===t.params.scrollbar.dragSize?c*u:parseInt(t.params.scrollbar.dragSize,10),t.isHorizontal()?s[0].style.width=`${o}px`:s[0].style.height=`${o}px`,a[0].style.display=u>=1?"none":"",t.params.scrollbar.hide&&(a[0].style.opacity=0),t.params.watchOverflow&&t.enabled&&e.$el[t.isLocked?"addClass":"removeClass"](t.params.scrollbar.lockClass)}function w(e){return t.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientX:e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientY:e.clientY}function b(e){const{scrollbar:s,rtlTranslate:a}=t,{$el:i}=s;let r;r=(w(e)-i.offset()[t.isHorizontal()?"left":"top"]-(null!==l?l:o/2))/(c-o),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const n=t.minTranslate()+(t.maxTranslate()-t.minTranslate())*r;t.updateProgress(n),t.setTranslate(n),t.updateActiveIndex(),t.updateSlidesClasses()}function x(e){const s=t.params.scrollbar,{scrollbar:a,$wrapperEl:i}=t,{$el:n,$dragEl:o}=a;h=!0,l=e.target===o[0]||e.target===o?w(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),i.transition(100),o.transition(100),b(e),clearTimeout(f),n.transition(0),s.hide&&n.css("opacity",1),t.params.cssMode&&t.$wrapperEl.css("scroll-snap-type","none"),r("scrollbarDragStart",e)}function y(e){const{scrollbar:s,$wrapperEl:a}=t,{$el:i,$dragEl:n}=s;h&&(e.preventDefault?e.preventDefault():e.returnValue=!1,b(e),a.transition(0),i.transition(0),n.transition(0),r("scrollbarDragMove",e))}function E(e){const s=t.params.scrollbar,{scrollbar:a,$wrapperEl:i}=t,{$el:n}=a;h&&(h=!1,t.params.cssMode&&(t.$wrapperEl.css("scroll-snap-type",""),i.transition("")),s.hide&&(clearTimeout(f),f=p((()=>{n.css("opacity",0),n.transition(400)}),1e3)),r("scrollbarDragEnd",e),s.snapOnRelease&&t.slideToClosest())}function C(e){const{scrollbar:s,touchEventsTouch:a,touchEventsDesktop:i,params:r,support:l}=t,o=s.$el;if(!o)return;const d=o[0],c=!(!l.passiveListener||!r.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!r.passiveListeners)&&{passive:!0,capture:!1};if(!d)return;const u="on"===e?"addEventListener":"removeEventListener";l.touch?(d[u](a.start,x,c),d[u](a.move,y,c),d[u](a.end,E,p)):(d[u](i.start,x,c),n[u](i.move,y,c),n[u](i.end,E,p))}function T(){const{scrollbar:e,$el:s}=t;t.params.scrollbar=F(t,t.originalParams.scrollbar,t.params.scrollbar,{el:"swiper-scrollbar"});const a=t.params.scrollbar;if(!a.el)return;let i=d(a.el);t.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.find(a.el).length&&(i=s.find(a.el)),i.addClass(t.isHorizontal()?a.horizontalClass:a.verticalClass);let r=i.find(`.${t.params.scrollbar.dragClass}`);0===r.length&&(r=d(`
`),i.append(r)),Object.assign(e,{$el:i,el:i[0],$dragEl:r,dragEl:r[0]}),a.draggable&&t.params.scrollbar.el&&t.scrollbar.el&&C("on"),i&&i[t.enabled?"removeClass":"addClass"](t.params.scrollbar.lockClass)}function $(){const e=t.params.scrollbar,s=t.scrollbar.$el;s&&s.removeClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),t.params.scrollbar.el&&t.scrollbar.el&&C("off")}s({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),t.scrollbar={el:null,dragEl:null,$el:null,$dragEl:null},i("init",(()=>{!1===t.params.scrollbar.enabled?S():(T(),v(),g())})),i("update resize observerUpdate lock unlock",(()=>{v()})),i("setTranslate",(()=>{g()})),i("setTransition",((e,s)=>{!function(e){t.params.scrollbar.el&&t.scrollbar.el&&t.scrollbar.$dragEl.transition(e)}(s)})),i("enable disable",(()=>{const{$el:e}=t.scrollbar;e&&e[t.enabled?"removeClass":"addClass"](t.params.scrollbar.lockClass)})),i("destroy",(()=>{$()}));const S=()=>{t.$el.addClass(t.params.scrollbar.scrollbarDisabledClass),t.scrollbar.$el&&t.scrollbar.$el.addClass(t.params.scrollbar.scrollbarDisabledClass),$()};Object.assign(t.scrollbar,{enable:()=>{t.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass),t.scrollbar.$el&&t.scrollbar.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass),T(),v(),g()},disable:S,updateSize:v,setTranslate:g,init:T,destroy:$})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({parallax:{enabled:!1}});const i=(e,s)=>{const{rtl:a}=t,i=d(e),r=a?-1:1,n=i.attr("data-swiper-parallax")||"0";let l=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y");const c=i.attr("data-swiper-parallax-scale"),p=i.attr("data-swiper-parallax-opacity");if(l||o?(l=l||"0",o=o||"0"):t.isHorizontal()?(l=n,o="0"):(o=n,l="0"),l=l.indexOf("%")>=0?parseInt(l,10)*s*r+"%":l*s*r+"px",o=o.indexOf("%")>=0?parseInt(o,10)*s+"%":o*s+"px",null!=p){const e=p-(p-1)*(1-Math.abs(s));i[0].style.opacity=e}if(null==c)i.transform(`translate3d(${l}, ${o}, 0px)`);else{const e=c-(c-1)*(1-Math.abs(s));i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`)}},r=()=>{const{$el:e,slides:s,progress:a,snapGrid:r}=t;e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{i(e,a)})),s.each(((e,s)=>{let n=e.progress;t.params.slidesPerGroup>1&&"auto"!==t.params.slidesPerView&&(n+=Math.ceil(s/2)-a*(r.length-1)),n=Math.min(Math.max(n,-1),1),d(e).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{i(e,n)}))}))};a("beforeInit",(()=>{t.params.parallax.enabled&&(t.params.watchSlidesProgress=!0,t.originalParams.watchSlidesProgress=!0)})),a("init",(()=>{t.params.parallax.enabled&&r()})),a("setTranslate",(()=>{t.params.parallax.enabled&&r()})),a("setTransition",((e,s)=>{t.params.parallax.enabled&&function(e){void 0===e&&(e=t.params.speed);const{$el:s}=t;s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((t=>{const s=d(t);let a=parseInt(s.attr("data-swiper-parallax-duration"),10)||e;0===e&&(a=0),s.transition(a)}))}(s)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();s({zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),t.zoom={enabled:!1};let l,o,c,p=1,u=!1;const m={$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},f={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},g={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let v=1;function w(e){if(e.targetTouches.length<2)return 1;const t=e.targetTouches[0].pageX,s=e.targetTouches[0].pageY,a=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY;return Math.sqrt((a-t)**2+(i-s)**2)}function b(e){const s=t.support,a=t.params.zoom;if(o=!1,c=!1,!s.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;o=!0,m.scaleStart=w(e)}m.$slideEl&&m.$slideEl.length||(m.$slideEl=d(e.target).closest(`.${t.params.slideClass}`),0===m.$slideEl.length&&(m.$slideEl=t.slides.eq(t.activeIndex)),m.$imageEl=m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${a.containerClass}`),m.maxRatio=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==m.$imageWrapEl.length)?(m.$imageEl&&m.$imageEl.transition(0),u=!0):m.$imageEl=void 0}function x(e){const s=t.support,a=t.params.zoom,i=t.zoom;if(!s.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;c=!0,m.scaleMove=w(e)}m.$imageEl&&0!==m.$imageEl.length?(s.gestures?i.scale=e.scale*p:i.scale=m.scaleMove/m.scaleStart*p,i.scale>m.maxRatio&&(i.scale=m.maxRatio-1+(i.scale-m.maxRatio+1)**.5),i.scalef.touchesStart.x))return void(f.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(f.minY)===Math.floor(f.startY)&&f.touchesCurrent.yf.touchesStart.y))return void(f.isTouched=!1)}e.cancelable&&e.preventDefault(),e.stopPropagation(),f.isMoved=!0,f.currentX=f.touchesCurrent.x-f.touchesStart.x+f.startX,f.currentY=f.touchesCurrent.y-f.touchesStart.y+f.startY,f.currentXf.maxX&&(f.currentX=f.maxX-1+(f.currentX-f.maxX+1)**.8),f.currentYf.maxY&&(f.currentY=f.maxY-1+(f.currentY-f.maxY+1)**.8),g.prevPositionX||(g.prevPositionX=f.touchesCurrent.x),g.prevPositionY||(g.prevPositionY=f.touchesCurrent.y),g.prevTime||(g.prevTime=Date.now()),g.x=(f.touchesCurrent.x-g.prevPositionX)/(Date.now()-g.prevTime)/2,g.y=(f.touchesCurrent.y-g.prevPositionY)/(Date.now()-g.prevTime)/2,Math.abs(f.touchesCurrent.x-g.prevPositionX)<2&&(g.x=0),Math.abs(f.touchesCurrent.y-g.prevPositionY)<2&&(g.y=0),g.prevPositionX=f.touchesCurrent.x,g.prevPositionY=f.touchesCurrent.y,g.prevTime=Date.now(),m.$imageWrapEl.transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`)}}function C(){const e=t.zoom;m.$slideEl&&t.previousIndex!==t.activeIndex&&(m.$imageEl&&m.$imageEl.transform("translate3d(0,0,0) scale(1)"),m.$imageWrapEl&&m.$imageWrapEl.transform("translate3d(0,0,0)"),e.scale=1,p=1,m.$slideEl=void 0,m.$imageEl=void 0,m.$imageWrapEl=void 0)}function T(e){const s=t.zoom,a=t.params.zoom;if(m.$slideEl||(e&&e.target&&(m.$slideEl=d(e.target).closest(`.${t.params.slideClass}`)),m.$slideEl||(t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.$slideEl=t.$wrapperEl.children(`.${t.params.slideActiveClass}`):m.$slideEl=t.slides.eq(t.activeIndex)),m.$imageEl=m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${a.containerClass}`)),!m.$imageEl||0===m.$imageEl.length||!m.$imageWrapEl||0===m.$imageWrapEl.length)return;let i,r,l,o,c,u,h,g,v,w,b,x,y,E,C,T,$,S;t.params.cssMode&&(t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.touchAction="none"),m.$slideEl.addClass(`${a.zoomedSlideClass}`),void 0===f.touchesStart.x&&e?(i="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,r="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(i=f.touchesStart.x,r=f.touchesStart.y),s.scale=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,p=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,e?($=m.$slideEl[0].offsetWidth,S=m.$slideEl[0].offsetHeight,l=m.$slideEl.offset().left+n.scrollX,o=m.$slideEl.offset().top+n.scrollY,c=l+$/2-i,u=o+S/2-r,v=m.$imageEl[0].offsetWidth,w=m.$imageEl[0].offsetHeight,b=v*s.scale,x=w*s.scale,y=Math.min($/2-b/2,0),E=Math.min(S/2-x/2,0),C=-y,T=-E,h=c*s.scale,g=u*s.scale,hC&&(h=C),gT&&(g=T)):(h=0,g=0),m.$imageWrapEl.transition(300).transform(`translate3d(${h}px, ${g}px,0)`),m.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`)}function $(){const e=t.zoom,s=t.params.zoom;m.$slideEl||(t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.$slideEl=t.$wrapperEl.children(`.${t.params.slideActiveClass}`):m.$slideEl=t.slides.eq(t.activeIndex),m.$imageEl=m.$slideEl.find(`.${s.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${s.containerClass}`)),m.$imageEl&&0!==m.$imageEl.length&&m.$imageWrapEl&&0!==m.$imageWrapEl.length&&(t.params.cssMode&&(t.wrapperEl.style.overflow="",t.wrapperEl.style.touchAction=""),e.scale=1,p=1,m.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),m.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),m.$slideEl.removeClass(`${s.zoomedSlideClass}`),m.$slideEl=void 0)}function S(e){const s=t.zoom;s.scale&&1!==s.scale?$():T(e)}function M(){const e=t.support;return{passiveListener:!("touchstart"!==t.touchEvents.start||!e.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1},activeListenerWithCapture:!e.passiveListener||{passive:!1,capture:!0}}}function P(){return`.${t.params.slideClass}`}function k(e){const{passiveListener:s}=M(),a=P();t.$wrapperEl[e]("gesturestart",a,b,s),t.$wrapperEl[e]("gesturechange",a,x,s),t.$wrapperEl[e]("gestureend",a,y,s)}function z(){l||(l=!0,k("on"))}function L(){l&&(l=!1,k("off"))}function O(){const e=t.zoom;if(e.enabled)return;e.enabled=!0;const s=t.support,{passiveListener:a,activeListenerWithCapture:i}=M(),r=P();s.gestures?(t.$wrapperEl.on(t.touchEvents.start,z,a),t.$wrapperEl.on(t.touchEvents.end,L,a)):"touchstart"===t.touchEvents.start&&(t.$wrapperEl.on(t.touchEvents.start,r,b,a),t.$wrapperEl.on(t.touchEvents.move,r,x,i),t.$wrapperEl.on(t.touchEvents.end,r,y,a),t.touchEvents.cancel&&t.$wrapperEl.on(t.touchEvents.cancel,r,y,a)),t.$wrapperEl.on(t.touchEvents.move,`.${t.params.zoom.containerClass}`,E,i)}function I(){const e=t.zoom;if(!e.enabled)return;const s=t.support;e.enabled=!1;const{passiveListener:a,activeListenerWithCapture:i}=M(),r=P();s.gestures?(t.$wrapperEl.off(t.touchEvents.start,z,a),t.$wrapperEl.off(t.touchEvents.end,L,a)):"touchstart"===t.touchEvents.start&&(t.$wrapperEl.off(t.touchEvents.start,r,b,a),t.$wrapperEl.off(t.touchEvents.move,r,x,i),t.$wrapperEl.off(t.touchEvents.end,r,y,a),t.touchEvents.cancel&&t.$wrapperEl.off(t.touchEvents.cancel,r,y,a)),t.$wrapperEl.off(t.touchEvents.move,`.${t.params.zoom.containerClass}`,E,i)}Object.defineProperty(t.zoom,"scale",{get:()=>v,set(e){if(v!==e){const t=m.$imageEl?m.$imageEl[0]:void 0,s=m.$slideEl?m.$slideEl[0]:void 0;i("zoomChange",e,t,s)}v=e}}),a("init",(()=>{t.params.zoom.enabled&&O()})),a("destroy",(()=>{I()})),a("touchStart",((e,s)=>{t.zoom.enabled&&function(e){const s=t.device;m.$imageEl&&0!==m.$imageEl.length&&(f.isTouched||(s.android&&e.cancelable&&e.preventDefault(),f.isTouched=!0,f.touchesStart.x="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,f.touchesStart.y="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY))}(s)})),a("touchEnd",((e,s)=>{t.zoom.enabled&&function(){const e=t.zoom;if(!m.$imageEl||0===m.$imageEl.length)return;if(!f.isTouched||!f.isMoved)return f.isTouched=!1,void(f.isMoved=!1);f.isTouched=!1,f.isMoved=!1;let s=300,a=300;const i=g.x*s,r=f.currentX+i,n=g.y*a,l=f.currentY+n;0!==g.x&&(s=Math.abs((r-f.currentX)/g.x)),0!==g.y&&(a=Math.abs((l-f.currentY)/g.y));const o=Math.max(s,a);f.currentX=r,f.currentY=l;const d=f.width*e.scale,c=f.height*e.scale;f.minX=Math.min(m.slideWidth/2-d/2,0),f.maxX=-f.minX,f.minY=Math.min(m.slideHeight/2-c/2,0),f.maxY=-f.minY,f.currentX=Math.max(Math.min(f.currentX,f.maxX),f.minX),f.currentY=Math.max(Math.min(f.currentY,f.maxY),f.minY),m.$imageWrapEl.transition(o).transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`)}()})),a("doubleTap",((e,s)=>{!t.animating&&t.params.zoom.enabled&&t.zoom.enabled&&t.params.zoom.toggle&&S(s)})),a("transitionEnd",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&C()})),a("slideChange",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&t.params.cssMode&&C()})),Object.assign(t.zoom,{enable:O,disable:I,in:T,out:$,toggle:S})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;s({lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}}),t.lazy={};let n=!1,l=!1;function o(e,s){void 0===s&&(s=!0);const a=t.params.lazy;if(void 0===e)return;if(0===t.slides.length)return;const r=t.virtual&&t.params.virtual.enabled?t.$wrapperEl.children(`.${t.params.slideClass}[data-swiper-slide-index="${e}"]`):t.slides.eq(e),n=r.find(`.${a.elementClass}:not(.${a.loadedClass}):not(.${a.loadingClass})`);!r.hasClass(a.elementClass)||r.hasClass(a.loadedClass)||r.hasClass(a.loadingClass)||n.push(r[0]),0!==n.length&&n.each((e=>{const n=d(e);n.addClass(a.loadingClass);const l=n.attr("data-background"),c=n.attr("data-src"),p=n.attr("data-srcset"),u=n.attr("data-sizes"),h=n.parent("picture");t.loadImage(n[0],c||l,p,u,!1,(()=>{if(null!=t&&t&&(!t||t.params)&&!t.destroyed){if(l?(n.css("background-image",`url("${l}")`),n.removeAttr("data-background")):(p&&(n.attr("srcset",p),n.removeAttr("data-srcset")),u&&(n.attr("sizes",u),n.removeAttr("data-sizes")),h.length&&h.children("source").each((e=>{const t=d(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),c&&(n.attr("src",c),n.removeAttr("data-src"))),n.addClass(a.loadedClass).removeClass(a.loadingClass),r.find(`.${a.preloaderClass}`).remove(),t.params.loop&&s){const e=r.attr("data-swiper-slide-index");if(r.hasClass(t.params.slideDuplicateClass)){o(t.$wrapperEl.children(`[data-swiper-slide-index="${e}"]:not(.${t.params.slideDuplicateClass})`).index(),!1)}else{o(t.$wrapperEl.children(`.${t.params.slideDuplicateClass}[data-swiper-slide-index="${e}"]`).index(),!1)}}i("lazyImageReady",r[0],n[0]),t.params.autoHeight&&t.updateAutoHeight()}})),i("lazyImageLoad",r[0],n[0])}))}function c(){const{$wrapperEl:e,params:s,slides:a,activeIndex:i}=t,r=t.virtual&&s.virtual.enabled,n=s.lazy;let c=s.slidesPerView;function p(t){if(r){if(e.children(`.${s.slideClass}[data-swiper-slide-index="${t}"]`).length)return!0}else if(a[t])return!0;return!1}function u(e){return r?d(e).attr("data-swiper-slide-index"):d(e).index()}if("auto"===c&&(c=0),l||(l=!0),t.params.watchSlidesProgress)e.children(`.${s.slideVisibleClass}`).each((e=>{o(r?d(e).attr("data-swiper-slide-index"):d(e).index())}));else if(c>1)for(let e=i;e1||n.loadPrevNextAmount&&n.loadPrevNextAmount>1){const e=n.loadPrevNextAmount,t=Math.ceil(c),s=Math.min(i+t+Math.max(e,t),a.length),r=Math.max(i-Math.max(t,e),0);for(let e=i+t;e0&&o(u(t));const a=e.children(`.${s.slidePrevClass}`);a.length>0&&o(u(a))}}function p(){const e=r();if(!t||t.destroyed)return;const s=t.params.lazy.scrollingElement?d(t.params.lazy.scrollingElement):d(e),a=s[0]===e,i=a?e.innerWidth:s[0].offsetWidth,l=a?e.innerHeight:s[0].offsetHeight,o=t.$el.offset(),{rtlTranslate:u}=t;let h=!1;u&&(o.left-=t.$el[0].scrollLeft);const m=[[o.left,o.top],[o.left+t.width,o.top],[o.left,o.top+t.height],[o.left+t.width,o.top+t.height]];for(let e=0;e=0&&t[0]<=i&&t[1]>=0&&t[1]<=l){if(0===t[0]&&0===t[1])continue;h=!0}}const f=!("touchstart"!==t.touchEvents.start||!t.support.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1};h?(c(),s.off("scroll",p,f)):n||(n=!0,s.on("scroll",p,f))}a("beforeInit",(()=>{t.params.lazy.enabled&&t.params.preloadImages&&(t.params.preloadImages=!1)})),a("init",(()=>{t.params.lazy.enabled&&(t.params.lazy.checkInView?p():c())})),a("scroll",(()=>{t.params.freeMode&&t.params.freeMode.enabled&&!t.params.freeMode.sticky&&c()})),a("scrollbarDragMove resize _freeModeNoMomentumRelease",(()=>{t.params.lazy.enabled&&(t.params.lazy.checkInView?p():c())})),a("transitionStart",(()=>{t.params.lazy.enabled&&(t.params.lazy.loadOnTransitionStart||!t.params.lazy.loadOnTransitionStart&&!l)&&(t.params.lazy.checkInView?p():c())})),a("transitionEnd",(()=>{t.params.lazy.enabled&&!t.params.lazy.loadOnTransitionStart&&(t.params.lazy.checkInView?p():c())})),a("slideChange",(()=>{const{lazy:e,cssMode:s,watchSlidesProgress:a,touchReleaseOnEdges:i,resistanceRatio:r}=t.params;e.enabled&&(s||a&&(i||0===r))&&c()})),a("destroy",(()=>{t.$el&&t.$el.find(`.${t.params.lazy.loadingClass}`).removeClass(t.params.lazy.loadingClass)})),Object.assign(t.lazy,{load:c,loadInSlide:o})},function(e){let{swiper:t,extendParams:s,on:a}=e;function i(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function r(){t.controller.control&&t.controller.spline&&(t.controller.spline=void 0,delete t.controller.spline)}s({controller:{control:void 0,inverse:!1,by:"slide"}}),t.controller={control:void 0},a("beforeInit",(()=>{t.controller.control=t.params.controller.control})),a("update",(()=>{r()})),a("resize",(()=>{r()})),a("observerUpdate",(()=>{r()})),a("setTranslate",((e,s,a)=>{t.controller.control&&t.controller.setTranslate(s,a)})),a("setTransition",((e,s,a)=>{t.controller.control&&t.controller.setTransition(s,a)})),Object.assign(t.controller,{setTranslate:function(e,s){const a=t.controller.control;let r,n;const l=t.constructor;function o(e){const s=t.rtlTranslate?-t.translate:t.translate;"slide"===t.params.controller.by&&(!function(e){t.controller.spline||(t.controller.spline=t.params.loop?new i(t.slidesGrid,e.slidesGrid):new i(t.snapGrid,e.snapGrid))}(e),n=-t.controller.spline.interpolate(-s)),n&&"container"!==t.params.controller.by||(r=(e.maxTranslate()-e.minTranslate())/(t.maxTranslate()-t.minTranslate()),n=(s-t.minTranslate())*r+e.minTranslate()),t.params.controller.inverse&&(n=e.maxTranslate()-n),e.updateProgress(n),e.setTranslate(n,t),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(a))for(let e=0;e{s.updateAutoHeight()})),s.$wrapperEl.transitionEnd((()=>{i&&(s.params.loop&&"slide"===t.params.controller.by&&s.loopFix(),s.transitionEnd())})))}if(Array.isArray(i))for(r=0;r{n(e),"BUTTON"!==e[0].tagName&&(o(e,"button"),e.on("keydown",m)),p(e,s),function(e,t){e.attr("aria-controls",t)}(e,t)},w=()=>{t.a11y.clicked=!0},b=()=>{requestAnimationFrame((()=>{requestAnimationFrame((()=>{t.a11y.clicked=!1}))}))},x=e=>{if(t.a11y.clicked)return;const s=e.target.closest(`.${t.params.slideClass}`);if(!s||!t.slides.includes(s))return;const a=t.slides.indexOf(s)===t.activeIndex,i=t.params.watchSlidesProgress&&t.visibleSlides&&t.visibleSlides.includes(s);a||i||(t.isHorizontal()?t.el.scrollLeft=0:t.el.scrollTop=0,t.slideTo(t.slides.indexOf(s),0))},y=()=>{const e=t.params.a11y;e.itemRoleDescriptionMessage&&c(d(t.slides),e.itemRoleDescriptionMessage),e.slideRole&&o(d(t.slides),e.slideRole);const s=t.params.loop?t.slides.filter((e=>!e.classList.contains(t.params.slideDuplicateClass))).length:t.slides.length;e.slideLabelMessage&&t.slides.each(((a,i)=>{const r=d(a),n=t.params.loop?parseInt(r.attr("data-swiper-slide-index"),10):i;p(r,e.slideLabelMessage.replace(/\{\{index\}\}/,n+1).replace(/\{\{slidesLength\}\}/,s))}))},E=()=>{const e=t.params.a11y;t.$el.append(i);const s=t.$el;e.containerRoleDescriptionMessage&&c(s,e.containerRoleDescriptionMessage),e.containerMessage&&p(s,e.containerMessage);const a=t.$wrapperEl,r=e.id||a.attr("id")||`swiper-wrapper-${n=16,void 0===n&&(n=16),"x".repeat(n).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}`;var n;const l=t.params.autoplay&&t.params.autoplay.enabled?"off":"polite";var o;let d,u;o=r,a.attr("id",o),function(e,t){e.attr("aria-live",t)}(a,l),y(),t.navigation&&t.navigation.$nextEl&&(d=t.navigation.$nextEl),t.navigation&&t.navigation.$prevEl&&(u=t.navigation.$prevEl),d&&d.length&&v(d,r,e.nextSlideMessage),u&&u.length&&v(u,r,e.prevSlideMessage),g()&&t.pagination.$el.on("keydown",U(t.params.pagination.bulletClass),m),t.$el.on("focus",x,!0),t.$el.on("pointerdown",w,!0),t.$el.on("pointerup",b,!0)};a("beforeInit",(()=>{i=d(``)})),a("afterInit",(()=>{t.params.a11y.enabled&&E()})),a("slidesLengthChange snapGridLengthChange slidesGridLengthChange",(()=>{t.params.a11y.enabled&&y()})),a("fromEdge toEdge afterInit lock unlock",(()=>{t.params.a11y.enabled&&function(){if(t.params.loop||t.params.rewind||!t.navigation)return;const{$nextEl:e,$prevEl:s}=t.navigation;s&&s.length>0&&(t.isBeginning?(u(s),l(s)):(h(s),n(s))),e&&e.length>0&&(t.isEnd?(u(e),l(e)):(h(e),n(e)))}()})),a("paginationUpdate",(()=>{t.params.a11y.enabled&&function(){const e=t.params.a11y;f()&&t.pagination.bullets.each((s=>{const a=d(s);t.params.pagination.clickable&&(n(a),t.params.pagination.renderBullet||(o(a,"button"),p(a,e.paginationBulletMessage.replace(/\{\{index\}\}/,a.index()+1)))),a.is(`.${t.params.pagination.bulletActiveClass}`)?a.attr("aria-current","true"):a.removeAttr("aria-current")}))}()})),a("destroy",(()=>{t.params.a11y.enabled&&function(){let e,s;i&&i.length>0&&i.remove(),t.navigation&&t.navigation.$nextEl&&(e=t.navigation.$nextEl),t.navigation&&t.navigation.$prevEl&&(s=t.navigation.$prevEl),e&&e.off("keydown",m),s&&s.off("keydown",m),g()&&t.pagination.$el.off("keydown",U(t.params.pagination.bulletClass),m),t.$el.off("focus",x,!0),t.$el.off("pointerdown",w,!0),t.$el.off("pointerup",b,!0)}()}))},function(e){let{swiper:t,extendParams:s,on:a}=e;s({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let i=!1,n={};const l=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),o=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},d=(e,s)=>{const a=r();if(!i||!t.params.history.enabled)return;let n;n=t.params.url?new URL(t.params.url):a.location;const o=t.slides.eq(s);let d=l(o.attr("data-history"));if(t.params.history.root.length>0){let s=t.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${e}/${d}`}else n.pathname.includes(e)||(d=`${e}/${d}`);t.params.history.keepQuery&&(d+=n.search);const c=a.history.state;c&&c.value===d||(t.params.history.replaceState?a.history.replaceState({value:d},null,d):a.history.pushState({value:d},null,d))},c=(e,s,a)=>{if(s)for(let i=0,r=t.slides.length;i{n=o(t.params.url),c(t.params.speed,n.value,!1)};a("init",(()=>{t.params.history.enabled&&(()=>{const e=r();if(t.params.history){if(!e.history||!e.history.pushState)return t.params.history.enabled=!1,void(t.params.hashNavigation.enabled=!0);i=!0,n=o(t.params.url),(n.key||n.value)&&(c(0,n.value,t.params.runCallbacksOnInit),t.params.history.replaceState||e.addEventListener("popstate",p))}})()})),a("destroy",(()=>{t.params.history.enabled&&(()=>{const e=r();t.params.history.replaceState||e.removeEventListener("popstate",p)})()})),a("transitionEnd _freeModeNoMomentumRelease",(()=>{i&&d(t.params.history.key,t.activeIndex)})),a("slideChange",(()=>{i&&t.params.cssMode&&d(t.params.history.key,t.activeIndex)}))},function(e){let{swiper:t,extendParams:s,emit:i,on:n}=e,l=!1;const o=a(),c=r();s({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}});const p=()=>{i("hashChange");const e=o.location.hash.replace("#","");if(e!==t.slides.eq(t.activeIndex).attr("data-hash")){const s=t.$wrapperEl.children(`.${t.params.slideClass}[data-hash="${e}"]`).index();if(void 0===s)return;t.slideTo(s)}},u=()=>{if(l&&t.params.hashNavigation.enabled)if(t.params.hashNavigation.replaceState&&c.history&&c.history.replaceState)c.history.replaceState(null,null,`#${t.slides.eq(t.activeIndex).attr("data-hash")}`||""),i("hashSet");else{const e=t.slides.eq(t.activeIndex),s=e.attr("data-hash")||e.attr("data-history");o.location.hash=s||"",i("hashSet")}};n("init",(()=>{t.params.hashNavigation.enabled&&(()=>{if(!t.params.hashNavigation.enabled||t.params.history&&t.params.history.enabled)return;l=!0;const e=o.location.hash.replace("#","");if(e){const s=0;for(let a=0,i=t.slides.length;a{t.params.hashNavigation.enabled&&t.params.hashNavigation.watchState&&d(c).off("hashchange",p)})),n("transitionEnd _freeModeNoMomentumRelease",(()=>{l&&u()})),n("slideChange",(()=>{l&&t.params.cssMode&&u()}))},function(e){let t,{swiper:s,extendParams:i,on:r,emit:n}=e;function l(){if(!s.size)return s.autoplay.running=!1,void(s.autoplay.paused=!1);const e=s.slides.eq(s.activeIndex);let a=s.params.autoplay.delay;e.attr("data-swiper-autoplay")&&(a=e.attr("data-swiper-autoplay")||s.params.autoplay.delay),clearTimeout(t),t=p((()=>{let e;s.params.autoplay.reverseDirection?s.params.loop?(s.loopFix(),e=s.slidePrev(s.params.speed,!0,!0),n("autoplay")):s.isBeginning?s.params.autoplay.stopOnLastSlide?d():(e=s.slideTo(s.slides.length-1,s.params.speed,!0,!0),n("autoplay")):(e=s.slidePrev(s.params.speed,!0,!0),n("autoplay")):s.params.loop?(s.loopFix(),e=s.slideNext(s.params.speed,!0,!0),n("autoplay")):s.isEnd?s.params.autoplay.stopOnLastSlide?d():(e=s.slideTo(0,s.params.speed,!0,!0),n("autoplay")):(e=s.slideNext(s.params.speed,!0,!0),n("autoplay")),(s.params.cssMode&&s.autoplay.running||!1===e)&&l()}),a)}function o(){return void 0===t&&(!s.autoplay.running&&(s.autoplay.running=!0,n("autoplayStart"),l(),!0))}function d(){return!!s.autoplay.running&&(void 0!==t&&(t&&(clearTimeout(t),t=void 0),s.autoplay.running=!1,n("autoplayStop"),!0))}function c(e){s.autoplay.running&&(s.autoplay.paused||(t&&clearTimeout(t),s.autoplay.paused=!0,0!==e&&s.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].addEventListener(e,h)})):(s.autoplay.paused=!1,l())))}function u(){const e=a();"hidden"===e.visibilityState&&s.autoplay.running&&c(),"visible"===e.visibilityState&&s.autoplay.paused&&(l(),s.autoplay.paused=!1)}function h(e){s&&!s.destroyed&&s.$wrapperEl&&e.target===s.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].removeEventListener(e,h)})),s.autoplay.paused=!1,s.autoplay.running?l():d())}function m(){s.params.autoplay.disableOnInteraction?d():(n("autoplayPause"),c()),["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].removeEventListener(e,h)}))}function f(){s.params.autoplay.disableOnInteraction||(s.autoplay.paused=!1,n("autoplayResume"),l())}s.autoplay={running:!1,paused:!1},i({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}}),r("init",(()=>{if(s.params.autoplay.enabled){o();a().addEventListener("visibilitychange",u),s.params.autoplay.pauseOnMouseEnter&&(s.$el.on("mouseenter",m),s.$el.on("mouseleave",f))}})),r("beforeTransitionStart",((e,t,a)=>{s.autoplay.running&&(a||!s.params.autoplay.disableOnInteraction?s.autoplay.pause(t):d())})),r("sliderFirstMove",(()=>{s.autoplay.running&&(s.params.autoplay.disableOnInteraction?d():c())})),r("touchEnd",(()=>{s.params.cssMode&&s.autoplay.paused&&!s.params.autoplay.disableOnInteraction&&l()})),r("destroy",(()=>{s.$el.off("mouseenter",m),s.$el.off("mouseleave",f),s.autoplay.running&&d();a().removeEventListener("visibilitychange",u)})),Object.assign(s.autoplay,{pause:c,run:l,start:o,stop:d})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let i=!1,r=!1;function n(){const e=t.thumbs.swiper;if(!e||e.destroyed)return;const s=e.clickedIndex,a=e.clickedSlide;if(a&&d(a).hasClass(t.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;if(i=e.params.loop?parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10):s,t.params.loop){let e=t.activeIndex;t.slides.eq(e).hasClass(t.params.slideDuplicateClass)&&(t.loopFix(),t._clientLeft=t.$wrapperEl[0].clientLeft,e=t.activeIndex);const s=t.slides.eq(e).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(),a=t.slides.eq(e).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index();i=void 0===s?a:void 0===a?s:a-e1&&!t.params.centeredSlides&&(i=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(i=1),i=Math.floor(i),s.slides.removeClass(r),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let e=0;e1?a:o:a-ot.previousIndex?"next":"prev"}else i=t.realIndex,r=i>t.previousIndex?"next":"prev";l&&(i+="next"===r?n:-1*n),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(i)<0&&(s.params.centeredSlides?i=i>o?i-Math.floor(a/2)+1:i+Math.floor(a/2)-1:i>o&&s.params.slidesPerGroup,s.slideTo(i,e?0:void 0))}}t.thumbs={swiper:null},a("beforeInit",(()=>{const{thumbs:e}=t.params;e&&e.swiper&&(l(),o(!0))})),a("slideChange update resize observerUpdate",(()=>{o()})),a("setTransition",((e,s)=>{const a=t.thumbs.swiper;a&&!a.destroyed&&a.setTransition(s)})),a("beforeDestroy",(()=>{const e=t.thumbs.swiper;e&&!e.destroyed&&r&&e.destroy()})),Object.assign(t.thumbs,{init:l,update:o})},function(e){let{swiper:t,extendParams:s,emit:a,once:i}=e;s({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(t,{freeMode:{onTouchStart:function(){const e=t.getTranslate();t.setTranslate(e),t.setTransition(0),t.touchEventsData.velocities.length=0,t.freeMode.onTouchEnd({currentPos:t.rtl?t.translate:-t.translate})},onTouchMove:function(){const{touchEventsData:e,touches:s}=t;0===e.velocities.length&&e.velocities.push({position:s[t.isHorizontal()?"startX":"startY"],time:e.touchStartTime}),e.velocities.push({position:s[t.isHorizontal()?"currentX":"currentY"],time:u()})},onTouchEnd:function(e){let{currentPos:s}=e;const{params:r,$wrapperEl:n,rtlTranslate:l,snapGrid:o,touchEventsData:d}=t,c=u()-d.touchStartTime;if(s<-t.minTranslate())t.slideTo(t.activeIndex);else if(s>-t.maxTranslate())t.slides.length1){const e=d.velocities.pop(),s=d.velocities.pop(),a=e.position-s.position,i=e.time-s.time;t.velocity=a/i,t.velocity/=2,Math.abs(t.velocity)150||u()-e.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=r.freeMode.momentumVelocityRatio,d.velocities.length=0;let e=1e3*r.freeMode.momentumRatio;const s=t.velocity*e;let c=t.translate+s;l&&(c=-c);let p,h=!1;const m=20*Math.abs(t.velocity)*r.freeMode.momentumBounceRatio;let f;if(ct.minTranslate())r.freeMode.momentumBounce?(c-t.minTranslate()>m&&(c=t.minTranslate()+m),p=t.minTranslate(),h=!0,d.allowMomentumBounce=!0):c=t.minTranslate(),r.loop&&r.centeredSlides&&(f=!0);else if(r.freeMode.sticky){let e;for(let t=0;t-c){e=t;break}c=Math.abs(o[e]-c){t.loopFix()})),0!==t.velocity){if(e=l?Math.abs((-c-t.translate)/t.velocity):Math.abs((c-t.translate)/t.velocity),r.freeMode.sticky){const s=Math.abs((l?-c:c)-t.translate),a=t.slidesSizesGrid[t.activeIndex];e=s{t&&!t.destroyed&&d.allowMomentumBounce&&(a("momentumBounce"),t.setTransition(r.speed),setTimeout((()=>{t.setTranslate(p),n.transitionEnd((()=>{t&&!t.destroyed&&t.transitionEnd()}))}),0))}))):t.velocity?(a("_freeModeNoMomentumRelease"),t.updateProgress(c),t.setTransition(e),t.setTranslate(c),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,n.transitionEnd((()=>{t&&!t.destroyed&&t.transitionEnd()})))):t.updateProgress(c),t.updateActiveIndex(),t.updateSlidesClasses()}else{if(r.freeMode.sticky)return void t.slideToClosest();r.freeMode&&a("_freeModeNoMomentumRelease")}(!r.freeMode.momentum||c>=r.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}}}})},function(e){let t,s,a,{swiper:i,extendParams:r}=e;r({grid:{rows:1,fill:"column"}}),i.grid={initSlides:e=>{const{slidesPerView:r}=i.params,{rows:n,fill:l}=i.params.grid;s=t/n,a=Math.floor(e/n),t=Math.floor(e/n)===e/n?e:Math.ceil(e/n)*n,"auto"!==r&&"row"===l&&(t=Math.max(t,r*n))},updateSlide:(e,r,n,l)=>{const{slidesPerGroup:o,spaceBetween:d}=i.params,{rows:c,fill:p}=i.params.grid;let u,h,m;if("row"===p&&o>1){const s=Math.floor(e/(o*c)),a=e-c*o*s,i=0===s?o:Math.min(Math.ceil((n-s*c*o)/c),o);m=Math.floor(a/i),h=a-m*i+s*o,u=h+m*t/c,r.css({"-webkit-order":u,order:u})}else"column"===p?(h=Math.floor(e/c),m=e-h*c,(h>a||h===a&&m===c-1)&&(m+=1,m>=c&&(m=0,h+=1))):(m=Math.floor(e/s),h=e-m*s);r.css(l("margin-top"),0!==m?d&&`${d}px`:"")},updateWrapperSize:(e,s,a)=>{const{spaceBetween:r,centeredSlides:n,roundLengths:l}=i.params,{rows:o}=i.params.grid;if(i.virtualSize=(e+r)*t,i.virtualSize=Math.ceil(i.virtualSize/o)-r,i.$wrapperEl.css({[a("width")]:`${i.virtualSize+r}px`}),n){s.splice(0,s.length);const e=[];for(let t=0;t{const{slides:e}=t,s=t.params.fadeEffect;for(let a=0;a{const{transformEl:s}=t.params.fadeEffect;(s?t.slides.find(s):t.slides).transition(e),ae({swiper:t,duration:e,transformEl:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const i=(e,t,s)=>{let a=s?e.find(".swiper-slide-shadow-left"):e.find(".swiper-slide-shadow-top"),i=s?e.find(".swiper-slide-shadow-right"):e.find(".swiper-slide-shadow-bottom");0===a.length&&(a=d(`
`),e.append(a)),0===i.length&&(i=d(`
`),e.append(i)),a.length&&(a[0].style.opacity=Math.max(-t,0)),i.length&&(i[0].style.opacity=Math.max(t,0))};te({effect:"cube",swiper:t,on:a,setTranslate:()=>{const{$el:e,$wrapperEl:s,slides:a,width:r,height:n,rtlTranslate:l,size:o,browser:c}=t,p=t.params.cubeEffect,u=t.isHorizontal(),h=t.virtual&&t.params.virtual.enabled;let m,f=0;p.shadow&&(u?(m=s.find(".swiper-cube-shadow"),0===m.length&&(m=d('
'),s.append(m)),m.css({height:`${r}px`})):(m=e.find(".swiper-cube-shadow"),0===m.length&&(m=d('
'),e.append(m))));for(let e=0;e-1&&(f=90*s+90*d,l&&(f=90*-s-90*d)),t.transform(v),p.slideShadows&&i(t,d,u)}if(s.css({"-webkit-transform-origin":`50% 50% -${o/2}px`,"transform-origin":`50% 50% -${o/2}px`}),p.shadow)if(u)m.transform(`translate3d(0px, ${r/2+p.shadowOffset}px, ${-r/2}px) rotateX(90deg) rotateZ(0deg) scale(${p.shadowScale})`);else{const e=Math.abs(f)-90*Math.floor(Math.abs(f)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=p.shadowScale,a=p.shadowScale/t,i=p.shadowOffset;m.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${n/2+i}px, ${-n/2/a}px) rotateX(-90deg)`)}const g=c.isSafari||c.isWebView?-o/2:0;s.transform(`translate3d(0px,0,${g}px) rotateX(${t.isHorizontal()?0:f}deg) rotateY(${t.isHorizontal()?-f:0}deg)`),s[0].style.setProperty("--swiper-cube-translate-z",`${g}px`)},setTransition:e=>{const{$el:s,slides:a}=t;a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.cubeEffect.shadow&&!t.isHorizontal()&&s.find(".swiper-cube-shadow").transition(e)},recreateShadows:()=>{const e=t.isHorizontal();t.slides.each((t=>{const s=Math.max(Math.min(t.progress,1),-1);i(d(t),s,e)}))},getEffectParams:()=>t.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({flipEffect:{slideShadows:!0,limitRotation:!0,transformEl:null}});const i=(e,s,a)=>{let i=t.isHorizontal()?e.find(".swiper-slide-shadow-left"):e.find(".swiper-slide-shadow-top"),r=t.isHorizontal()?e.find(".swiper-slide-shadow-right"):e.find(".swiper-slide-shadow-bottom");0===i.length&&(i=ie(a,e,t.isHorizontal()?"left":"top")),0===r.length&&(r=ie(a,e,t.isHorizontal()?"right":"bottom")),i.length&&(i[0].style.opacity=Math.max(-s,0)),r.length&&(r[0].style.opacity=Math.max(s,0))};te({effect:"flip",swiper:t,on:a,setTranslate:()=>{const{slides:e,rtlTranslate:s}=t,a=t.params.flipEffect;for(let r=0;r{const{transformEl:s}=t.params.flipEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),ae({swiper:t,duration:e,transformEl:s})},recreateShadows:()=>{const e=t.params.flipEffect;t.slides.each((s=>{const a=d(s);let r=a[0].progress;t.params.flipEffect.limitRotation&&(r=Math.max(Math.min(s.progress,1),-1)),i(a,r,e)}))},getEffectParams:()=>t.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0,transformEl:null}}),te({effect:"coverflow",swiper:t,on:a,setTranslate:()=>{const{width:e,height:s,slides:a,slidesSizesGrid:i}=t,r=t.params.coverflowEffect,n=t.isHorizontal(),l=t.translate,o=n?e/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth;for(let e=0,t=a.length;e0?p:0),s.length&&(s[0].style.opacity=-p>0?-p:0)}}},setTransition:e=>{const{transformEl:s}=t.params.coverflowEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({creativeEffect:{transformEl:null,limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const i=e=>"string"==typeof e?e:`${e}px`;te({effect:"creative",swiper:t,on:a,setTranslate:()=>{const{slides:e,$wrapperEl:s,slidesSizesGrid:a}=t,r=t.params.creativeEffect,{progressMultiplier:n}=r,l=t.params.centeredSlides;if(l){const e=a[0]/2-t.params.slidesOffsetBefore||0;s.transform(`translateX(calc(50% - ${e}px))`)}for(let s=0;s0&&(f=r.prev,m=!0),u.forEach(((e,t)=>{u[t]=`calc(${e}px + (${i(f.translate[t])} * ${Math.abs(d*n)}))`})),h.forEach(((e,t)=>{h[t]=f.rotate[t]*Math.abs(d*n)})),a[0].style.zIndex=-Math.abs(Math.round(o))+e.length;const g=u.join(", "),v=`rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`,w=c<0?`scale(${1+(1-f.scale)*c*n})`:`scale(${1-(1-f.scale)*c*n})`,b=c<0?1+(1-f.opacity)*c*n:1-(1-f.opacity)*c*n,x=`translate3d(${g}) ${v} ${w}`;if(m&&f.shadow||!m){let e=a.children(".swiper-slide-shadow");if(0===e.length&&f.shadow&&(e=ie(r,a)),e.length){const t=r.shadowPerProgress?d*(1/r.limitProgress):d;e[0].style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const y=se(r,a);y.transform(x).css({opacity:b}),f.origin&&y.css("transform-origin",f.origin)}},setTransition:e=>{const{transformEl:s}=t.params.creativeEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow").transition(e),ae({swiper:t,duration:e,transformEl:s,allSlides:!0})},perspective:()=>t.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cardsEffect:{slideShadows:!0,transformEl:null,rotate:!0,perSlideRotate:2,perSlideOffset:8}}),te({effect:"cards",swiper:t,on:a,setTranslate:()=>{const{slides:e,activeIndex:s}=t,a=t.params.cardsEffect,{startTranslate:i,isTouched:r}=t.touchEventsData,n=t.translate;for(let l=0;l0&&c<1&&(r||t.params.cssMode)&&n-1&&(r||t.params.cssMode)&&n>i;if(b||x){const e=(1-Math.abs((Math.abs(c)-.5)/.5))**.5;g+=-28*c*e,f+=-.5*e,v+=96*e,h=-25*e*Math.abs(c)+"%"}if(u=c<0?`calc(${u}px + (${v*Math.abs(c)}%))`:c>0?`calc(${u}px + (-${v*Math.abs(c)}%))`:`${u}px`,!t.isHorizontal()){const e=h;h=u,u=e}const y=c<0?""+(1+(1-f)*c):""+(1-(1-f)*c),E=`\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${a.rotate?g:0}deg)\n scale(${y})\n `;if(a.slideShadows){let e=o.find(".swiper-slide-shadow");0===e.length&&(e=ie(a,o)),e.length&&(e[0].style.opacity=Math.min(Math.max((Math.abs(c)-.5)/.5,0),1))}o[0].style.zIndex=-Math.abs(Math.round(d))+e.length;se(a,o).transform(E)}},setTransition:e=>{const{transformEl:s}=t.params.cardsEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow").transition(e),ae({swiper:t,duration:e,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})}];return V.use(re),V})); +//# sourceMappingURL=swiper-bundle.min.js.map \ No newline at end of file diff --git a/learn-more/index.html b/learn-more/index.html new file mode 100644 index 0000000000..029f5a4c7a --- /dev/null +++ b/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
Key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
End-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
Content padding

+
+ +

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+ + + + + + + + + + diff --git a/livestream/index.html b/livestream/index.html new file mode 100644 index 0000000000..85603166ae --- /dev/null +++ b/livestream/index.html @@ -0,0 +1,21 @@ + + + + + + + SimpleX Chat: Power to the People + + + + + + + + + + + +

Open Livestream Q&A group link

+ + diff --git a/lottie_file/SimpleXExplainedLottie.json b/lottie_file/SimpleXExplainedLottie.json new file mode 100644 index 0000000000..8f4d07315d --- /dev/null +++ b/lottie_file/SimpleXExplainedLottie.json @@ -0,0 +1 @@ +{"ddd":0,"h":370,"w":550,"meta":{"g":"LottieFiles Figma v38"},"layers":[{"ty":4,"sr":1,"st":0,"op":10,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11,92],"t":0},{"s":[11,92],"t":9.000000357627869}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"s":[100,100],"t":9.000000357627869}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,184],"t":0},{"s":[272,184],"t":9.000000357627869}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"s":[0],"t":9.000000357627869}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[0],"t":9.000000357627869}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.58,0.64],[0,0],[0.58,0.64],[0.58,-0.64],[0,0],[0,0],[0.58,-0.64],[-0.58,-0.64],[0,0]],"o":[[0.58,0.64],[0,0],[0.58,-0.64],[-0.58,-0.64],[0,0],[0,0],[-0.58,-0.64],[-0.58,0.64],[0,0],[0,0]],"v":[[9.94,183.52],[12.06,183.52],[21.56,173.02],[21.56,170.68],[19.45,170.68],[11,180.02],[2.55,170.68],[0.44,170.68],[0.44,173.02],[9.94,183.52]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[-0.58,0.64],[0,0],[0.58,0.64],[0.58,-0.64],[0,0],[0,0],[0.58,-0.64],[-0.58,-0.64],[0,0]],"o":[[0.58,0.64],[0,0],[0.58,-0.64],[-0.58,-0.64],[0,0],[0,0],[-0.58,-0.64],[-0.58,0.64],[0,0],[0,0]],"v":[[9.94,183.52],[12.06,183.52],[21.56,173.02],[21.56,170.68],[19.45,170.68],[11,180.02],[2.55,170.68],[0.44,170.68],[0.44,173.02],[9.94,183.52]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0.58,-0.64],[0,0],[-0.58,-0.64],[-0.58,0.64],[0,0],[0,0],[-0.58,0.64],[0.58,0.64],[0,0]],"o":[[-0.58,-0.64],[0,0],[-0.58,0.64],[0.58,0.64],[0,0],[0,0],[0.58,0.64],[0.58,-0.64],[0,0],[0,0]],"v":[[12.06,0.48],[9.94,0.48],[0.44,10.98],[0.44,13.32],[2.55,13.32],[11,3.98],[19.45,13.32],[21.56,13.32],[21.56,10.98],[12.06,0.48]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0.58,-0.64],[0,0],[-0.58,-0.64],[-0.58,0.64],[0,0],[0,0],[-0.58,0.64],[0.58,0.64],[0,0]],"o":[[-0.58,-0.64],[0,0],[-0.58,0.64],[0.58,0.64],[0,0],[0,0],[0.58,0.64],[0.58,-0.64],[0,0],[0,0]],"v":[[12.06,0.48],[9.94,0.48],[0.44,10.98],[0.44,13.32],[2.55,13.32],[11,3.98],[19.45,13.32],[21.56,13.32],[21.56,10.98],[12.06,0.48]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.49,182.35],[12.49,1.65],[9.51,1.65],[9.51,182.35],[12.49,182.35]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.49,182.35],[12.49,1.65],[9.51,1.65],[9.51,182.35],[12.49,182.35]]}],"t":9.000000357627869}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7686,0.749],"t":0},{"s":[0.1059,0.7686,0.749],"t":9.000000357627869}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[100],"t":9.000000357627869}]}}],"ind":1},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[455.29,157.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[455.29,157.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[455.29,157.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[455.29,157.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[455.29,157.61],"t":35},{"s":[455.29,157.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":2},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.52,8.38],"t":62},{"s":[6.52,8.38],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.09,188.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.09,261.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.09,261.55],"t":62},{"s":[274.09,261.55],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.05,10.85],[13.05,13.91],[11.25,13.91],[11.25,16.76],[7.92,16.76],[7.92,13.91],[0,13.91],[0,10.85],[5.58,0],[9.12,0],[3.57,10.85],[7.92,10.85],[7.92,6.87],[11.25,6.87],[11.25,10.85],[13.05,10.85]]}],"t":69}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}}],"ind":3},{"ty":4,"sr":1,"st":0,"op":10,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[75.95,50.32],"t":0},{"s":[75.95,50.32],"t":9.000000357627869}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"s":[100,100],"t":9.000000357627869}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[156.74,259.06],"t":0},{"s":[156.74,259.06],"t":9.000000357627869}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.09],"t":0},{"s":[2.09],"t":9.000000357627869}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[0],"t":9.000000357627869}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0.83,-0.2],[0,0],[0.2,0.82],[-0.83,0.2],[0,0],[0,0],[-0.83,0.2],[-0.2,-0.82],[0,0]],"o":[[0.2,0.82],[0,0],[-0.83,0.2],[-0.2,-0.82],[0,0],[0,0],[-0.2,-0.82],[0.83,-0.2],[0,0],[0,0]],"v":[[151.86,95.55],[150.72,97.4],[137.24,100.6],[135.39,99.46],[136.53,97.62],[148.51,94.77],[145.66,82.84],[146.8,80.99],[148.65,82.13],[151.86,95.55]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0.83,-0.2],[0,0],[0.2,0.82],[-0.83,0.2],[0,0],[0,0],[-0.83,0.2],[-0.2,-0.82],[0,0]],"o":[[0.2,0.82],[0,0],[-0.83,0.2],[-0.2,-0.82],[0,0],[0,0],[-0.2,-0.82],[0.83,-0.2],[0,0],[0,0]],"v":[[151.86,95.55],[150.72,97.4],[137.24,100.6],[135.39,99.46],[136.53,97.62],[148.51,94.77],[145.66,82.84],[146.8,80.99],[148.65,82.13],[151.86,95.55]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.83,0.2],[0,0],[-0.2,-0.82],[0.83,-0.2],[0,0],[0,0],[0.83,-0.2],[0.2,0.82],[0,0]],"o":[[-0.2,-0.82],[0,0],[0.83,-0.2],[0.2,0.82],[0,0],[0,0],[0.2,0.82],[-0.83,0.2],[0,0],[0,0]],"v":[[0.04,5.09],[1.18,3.24],[14.66,0.04],[16.52,1.18],[15.38,3.03],[3.39,5.87],[6.25,17.8],[5.11,19.65],[3.25,18.51],[0.04,5.09]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[-0.83,0.2],[0,0],[-0.2,-0.82],[0.83,-0.2],[0,0],[0,0],[0.83,-0.2],[0.2,0.82],[0,0]],"o":[[-0.2,-0.82],[0,0],[0.83,-0.2],[0.2,0.82],[0,0],[0,0],[0.2,0.82],[-0.83,0.2],[0,0],[0,0]],"v":[[0.04,5.09],[1.18,3.24],[14.66,0.04],[16.52,1.18],[15.38,3.03],[3.39,5.87],[6.25,17.8],[5.11,19.65],[3.25,18.51],[0.04,5.09]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[149.56,97.22],[0.73,6.04],[2.35,3.43],[151.17,94.6],[149.56,97.22]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[149.56,97.22],[0.73,6.04],[2.35,3.43],[151.17,94.6],[149.56,97.22]]}],"t":9.000000357627869}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"s":[0.6078,0.5647,0.9843],"t":9.000000357627869}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[100],"t":9.000000357627869}]}}],"ind":4},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[440.29,148.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[440.29,148.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[440.29,148.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[440.29,148.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[440.29,148.61],"t":35},{"s":[440.29,148.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":5},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":62},{"s":[22.46,22.46],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[352.46,188.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,261.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,261.46],"t":62},{"s":[274.46,261.46],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":69}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":62},{"s":[1.99521005153656],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":6},{"ty":4,"sr":1,"st":0,"op":10,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[76.5,51],"t":0},{"s":[76.5,51],"t":9.000000357627869}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"s":[100,100],"t":9.000000357627869}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[388.5,117],"t":0},{"s":[388.5,117],"t":9.000000357627869}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"s":[0],"t":9.000000357627869}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[0],"t":9.000000357627869}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0.83,-0.2],[0,0],[0.2,0.84],[-0.83,0.2],[0,0],[0,0],[-0.83,0.2],[-0.2,-0.84],[0,0]],"o":[[0.2,0.84],[0,0],[-0.83,0.2],[-0.2,-0.83],[0,0],[0,0],[-0.2,-0.84],[0.83,-0.2],[0,0],[0,0]],"v":[[152.96,96.84],[151.81,98.72],[138.23,101.96],[136.37,100.81],[137.51,98.93],[149.58,96.05],[146.71,83.96],[147.86,82.09],[149.72,83.24],[152.96,96.84]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0.83,-0.2],[0,0],[0.2,0.84],[-0.83,0.2],[0,0],[0,0],[-0.83,0.2],[-0.2,-0.84],[0,0]],"o":[[0.2,0.84],[0,0],[-0.83,0.2],[-0.2,-0.83],[0,0],[0,0],[-0.2,-0.84],[0.83,-0.2],[0,0],[0,0]],"v":[[152.96,96.84],[151.81,98.72],[138.23,101.96],[136.37,100.81],[137.51,98.93],[149.58,96.05],[146.71,83.96],[147.86,82.09],[149.72,83.24],[152.96,96.84]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.83,0.2],[0,0],[-0.2,-0.84],[0.83,-0.2],[0,0],[0,0],[0.83,-0.2],[0.2,0.84],[0,0]],"o":[[-0.2,-0.84],[0,0],[0.83,-0.2],[0.2,0.84],[0,0],[0,0],[0.2,0.83],[-0.83,0.2],[0,0],[0,0]],"v":[[0.04,5.16],[1.19,3.28],[14.77,0.04],[16.64,1.19],[15.49,3.07],[3.42,5.95],[6.29,18.04],[5.15,19.91],[3.28,18.76],[0.04,5.16]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[-0.83,0.2],[0,0],[-0.2,-0.84],[0.83,-0.2],[0,0],[0,0],[0.83,-0.2],[0.2,0.84],[0,0]],"o":[[-0.2,-0.84],[0,0],[0.83,-0.2],[0.2,0.84],[0,0],[0,0],[0.2,0.83],[-0.83,0.2],[0,0],[0,0]],"v":[[0.04,5.16],[1.19,3.28],[14.77,0.04],[16.64,1.19],[15.49,3.07],[3.42,5.95],[6.29,18.04],[5.15,19.91],[3.28,18.76],[0.04,5.16]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[150.64,98.53],[0.74,6.12],[2.36,3.47],[152.26,95.88],[150.64,98.53]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[150.64,98.53],[0.74,6.12],[2.36,3.47],[152.26,95.88],[150.64,98.53]]}],"t":9.000000357627869}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"s":[0.8039,0.3608,0.6824],"t":9.000000357627869}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[100],"t":9.000000357627869}]}}],"ind":7},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[424.29,138.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[424.29,138.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[424.29,138.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[424.29,138.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[424.29,138.61],"t":35},{"s":[424.29,138.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":8},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.87,8.55],"t":62},{"s":[5.87,8.55],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[193.9,188.72],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.9,187.72],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.9,187.72],"t":62},{"s":[273.9,187.72],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-0.7,-0.85],[0,-1.18],[1.17,-0.97],[1.68,0],[1.04,0.59],[0.46,1.17],[0,0],[-1.53,0],[-0.46,0.4],[0,0.7],[0.48,0.42],[0.85,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.13,0.34],[0.72,0.83],[0,1.72],[-1.15,0.97],[-1.31,0],[-1.02,-0.61],[0,0],[0.42,1.29],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.9,6.8],[10.65,8.57],[11.73,11.59],[9.98,15.63],[5.75,17.09],[2.23,16.21],[0,13.55],[2.83,11.92],[5.75,13.86],[7.71,13.26],[8.43,11.59],[7.71,9.94],[5.75,9.31],[5.03,9.31],[3.76,7.4],[7.06,3.09],[0.5,3.09],[0.5,0],[11.04,0],[11.04,2.73],[7.9,6.8]]}],"t":69}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}}],"ind":9},{"ty":4,"sr":1,"st":0,"op":10,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[76.68,49],"t":0},{"s":[76.68,49],"t":9.000000357627869}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"s":[100,100],"t":9.000000357627869}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[160.39,116.12],"t":0},{"s":[160.39,116.12],"t":9.000000357627869}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-0.84],"t":0},{"s":[-0.84],"t":9.000000357627869}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[0],"t":9.000000357627869}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-0.84,-0.19],[0,0],[-0.2,0.8],[0.84,0.19],[0,0],[0,0],[0.83,0.19],[0.2,-0.8],[0,0]],"o":[[-0.2,0.8],[0,0],[0.84,0.19],[0.2,-0.8],[0,0],[0,0],[0.2,-0.8],[-0.84,-0.19],[0,0],[0,0]],"v":[[0.04,93.05],[1.19,94.85],[14.8,97.96],[16.67,96.86],[15.52,95.06],[3.43,92.29],[6.31,80.67],[5.16,78.87],[3.28,79.98],[0.04,93.05]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[-0.84,-0.19],[0,0],[-0.2,0.8],[0.84,0.19],[0,0],[0,0],[0.83,0.19],[0.2,-0.8],[0,0]],"o":[[-0.2,0.8],[0,0],[0.84,0.19],[0.2,-0.8],[0,0],[0,0],[0.2,-0.8],[-0.84,-0.19],[0,0],[0,0]],"v":[[0.04,93.05],[1.19,94.85],[14.8,97.96],[16.67,96.86],[15.52,95.06],[3.43,92.29],[6.31,80.67],[5.16,78.87],[3.28,79.98],[0.04,93.05]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0.84,0.19],[0,0],[0.2,-0.8],[-0.84,-0.19],[0,0],[0,0],[-0.84,-0.19],[-0.2,0.8],[0,0]],"o":[[0.2,-0.8],[0,0],[-0.84,-0.19],[-0.2,0.8],[0,0],[0,0],[-0.2,0.8],[0.84,0.19],[0,0],[0,0]],"v":[[153.32,4.95],[152.16,3.16],[138.56,0.04],[136.68,1.15],[137.84,2.95],[149.93,5.71],[147.05,17.33],[148.2,19.13],[150.07,18.03],[153.32,4.95]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0.84,0.19],[0,0],[0.2,-0.8],[-0.84,-0.19],[0,0],[0,0],[-0.84,-0.19],[-0.2,0.8],[0,0]],"o":[[0.2,-0.8],[0,0],[-0.84,-0.19],[-0.2,0.8],[0,0],[0,0],[-0.2,0.8],[0.84,0.19],[0,0],[0,0]],"v":[[153.32,4.95],[152.16,3.16],[138.56,0.04],[136.68,1.15],[137.84,2.95],[149.93,5.71],[147.05,17.33],[148.2,19.13],[150.07,18.03],[153.32,4.95]]}],"t":9.000000357627869}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.37,94.67],[152.62,5.88],[150.99,3.34],[0.74,92.12],[2.37,94.67]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.37,94.67],[152.62,5.88],[150.99,3.34],[0.74,92.12],[2.37,94.67]]}],"t":9.000000357627869}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"s":[0.0039,0.5922,1],"t":9.000000357627869}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"s":[100],"t":9.000000357627869}]}}],"ind":10},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[408.29,128.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[408.29,128.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[408.29,128.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[408.29,128.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[408.29,128.61],"t":35},{"s":[408.29,128.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":11},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":62},{"s":[22.46,22.46],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[194.46,188.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,187.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,187.46],"t":62},{"s":[274.46,187.46],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":69}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":62},{"s":[1.99521005153656],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":12},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":35},{"s":[11.28,4.08],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.62,187.99],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.62,187.99],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.62,187.99],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.62,187.99],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.61,187.99],"t":35},{"s":[503.61,187.99],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":35},{"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":2,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":13},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[391.29,118.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[391.29,118.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[391.29,118.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[391.29,118.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[391.29,118.61],"t":35},{"s":[391.29,118.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":14},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":35},{"s":[5.65,5.65],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.73,175.34],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.73,175.34],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.73,175.34],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.73,175.34],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503.73,175.34],"t":35},{"s":[503.73,175.34],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":35},{"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":15},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[375.29,108.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[375.29,108.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[375.29,108.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[375.29,108.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[375.29,108.61],"t":35},{"s":[375.29,108.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":16},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":35},{"s":[39.8,39.8],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":35},{"s":[504.39,182.94],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":35},{"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":43.500001430511475}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":35},{"s":[1],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":17},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[360.29,99.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[360.29,99.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[360.29,99.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[360.29,99.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[360.29,99.61],"t":35},{"s":[360.29,99.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":18},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":35},{"s":[32.2,32.2],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[504.39,182.94],"t":35},{"s":[504.39,182.94],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":35},{"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":43.500001430511475}]}},{"ty":"gf","e":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":35},{"s":[-13.699600219726562,26.33049964904785],"t":43.500001430511475}]},"g":{"p":2,"k":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":35},{"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":43.500001430511475}]}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":35},{"s":[63.45000076293945,-0.000013368699910643045],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":19},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.29,89.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.29,89.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.29,89.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.29,89.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.29,89.61],"t":35},{"s":[344.29,89.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":20},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":35},{"s":[11.28,4.08],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,329.51],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,329.51],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,329.51],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,329.51],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,329.51],"t":35},{"s":[272.53,329.51],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":35},{"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":2,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":21},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[329.29,80.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[329.29,80.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[329.29,80.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[329.29,80.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[329.29,80.61],"t":35},{"s":[329.29,80.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":22},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":35},{"s":[5.65,5.65],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,316.85],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,316.85],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,316.85],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,316.85],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.65,316.85],"t":35},{"s":[272.65,316.85],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":35},{"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":23},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[315.29,71.61],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[315.29,71.61],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[315.29,71.61],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[315.29,71.61],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[315.29,71.61],"t":35},{"s":[315.29,71.61],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[31.32],"t":35},{"s":[31.32],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"s":[0.8039,0.3608,0.6824],"t":43.500001430511475}]}}],"ind":24},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":35},{"s":[39.8,39.8],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.46],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.46],"t":35},{"s":[273.3,324.46],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":35},{"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":43.500001430511475}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":35},{"s":[1],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":25},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,271.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,271.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,271.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,271.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,271.02],"t":35},{"s":[272,271.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":26},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":35},{"s":[32.2,32.2],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.45],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.45],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.45],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.45],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,324.45],"t":35},{"s":[273.3,324.45],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":35},{"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":43.500001430511475}]}},{"ty":"gf","e":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":35},{"s":[-13.699600219726562,26.33049964904785],"t":43.500001430511475}]},"g":{"p":2,"k":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":35},{"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":43.500001430511475}]}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":35},{"s":[63.45000076293945,-0.000013368699910643045],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":27},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,253.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,253.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,253.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,253.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,253.02],"t":35},{"s":[272,253.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":28},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":35},{"s":[11.28,4.08],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.02,189.78],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.02,189.78],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.02,189.78],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.02,189.78],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.02,189.78],"t":35},{"s":[45.02,189.78],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":35},{"s":[{"c":true,"i":[[0,0],[0,0],[-5.26,0],[-1.56,-4.74]],"o":[[0,0],[1.56,-4.74],[5.26,0],[0,0]],"v":[[22.57,8.17],[0,8.17],[11.28,0],[22.57,8.17]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":2,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":29},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,233.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,233.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,233.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,233.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,233.02],"t":35},{"s":[272,233.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":30},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":35},{"s":[5.65,5.65],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.14,177.13],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.14,177.13],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.14,177.13],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.14,177.13],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.14,177.13],"t":35},{"s":[45.14,177.13],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":35},{"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":31},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,214.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,214.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,214.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,214.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,214.02],"t":35},{"s":[272,214.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":32},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":35},{"s":[39.8,39.8],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":35},{"s":[45.8,184.73],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":35},{"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":43.500001430511475}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":35},{"s":[1],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":33},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,194.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,194.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,194.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,194.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,194.02],"t":35},{"s":[272,194.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":34},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":35},{"s":[32.2,32.2],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[45.8,184.73],"t":35},{"s":[45.8,184.73],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":35},{"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":43.500001430511475}]}},{"ty":"gf","e":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":35},{"s":[-13.699600219726562,26.33049964904785],"t":43.500001430511475}]},"g":{"p":2,"k":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":35},{"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":43.500001430511475}]}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":35},{"s":[63.45000076293945,-0.000013368699910643045],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":35},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,173.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,173.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,173.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,173.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,173.02],"t":35},{"s":[272,173.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":36},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.28,4.08],"t":35},{"s":[11.28,4.08],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,51.85],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,51.85],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,51.85],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,51.85],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.53,51.85],"t":35},{"s":[272.53,51.85],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":35},{"s":[{"c":true,"i":[[0,0],[0,0],[5.26,0],[1.56,-4.74]],"o":[[0,0],[-1.56,-4.74],[-5.26,0],[0,0]],"v":[[0,8.17],[22.57,8.17],[11.28,0],[0,8.17]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":2,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":37},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,154.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,154.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,154.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,154.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,154.02],"t":35},{"s":[272,154.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":38},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.65,5.65],"t":35},{"s":[5.65,5.65],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,39.19],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,39.19],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,39.19],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.64,39.19],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272.65,39.19],"t":35},{"s":[272.65,39.19],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":35},{"s":[{"c":true,"i":[[-3.12,0],[0,-3.12],[3.12,0],[0,3.12]],"o":[[3.12,0],[0,3.12],[-3.12,0],[0,-3.12]],"v":[[5.65,0],[11.31,5.65],[5.65,11.31],[0,5.65]]}],"t":43.500001430511475}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":35},{"s":[1,1,1],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":39},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,134.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,134.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,134.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,134.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,134.02],"t":35},{"s":[272,134.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":40},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[39.8,39.8],"t":35},{"s":[39.8,39.8],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.8],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.8],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.8],"t":35},{"s":[273.3,46.8],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":35},{"s":[{"c":true,"i":[[-21.96,0],[0,-21.96],[21.96,0],[0,21.96]],"o":[[21.96,0],[0,21.96],[-21.96,0],[0,-21.96]],"v":[[39.8,0],[79.59,39.8],[39.8,79.59],[0,39.8]]}],"t":43.500001430511475}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1],"t":35},{"s":[1],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":41},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,116.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,116.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,116.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,116.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,116.02],"t":35},{"s":[272,116.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":42},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[32.2,32.2],"t":35},{"s":[32.2,32.2],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.79],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.79],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.79],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.79],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.3,46.79],"t":35},{"s":[273.3,46.79],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"s":[0],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":35},{"s":[{"c":true,"i":[[-17.77,0],[0,-17.77],[17.77,0],[0,17.77]],"o":[[17.77,0],[0,17.77],[-17.77,0],[0,-17.77]],"v":[[32.2,0],[64.4,32.2],[32.2,64.4],[0,32.2]]}],"t":43.500001430511475}]}},{"ty":"gf","e":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-13.699600219726562,26.33049964904785],"t":35},{"s":[-13.699600219726562,26.33049964904785],"t":43.500001430511475}]},"g":{"p":2,"k":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":35},{"s":[0,0.32499998807907104,0.7569999098777771,1,1,0,0.32549020648002625,0.8156862854957581],"t":43.500001430511475}]}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[63.45000076293945,-0.000013368699910643045],"t":35},{"s":[63.45000076293945,-0.000013368699910643045],"t":43.500001430511475}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]}}],"ind":43},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,98.02],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,98.02],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,98.02],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,98.02],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[272,98.02],"t":35},{"s":[272,98.02],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[90],"t":35},{"s":[90],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"s":[0.1059,0.7647,0.749],"t":43.500001430511475}]}}],"ind":44},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[89.16,214.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[89.16,214.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[89.16,214.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[89.16,214.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[89.16,214.82],"t":35},{"s":[89.16,214.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":45},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[104.16,224.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[104.16,224.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[104.16,224.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[104.16,224.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[104.16,224.82],"t":35},{"s":[104.16,224.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":46},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[120.16,234.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[120.16,234.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[120.16,234.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[120.16,234.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[120.16,234.82],"t":35},{"s":[120.16,234.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":47},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.16,244.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.16,244.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.16,244.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.16,244.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.16,244.82],"t":35},{"s":[135.16,244.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":48},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[152.16,255.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[152.16,255.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[152.16,255.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[152.16,255.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[152.16,255.82],"t":35},{"s":[152.16,255.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":49},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.16,265.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.16,265.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.16,265.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.16,265.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.16,265.82],"t":35},{"s":[168.16,265.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":50},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[183.16,275.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[183.16,275.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[183.16,275.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[183.16,275.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[183.16,275.82],"t":35},{"s":[183.16,275.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":51},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[198.16,285.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[198.16,285.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[198.16,285.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[198.16,285.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[198.16,285.82],"t":35},{"s":[198.16,285.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":52},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[213.16,295.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[213.16,295.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[213.16,295.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[213.16,295.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[213.16,295.82],"t":35},{"s":[213.16,295.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":53},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[227.16,304.82],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[227.16,304.82],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[227.16,304.82],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[227.16,304.82],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[227.16,304.82],"t":35},{"s":[227.16,304.82],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[34.1],"t":35},{"s":[34.1],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"s":[0.6078,0.5647,0.9843],"t":43.500001430511475}]}}],"ind":54},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[229.27,73.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[229.27,73.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[229.27,73.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[229.27,73.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[229.27,73.65],"t":35},{"s":[229.27,73.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":55},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[215.27,82.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[215.27,82.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[215.27,82.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[215.27,82.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[215.27,82.65],"t":35},{"s":[215.27,82.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":56},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.27,91.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.27,91.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.27,91.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.27,91.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.27,91.65],"t":35},{"s":[200.27,91.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":57},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[184.27,101.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[184.27,101.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[184.27,101.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[184.27,101.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[184.27,101.65],"t":35},{"s":[184.27,101.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":58},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[166.27,112.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[166.27,112.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[166.27,112.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[166.27,112.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[166.27,112.65],"t":35},{"s":[166.27,112.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":59},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[151.27,121.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[151.27,121.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[151.27,121.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[151.27,121.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[151.27,121.65],"t":35},{"s":[151.27,121.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":60},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[134.27,131.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[134.27,131.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[134.27,131.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[134.27,131.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[134.27,131.65],"t":35},{"s":[134.27,131.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":61},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[118.27,141.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[118.27,141.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[118.27,141.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[118.27,141.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[118.27,141.65],"t":35},{"s":[118.27,141.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":62},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.27,151.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.27,151.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.27,151.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.27,151.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.27,151.65],"t":35},{"s":[102.27,151.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":63},{"ty":4,"sr":1,"st":0,"op":45,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.02,0],"t":35},{"s":[5.02,0],"t":43.500001430511475}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"s":[100,100],"t":43.500001430511475}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[87.27,160.65],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[87.27,160.65],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[87.27,160.65],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[87.27,160.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[87.27,160.65],"t":35},{"s":[87.27,160.65],"t":43.500001430511475}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[148.15],"t":35},{"s":[148.15],"t":43.500001430511475}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[0],"t":43.500001430511475}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":35},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.05,0]]}],"t":43.500001430511475}]}},{"ty":"st","lc":2,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"s":[100],"t":43.500001430511475}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":35},{"s":[2.990000009536743],"t":43.500001430511475}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"s":[0.0039,0.5922,1],"t":43.500001430511475}]}}],"ind":64},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[3.64,8.38],"t":62},{"s":[3.64,8.38],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[111.28,42.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.28,39.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.28,39.55],"t":62},{"s":[273.28,39.55],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.41,0],[7.28,0],[7.28,16.76],[3.97,16.76],[3.97,3.5],[0.81,4.38],[0,1.56],[4.41,0]]}],"t":69}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}}],"ind":65},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":62},{"s":[22.46,22.46],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[112.46,42.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,39.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,39.46],"t":62},{"s":[274.46,39.46],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":69}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":62},{"s":[1.99521005153656],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":66},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.91,8.55],"t":62},{"s":[5.91,8.55],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[113.96,315.71],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.96,335.71],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.96,335.71],"t":62},{"s":[273.96,335.71],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.1,-0.97],[0,-1.72],[1.17,-0.97],[1.68,0],[1.04,0.61],[0.46,1.18],[0,0],[-1.6,0],[-0.46,0.4],[0,0.7],[0.46,0.42],[0.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.61,0],[1.1,0.96],[0,1.72],[-1.15,0.97],[-1.36,0],[-1.04,-0.61],[0,0],[0.42,1.34],[0.85,0],[0.48,-0.42],[0,-0.69],[-0.46,-0.42],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.11,6.11],[10.18,7.57],[11.83,11.59],[10.08,15.63],[5.84,17.09],[2.25,16.19],[0,13.5],[2.83,11.85],[5.84,13.86],[7.81,13.26],[8.52,11.59],[7.83,9.94],[5.94,9.31],[0.86,9.31],[1.53,0],[11.04,0],[11.04,3.09],[4.6,3.09],[4.38,6.11],[6.11,6.11]]}],"t":69}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}}],"ind":67},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":62},{"s":[22.46,22.46],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[114.46,315.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,335.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,335.46],"t":62},{"s":[274.46,335.46],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":69}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":62},{"s":[1.99521005153656],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":68},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[5.66,8.55],"t":62},{"s":[5.66,8.55],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.84,43.38],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.84,113.38],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[273.84,113.38],"t":62},{"s":[273.84,113.38],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0.89],[0.42,0.4],[0.64,0],[0.61,-1.31],[0,0],[-0.99,0.61],[-1.18,0],[-1.09,-0.96],[0,-1.61],[1.84,-1.84],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.28,-1.34],[0,-0.65],[-0.4,-0.4],[-1.26,0],[0,0],[0.53,-1.15],[0.99,-0.61],[1.52,0],[1.09,0.94],[0,1.74],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.12,17.09],[0.12,14.63],[5.84,8.74],[7.76,5.39],[7.13,3.81],[5.58,3.21],[2.78,5.17],[0,3.54],[2.27,0.91],[5.53,0],[9.43,1.44],[11.06,5.27],[8.31,10.63],[5.03,13.91],[11.32,13.91],[11.32,17.09],[0.12,17.09]]}],"t":69}]}},{"ty":"fl","c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]},"r":1,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}}],"ind":69},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[22.46,22.46],"t":62},{"s":[22.46,22.46],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[430.46,43.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,113.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.46,113.46],"t":62},{"s":[274.46,113.46],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":62},{"s":[0],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":62},{"s":[{"c":true,"i":[[0,0],[-1.22,0],[0,0],[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22]],"o":[[0,-1.22],[0,0],[1.22,0],[0,0],[0,1.22],[0,0],[-1.22,0],[0,0]],"v":[[0,2.2],[2.2,0],[42.71,0],[44.92,2.2],[44.92,42.71],[42.71,44.92],[2.2,44.92],[0,42.71]]}],"t":69}]}},{"ty":"st","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[1.99521005153656],"t":62},{"s":[1.99521005153656],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":70},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.9,29.07],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[30.47,18.68],"t":62},{"s":[30.47,18.68],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[125.54,51.08],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[125.54,51.08],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[125.54,51.08],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.22,29.32],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[188.56,28.09],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[188.56,28.09],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[346.82,56.63],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.23,40.33],"t":62},{"s":[342.23,40.33],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-105.97],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-105.97],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-105.97],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-73.63],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-61.8],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-61.8],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-30.19],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-30.19],"t":62},{"s":[-30.19],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.79,48.15],[29.29,58.15]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[58.59,26.56],[60.94,35.45]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[58.59,26.56],[60.94,35.45]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,58.15],[18.29,50.65]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[60.94,35.45],[52.3,37.37]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[60.94,35.45],[52.3,37.37]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[29.29,58.15],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[24.63,14.33]],"o":[[-9.51,-5.53],[0,0]],"v":[[60.94,35.45],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[24.63,14.33]],"o":[[-9.51,-5.53],[0,0]],"v":[[60.94,35.45],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":71},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.72,30.72],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.17,32.6],"t":62},{"s":[15.17,32.6],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[250.86,42.05],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[250.86,42.05],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[250.86,42.05],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[234.1,107.16],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[228.59,117.52],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[228.59,117.52],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[345.01,195.14],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.42,187.36],"t":62},{"s":[342.42,187.36],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[23.8],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[23.8],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[23.8],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[44.86],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[47.89],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[47.89],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-67.65],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-67.65],"t":62},{"s":[-67.65],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.43,52.12],[21,61.45]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.35,56.72],[26.81,65.2]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.35,56.72],[26.81,65.2]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21,61.45],[9.93,54.62]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.81,65.2],[18.33,61.66]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.81,65.2],[18.33,61.66]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.17,28.31]],"o":[[-1.17,-11],[0,0]],"v":[[21,61.45],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[11.98,29.13]],"o":[[-4.18,-10.17],[0,0]],"v":[[26.81,65.2],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[11.98,29.13]],"o":[[-4.18,-10.17],[0,0]],"v":[[26.81,65.2],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":72},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[20.02,28.48],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.24,35.19],"t":62},{"s":[6.24,35.19],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[46.68,179.19],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[46.68,179.19],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[46.68,179.19],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[53.79,113.12],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[61.57,98.86],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[61.57,98.86],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[201.57,50.35],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.36,37.62],"t":62},{"s":[208.36,37.62],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-161.01],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-161.01],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-161.01],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-127.01],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-118.35],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-118.35],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-86.74],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-86.74],"t":62},{"s":[-86.74],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[40.03,46.37],[32.9,56.96]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.48,63.53],[6.36,70.39]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.48,63.53],[6.36,70.39]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.9,56.96],[20.53,48.87]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.36,70.39],[0,64.24]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.36,70.39],[0,64.24]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[32.9,56.96],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[1.25,21.96]],"o":[[-0.62,-10.98],[0,0]],"v":[[6.36,70.39],[2.36,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[1.25,21.96]],"o":[[-0.62,-10.98],[0,0]],"v":[[6.36,70.39],[2.36,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":73},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.22,31.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.72,32.34],"t":62},{"s":[15.72,32.34],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[196.65,172.86],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[196.65,172.86],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[196.65,172.86],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[138.56,189.53],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[126.01,190.46],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[126.01,190.46],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[207.61,187.45],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.92,187.45],"t":62},{"s":[208.92,187.45],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[85.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[85.1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[85.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100.09],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[103.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[103.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-66.55],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-66.55],"t":62},{"s":[-66.55],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.44,53.1],[19.94,63.1]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.43,56.13],[28.06,64.68]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.43,56.13],[28.06,64.68]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.94,63.1],[8.94,55.6]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.06,64.68],[19.51,61.3]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.06,64.68],[19.51,61.3]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.43,19.33]],"o":[[-1.17,-11],[0,0]],"v":[[19.94,63.1],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[8.56,19.72]],"o":[[-4.18,-9.63],[0,0]],"v":[[28.06,64.68],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[8.56,19.72]],"o":[[-4.18,-9.63],[0,0]],"v":[[28.06,64.68],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.0039,0.5922,1],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":74},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[19.5,28.75],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.25,35.23],"t":62},{"s":[6.25,35.23],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[281.59,46.83],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[281.59,46.83],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[281.59,46.83],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.33,22.91],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[356.73,22.89],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[356.73,22.89],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.34,123.66],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.27,113.14],"t":62},{"s":[208.27,113.14],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-103.89],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-103.89],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-103.89],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-64.71],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-57.52],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-57.52],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-91.77],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-91.77],"t":62},{"s":[-91.77],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39,47.5],[30.5,57.5]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.49,64.17],[5.8,70.47]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.49,64.17],[5.8,70.47]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.5,57.5],[19.5,50]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.8,70.47],[0,63.78]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.8,70.47],[0,63.78]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[30.5,57.5],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.77,24.99]],"o":[[0.36,-11.49],[0,0]],"v":[[5.8,70.47],[7.97,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[-0.77,24.99]],"o":[[0.36,-11.49],[0,0]],"v":[[5.8,70.47],[7.97,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":75},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[18.23,29.2],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[28.07,21.75],"t":62},{"s":[28.07,21.75],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.02,51.93],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.02,51.93],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429.02,51.93],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[473.71,90.76],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[479.23,102.21],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[479.23,102.21],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[346.23,120.27],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.01,112.84],"t":62},{"s":[342.01,112.84],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-41.62],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-41.62],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-41.62],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-9.31],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-2.97],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-2.97],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-37.23],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-37.23],"t":62},{"s":[-37.23],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[36.45,48.39],[27.95,58.39]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[54.89,33.54],[56.13,42.65]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[54.89,33.54],[56.13,42.65]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.95,58.39],[16.95,50.89]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.13,42.65],[47.33,43.5]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.13,42.65],[47.33,43.5]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[21.6,19.6]],"o":[[-1.17,-11],[0,0]],"v":[[27.95,58.39],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[23.09,17.54]],"o":[[-12.34,-9.38],[0,0]],"v":[[56.13,42.65],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[23.09,17.54]],"o":[[-12.34,-9.38],[0,0]],"v":[[56.13,42.65],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":76},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.53,31.52],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.9,32.73],"t":62},{"s":[14.9,32.73],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503,174.54],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503,174.54],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[503,174.54],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[429,186.54],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[420.01,188.03],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[420.01,188.03],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[341,274.46],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.42,268.32],"t":62},{"s":[342.42,268.32],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[92.78],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[92.78],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[92.78],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[105.65],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[105.65],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[105.65],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-68.2],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-68.2],"t":62},{"s":[-68.2],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.07,53.03],[18.57,63.03]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.8,57.01],[26.18,65.46]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.8,57.01],[26.18,65.46]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.57,63.03],[7.57,55.53]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.18,65.46],[17.73,61.84]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.18,65.46],[17.73,61.84]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.46,17.08]],"o":[[-1.17,-11],[0,0]],"v":[[18.57,63.03],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[7.05,17.64]],"o":[[-4.08,-10.21],[0,0]],"v":[[26.18,65.46],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[7.05,17.64]],"o":[[-4.08,-10.21],[0,0]],"v":[[26.18,65.46],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":77},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.87,32.92],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[7.84,34.88],"t":62},{"s":[7.84,34.88],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[346.27,157.9],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[346.27,157.9],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[346.27,157.9],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[340.2,131.95],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[331.59,114.9],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[331.59,114.9],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[207.29,280.43],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.65,272.72],"t":62},{"s":[208.65,272.72],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[164.44],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[164.44],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[164.44],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[146.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[136.72],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[136.72],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-98.3],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-98.3],"t":62},{"s":[-98.3],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.7,55.68],[10.51,65.83]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.3,64.69],[5.49,69.76]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.3,64.69],[5.49,69.76]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.51,65.83],[0,57.54]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.49,69.76],[0,62.39]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.49,69.76],[0,62.39]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-16.56,25.61]],"o":[[-1.17,-11],[0,0]],"v":[[10.51,65.83],[23.75,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-4.26,29.19]],"o":[[2.09,-14.35],[0,0]],"v":[[5.49,69.76],[15.67,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[-4.26,29.19]],"o":[[2.09,-14.35],[0,0]],"v":[[5.49,69.76],[15.67,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.8039,0.3608,0.6824],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":78},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[17.08,30.68],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[16.91,31.77],"t":62},{"s":[16.91,31.77],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[260.83,59.74],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[260.83,59.74],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[260.83,59.74],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[304.05,113.7],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[309.49,125.22],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[309.49,125.22],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[341.47,248.69],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.46,250.03],"t":62},{"s":[342.46,250.03],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-20.73],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-20.73],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-20.73],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-7.73],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-4.59],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-4.59],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-64.31],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-64.31],"t":62},{"s":[-64.31],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[34.16,49.39],[27.18,61.37]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[33.82,55.31],[30.56,63.53]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[33.82,55.31],[30.56,63.53]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[27.18,61.37],[16.18,53.87]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.56,63.53],[21.89,60.49]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.56,63.53],[21.89,60.49]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.89,20.76]],"o":[[-1.17,-11],[0,0]],"v":[[27.18,61.37],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.4,21.63]],"o":[[-4.55,-9.46],[0,0]],"v":[[30.56,63.53],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[10.4,21.63]],"o":[[-4.55,-9.46],[0,0]],"v":[[30.56,63.53],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":79},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.28,30.99],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[11.93,33.89],"t":62},{"s":[11.93,33.89],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[353.54,179.55],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[353.54,179.55],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[353.54,179.55],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[331.79,244.22],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[327.08,254.78],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[327.08,254.78],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[206.72,248.19],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.86,249.36],"t":62},{"s":[208.86,249.36],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.21],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.21],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.21],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[43.98],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[46.09],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[46.09],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-74.02],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-74.02],"t":62},{"s":[-74.02],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[28.56,51.08],[20.63,61.98]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.87,59.74],[19.41,67.78]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.87,59.74],[19.41,67.78]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.63,61.98],[9.88,54.62]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.41,67.78],[11.85,63.18]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.41,67.78],[11.85,63.18]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[15.11,31.89]],"o":[[-1.17,-11],[0,0]],"v":[[20.63,61.98],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[9.63,33.65]],"o":[[-3.03,-10.58],[0,0]],"v":[[19.41,67.78],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[9.63,33.65]],"o":[[-3.03,-10.58],[0,0]],"v":[[19.41,67.78],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":80},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.65,30.64],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[14.88,32.74],"t":62},{"s":[14.88,32.74],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[284.77,311.89],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[284.77,311.89],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[284.77,311.89],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[239.93,259.35],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[231.26,245.74],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[231.26,245.74],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[345.96,174.96],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.42,168.81],"t":62},{"s":[342.42,168.81],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[150.7],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[150.7],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[150.7],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[164.27],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.94],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[168.94],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-68.25],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-68.25],"t":62},{"s":[-68.25],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.29,51.28],[20.79,61.28]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.75,57.03],[26.12,65.48]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.75,57.03],[26.12,65.48]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.79,61.28],[9.79,53.78]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.12,65.48],[18.14,61.67]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.12,65.48],[18.14,61.67]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[10.58,18.88]],"o":[[-1.17,-11],[0,0]],"v":[[20.79,61.28],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[7.97,19.97]],"o":[[-4.63,-11.61],[0,0]],"v":[[26.12,65.48],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[7.97,19.97]],"o":[[-4.63,-11.61],[0,0]],"v":[[26.12,65.48],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":81},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.75,33.03],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.5,35.25],"t":62},{"s":[6.5,35.25],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[192.3,195.06],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[192.3,195.06],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[192.3,195.06],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[239.08,147.99],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[244.39,134.24],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[244.39,134.24],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[207.72,166.27],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.25,170.43],"t":62},{"s":[208.25,170.43],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-131.1],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-131.1],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-131.1],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-154.36],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-157.49],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-157.49],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-89.86],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-89.86],"t":62},{"s":[-89.86],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.5,56.05],[11,66.05]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,63.98],[6.52,70.5]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,63.98],[6.52,70.5]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.05],[0,58.55]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.52,70.5],[0,64.02]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.52,70.5],[0,64.02]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-8.01,27.68]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.05],[14.33,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0.07,27]],"o":[[-0.03,-11],[0,0]],"v":[[6.52,70.5],[6.34,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0.07,27]],"o":[[-0.03,-11],[0,0]],"v":[[6.52,70.5],[6.34,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.1059,0.7647,0.749],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":82},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.24,33.48],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[7.03,35],"t":62},{"s":[7.03,35],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.6,188.41],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.6,188.41],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[29.6,188.41],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[52.73,252.4],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[60.33,265.1],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[60.33,265.1],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.08,324.23],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.59,336.68],"t":62},{"s":[208.59,336.68],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-7.63],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-7.63],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-7.63],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-23.3],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-25.74],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-25.74],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-63.44],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-83.18],"t":62},{"s":[-83.18],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.47,55.04],[11,66.96]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[14.06,62.77],[8.38,70]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[14.06,62.77],[8.38,70]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11,66.96],[0,59.46]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[8.38,70],[1.15,64.32]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[8.38,70],[1.15,64.32]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-0.49,43.62]],"o":[[-1.17,-11],[0,0]],"v":[[11,66.96],[4.49,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[5.17,43.19]],"o":[[-1.31,-10.92],[0,0]],"v":[[8.38,70],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[5.17,43.19]],"o":[[-1.31,-10.92],[0,0]],"v":[[8.38,70],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":83},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[9.2,33.04],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[6.49,35.22],"t":62},{"s":[6.49,35.22],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[103.19,315.04],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[103.19,315.04],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[103.19,315.04],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[169.76,335.27],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[185.94,336.74],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[185.94,336.74],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[344.62,328.56],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[341.8,340.72],"t":62},{"s":[341.8,340.72],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-69.81],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-69.81],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-69.81],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-84.6],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-88.71],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-88.71],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-116.7],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-92.44],"t":62},{"s":[-92.44],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.4,56.27],[10.69,66.09]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.99,64.22],[6.22,70.44]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.99,64.22],[6.22,70.44]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.69,66.09],[0,57.82]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.22,70.44],[0,63.67]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[6.22,70.44],[0,63.67]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-6.81,30.66]],"o":[[-1.17,-11],[0,0]],"v":[[10.69,66.09],[13.7,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[-1.32,30.97]],"o":[[0.49,-11.49],[0,0]],"v":[[6.22,70.44],[9.22,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[-1.32,30.97]],"o":[[0.49,-11.49],[0,0]],"v":[[6.22,70.44],[9.22,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":84},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[15.14,31.76],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[16.46,31.95],"t":62},{"s":[16.46,31.95],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.33,316.86],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.33,316.86],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[274.33,316.86],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[222.33,271.15],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[209.64,257.12],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[209.64,257.12],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[345.19,214.98],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[342.41,206.07],"t":62},{"s":[342.41,206.07],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[138.72],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[138.72],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[138.72],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[157.05],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[161.65],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[161.65],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-65.02],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-65.02],"t":62},{"s":[-65.02],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[30.28,53.24],[23.18,63.53]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.92,55.27],[29.77,63.91]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[32.92,55.27],[29.77,63.91]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.18,63.53],[12.42,56.27]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.77,63.91],[21.59,60.55]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[29.77,63.91],[21.59,60.55]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[16.81,30.33]],"o":[[-2.36,-11.74],[0,0]],"v":[[23.18,63.53],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[14.78,31.73]],"o":[[-5.28,-11.33],[0,0]],"v":[[29.77,63.91],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[14.78,31.73]],"o":[[-5.28,-11.33],[0,0]],"v":[[29.77,63.91],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":85},{"ty":4,"sr":1,"st":0,"op":70,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[13.35,27.71],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[12.22,33.79],"t":62},{"s":[12.22,33.79],"t":69}]},"s":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100,100],"t":62},{"s":[100,100],"t":69}]},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.37,189.74],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.37,189.74],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[200.37,189.74],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[142.91,210.91],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.6,213.19],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[135.6,213.19],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[210.36,212.53],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[208.87,205.4],"t":62},{"s":[208.87,205.4],"t":69}]},"r":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[73.33],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[73.33],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[73.33],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[98.94],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.21],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[102.21],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-73.47],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[-73.47],"t":62},{"s":[-73.47],"t":69}]},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]}},"shapes":[{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26.7,45.38],[18.13,55.42]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[24.44,59.5],[20.06,67.59]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[24.44,59.5],[20.06,67.59]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.13,55.42],[7.61,46.95]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.06,67.59],[12.46,63.06]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20.06,67.59],[12.46,63.06]]}],"t":69}]}},{"ty":"sh","d":1,"ks":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[13.17,20.68]],"o":[[-1.17,-11],[0,0]],"v":[[18.13,55.42],[0,0]]}],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[{"c":false,"i":[[0,0],[6.55,22.05]],"o":[[-3.13,-10.55],[0,0]],"v":[[20.06,67.59],[0,0]]}],"t":62},{"s":[{"c":false,"i":[[0,0],[6.55,22.05]],"o":[[-3.13,-10.55],[0,0]],"v":[[20.06,67.59],[0,0]]}],"t":69}]}},{"ty":"st","lc":2,"lj":2,"ml":4,"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[100],"t":62},{"s":[100],"t":69}]},"w":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.990000009536743],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[2.5],"t":62},{"s":[2.5],"t":69}]},"c":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":0},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":9.000000357627869},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":18},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":26},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":35},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":44},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":53},{"o":{"x":0,"y":0},"i":{"x":0.58,"y":1},"s":[0.6078,0.5647,0.9843],"t":62},{"s":[0.0039,0.5922,1],"t":69}]}}],"ind":86}],"v":"5.7.0","fr":30,"op":69.00000214576721,"ip":0,"assets":[]} \ No newline at end of file diff --git a/nl/contact/index.html b/nl/contact/index.html new file mode 100644 index 0000000000..8268d2ca41 --- /dev/null +++ b/nl/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Je hebt een adres ontvangen om verbinding te maken met SimpleX Chat

+

Om een verbinding te maken:

+ +
+

Installeer de SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Maak verbinding met de app

+ + + Open de Simplex app + +
+

2

+
+
+ +
+

Tik op de knop 'verbinden' in de app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Word lid van SimpleX

+

Wij nodigen u uit om deel te nemen aan de conversatie

+ + + +

Schrijf u in om onze updates te ontvangen

+ +
+ + + +
+ +
+ +

Verkrijg SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/nl/fdroid/index.html b/nl/fdroid/index.html new file mode 100644 index 0000000000..50294b65b8 --- /dev/null +++ b/nl/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stabiele en bètaversies gebouwd door de ontwikkelaars

+

Om het toe te voegen aan uw F-Droid-client scan de QR-code of gebruik deze URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stabiele versies gebouwd door F-Droid.org

+

De releases voor deze repository vinden enkele dagen later plaats.

+

SimpleX Chat- en F-Droid.org-repository's ondertekenen builds met de verschillende sleutels. Om over te stappen, alstublieft exporteer de chatdatabase en installeer de app opnieuw.

+
+
+ +
+
+ + + + + + + + + + diff --git a/nl/index.html b/nl/index.html new file mode 100644 index 0000000000..6f6321901a --- /dev/null +++ b/nl/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/nl/invitation/index.html b/nl/invitation/index.html new file mode 100644 index 0000000000..7e56de4f55 --- /dev/null +++ b/nl/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Je hebt een eenmalige link ontvangen om verbinding te maken met SimpleX Chat

+

Om een verbinding te maken:

+ +
+

Installeer de SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Maak verbinding met de app

+ + + Open de Simplex app + +
+

2

+
+
+ +
+

Tik op de knop 'verbinden' in de app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Word lid van SimpleX

+

Wij nodigen u uit om deel te nemen aan de conversatie

+ + + +

Schrijf u in om onze updates te ontvangen

+ +
+ + + +
+ +
+ +

Verkrijg SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/nl/learn-more/index.html b/nl/learn-more/index.html new file mode 100644 index 0000000000..828b2cd9e3 --- /dev/null +++ b/nl/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Waarom is SimpleX uniek

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

U heeft volledige privacy

+
+ +
+ +
+

+ SimpleX beschermt de privacy van uw profiel, contacten en metagegevens door deze te verbergen voor de netwerkservers van SimpleX en andere buitenstaanders. +

+

+ In tegenstelling tot andere bestaande berichtennetwerken worden bij SimpleX geen identificatiegegevens aan de gebruikers toegewezen – zelfs geen willekeurige getallen. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

U bent beschermd
tegen spam en misbruik

+
+ +
+ +
+

+ Omdat u geen identificatiecode of vast adres hebt op het SimpleX-netwerk, kan niemand contact met u opnemen, tenzij u een eenmalig of tijdelijk gebruikersadres deelt in de vorm van een QR-code of een link. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

U beheert uw gegevens

+
+ +
+ +
+

+ SimpleX slaat alle gebruikersgegevens op client apparaten op in een draagbaar gecodeerd databaseformaat — en kan worden overgedragen naar een ander apparaat. +

+

+ De end-to-end versleutelde berichten worden tijdelijk op SimpleX relayservers bewaard totdat ze zijn ontvangen, waarna ze permanent worden verwijderd. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

U bent eigenaar van het SimpleX netwerk

+
+ +
+ +
+

+ Het SimpleX-netwerk is volledig gedecentraliseerd en onafhankelijk van welke cryptovaluta dan ook of enig ander netwerk, met uitzondering van het internet. +

+

+ U kunt SimpleX gebruiken met uw eigen servers of met de servers die door ons worden geleverd — en toch verbinding maken met elke gebruiker. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Functies

+ +
+ +
+
+ + +
+

E2E-versleutelde berichten met markdown en bewerking

+
+ +
+
+ + +
+

E2E-versleutelde
afbeeldingen,videos en bestanden

+
+ +
+
+ + +
+

E2E-gecodeerde gedecentraliseerde groepen - alleen gebruikers weten dat ze bestaan

+
+ +
+
+ + +
+

E2E-versleutelde spraakberichten

+
+ +
+
+ + +
+

Verdwijnende geheime gesprekken

+
+ +
+
+ + +
+

E2E-versleutelde
audio- en videogesprekken

+
+ +
+
+ + +
+

Draagbare gecodeerde app-opslag - profiel naar een ander apparaat verplaatsen

+
+ +
+
+ + +
+

Incognitomodus -
uniek voor SimpleX Chat

+
+ +
+
+
+ + +
+
+

Wat maakt SimpleX privé

+ +
+
+ + +
+
+ + +
+
+

Tijdelijke anonieme paarsgewijze identifiers

+
+ +

SimpleX gebruikt tijdelijke anonieme paarsgewijze adressen en inloggegevens voor elk gebruikers contact of groepslid.

+ +

Het maakt het mogelijk om berichten te bezorgen zonder gebruikers profiel-ID's, wat een betere privacy van metagegevens biedt dan alternatieven.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Out-of-band
sleuteluitwisseling

+
+ +

Veel communicatienetwerken zijn kwetsbaar voor MITM-aanvallen door servers of netwerkaanbieders.

+ +

Om te voorkomen dat SimpleX apps eenmalige sleutels out-of-band doorgeven, wanneer u een adres deelt als een link of een QR-code.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

2 lagen
end-to-end versleuteling

+
+ +

Protocol met double-ratchet -
OTR-berichten met perfecte voorwaartse geheimhouding en inbraak herstel.

+ +

NaCL-cryptobox in elke wachtrij om verkeer correlatie tussen berichten wachtrijen te voorkomen als TLS wordt aangetast.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Bericht integriteit
verificatie

+
+ +

Om de integriteit te garanderen, zijn de berichten opeenvolgend genummerd en bevatten ze de hash van het vorige bericht.

+ +

Als een bericht wordt toegevoegd, verwijderd of gewijzigd, wordt de ontvanger gewaarschuwd.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Extra laag
server versleuteling

+
+ +

Extra server versleuteling laag voor levering aan de ontvanger, om de correlatie tussen ontvangen en verzonden server verkeer te voorkomen als TLS is aangetast.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Berichten mixen
om correlatie te verminderen

+
+ +

SimpleX servers fungeren als mix nodes met lage latentie — de inkomende en uitgaande berichten hebben een andere volgorde.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Veilig geverifieerd
TLS-transport

+
+ +

Alleen TLS 1.2/1.3 met sterke algoritmen wordt gebruikt voor client-server verbindingen.

+ +

Server fingerprint en channel binding voorkomen MITM- en replay-aanvallen.

+ +

Connectie herstel is uitgeschakeld om sessie aanvallen te voorkomen.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Optionele
toegang via Tor

+
+ +

Om uw IP-adres te beschermen kunt u via Tor of een ander transport overlay netwerk toegang krijgen tot de servers.

+ +

Installeer de Orbot-app en schakel de SOCKS5-proxy in (of VPN op iOS ) om SimpleX via Tor te gebruiken.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Unidirectionele
berichtenwachtrijen

+
+ +

Elke berichten wachtrij geeft berichten in één richting door, met verschillende verzend en ontvangst adressen.

+ +

Het vermindert de aanvals mogenlijkheden, in vergelijking met traditionele berichten diensten en de beschikbare metadata.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Meerdere lagen van
inhouds opvulling

+
+ +

SimpleX gebruikt content opvulling voor elke coderingslaag om aanvallen op bericht grootte te verstoren.

+ +

Het zorgt ervoor dat berichten van verschillende grootte er hetzelfde uitzien voor de servers en netwerk waarnemers.

+ +
+

Tik om te sluiten

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Netwerk

+

Simplex Chat biedt de beste privacy door de voordelen van P2P en gefedereerde netwerken te combineren.

+ +
+
+
+ + +
+
+

In tegenstelling tot P2P netwerken

+

+ Alle berichten worden verzonden via servers, die zorgen voor een betere metadata privacy en een betrouwbare asynchrone bezorging van berichten, terwijl er veel word vermeden van problemen met P2P netwerken. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

In tegenstelling tot federatieve netwerken

+

+ SimpleX relay servers slaan GEEN gebruikers profielen, contacten en afgeleverde berichten op, maken GEEN verbinding met elkaar en er is GEEN server directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX netwerk

+

+ servers bieden unidirectionele wachtrijen om de gebruikers te verbinden, maar ze hebben geen zicht op de netwerk verbindings grafiek — alleen de gebruikers. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX uitgelegd

+ + + + + + + +
+
+ +
+
1. Wat gebruikers ervaren
+
+ +

+ U kunt contacten en groepen maken en tweerichtings gesprekken voeren, zoals in elke andere messenger. +

+

+ Hoe kan het werken met unidirectionele wachtrijen en zonder gebruikers profiel-ID's? +

+
+
+ +
+
2. Hoe werkt het
+
+ +

+ Voor elke verbinding gebruikt u twee afzonderlijke berichten wachtrijen om berichten via verschillende servers te verzenden en te ontvangen. +

+

+ Servers geven berichten slechts in één richting door, zonder een volledig beeld te hebben van het gesprek of de connecties van de gebruiker. +

+
+
+ +
+
3. Wat servers zien
+
+ +

+ De servers hebben afzonderlijke anonieme inloggegevens voor elke wachtrij en weten niet tot welke gebruikers ze behoren. +

+

+ Gebruikers kunnen de privacy van metadata verder verbeteren door Tor te gebruiken om toegang te krijgen tot servers, waardoor corellatie op IP-adres wordt voorkomen. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vergelijking met andere protocollen

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signaal, grote platformsXMPP, MatrixP2P protocollen
Vereist globale identiteitNee - privéJa 1Ja 2Ja 3
Mogelijkheid van MITMNee - veilig 4Ja 5JaJa
Afhankelijkheid van DNSNee - veerkrachtigJaJaNee
Enkelvoudig of gecentraliseerd netwerkNee - gedecentraliseerdJaNee - gefedereerd 6Ja 7
Centrale component of andere netwerkbrede aanvalNee - veerkrachtigJaJa 2Ja 8
+
+ +
+ +
+
+
    +
  1. Meestal op basis van een telefoonnummer, in sommige gevallen op gebruikersnamen
  2. +
  3. Op DNS gebaseerde adressen
  4. +
  5. Publieke sleutel of een andere globale unieke ID
  6. +
  7. SimpleX relais kunnen de e2e-versleuteling niet in gevaar brengen. Controleer de beveiligingscode om aanvallen op out-of-band kanalen te beperken
  8. +
  9. Als de servers van de operator zijn gecompromitteerd. Controleer de beveiligingscode in Signal en enkele andere apps om dit te beperken
  10. +
  11. Beschermt de privacy van metagegevens van gebruikers niet
  12. +
  13. Hoewel P2P gedistribueerd is, is het niet gefedereerd — het functioneert als één enkel netwerk.
  14. +
  15. P2P netwerken hebben een centrale autoriteit of het hele netwerk kan worden aangetast - kijk hier
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/pl/contact/index.html b/pl/contact/index.html new file mode 100644 index 0000000000..b5598a952a --- /dev/null +++ b/pl/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Otrzymałeś adres do połączenia na SimpleX Chat

+

Aby nawiązać połączenie:

+ +
+

Zainstaluj aplikację SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Połącz się w aplikacji

+ + + Otwórz aplikację Simplex + +
+

2

+
+
+ +
+

Stuknij przycisk 'połącz się' w aplikacji

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Dołącz do SimpleX

+

Zapraszamy do udziału w rozmowie

+ + + +

Zapisz się, aby otrzymywać nasze aktualizacje

+ +
+ + + +
+ +
+ +

Pobierz SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/pl/fdroid/index.html b/pl/fdroid/index.html new file mode 100644 index 0000000000..6786a2c485 --- /dev/null +++ b/pl/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat na F-Droid

+ +
+ +
+

Repo SimpleX

+
+
+

Wersje stabilne i beta zbudowane przez deweloperów

+

Aby dodać do Twojego klienta F-Droid, zeskanuj kod QR lub użyj tego URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Odcisk klucza podpisu (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Repo F-Droid.org

+ +

Wersje stabilne zbudowane przez F-Droid.org

+

Wydania na tym repo są kilka dni później.

+

Repozytoria SimpleX Chat i F-Droid.org mają podpisane budowy z innymi kluczami. Aby zmienić, proszę wyeksportuj bazę czatu i przeinstaluj aplikację.

+
+
+ +
+
+ + + + + + + + + + diff --git a/pl/index.html b/pl/index.html new file mode 100644 index 0000000000..3442e6a625 --- /dev/null +++ b/pl/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/pl/invitation/index.html b/pl/invitation/index.html new file mode 100644 index 0000000000..e43886eb07 --- /dev/null +++ b/pl/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Otrzymałeś jednorazowy link do połączenia na SimpleX Chat

+

Aby nawiązać połączenie:

+ +
+

Zainstaluj aplikację SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Połącz się w aplikacji

+ + + Otwórz aplikację Simplex + +
+

2

+
+
+ +
+

Stuknij przycisk 'połącz się' w aplikacji

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Dołącz do SimpleX

+

Zapraszamy do udziału w rozmowie

+ + + +

Zapisz się, aby otrzymywać nasze aktualizacje

+ +
+ + + +
+ +
+ +

Pobierz SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/pl/learn-more/index.html b/pl/learn-more/index.html new file mode 100644 index 0000000000..c0ff6175a7 --- /dev/null +++ b/pl/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Dlaczego SimpleX jest unikalny

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Masz pełną prywatność

+
+ +
+ +
+

+ SimpleX chroni prywatność Twojego profilu, kontaktów i metadanych, ukrywając je przed serwerami platformy SimpleX i wszelkimi obserwatorami. +

+

+ W przeciwieństwie do każdej innej istniejącej platformy komunikacyjnej, SimpleX nie ma żadnych identyfikatorów przypisanych do użytkowników — nawet losowych liczb. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Jesteś chroniony
przed spamem i nadużyciami

+
+ +
+ +
+

+ Ponieważ na platformie SimpleX nie masz identyfikatora ani stałego adresu, nikt nie może się z Tobą skontaktować, chyba że udostępnisz jednorazowy lub tymczasowy adres użytkownika, w postaci kodu QR lub linku. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Masz kontrolę nad swoimi danymi

+
+ +
+ +
+

+ SimpleX przechowuje wszystkie dane użytkownika na urządzeniach klienckich w formacie przenośnej zaszyfrowanej bazy danych — można je przenieść na inne urządzenie. +

+

+ Wiadomości zaszyfrowane end-to-end są przechowywane tymczasowo na serwerach przekaźnikowych SimpleX do momentu ich odebrania, po czym są trwale usuwane. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Jesteś właścicielem sieci SimpleX

+
+ +
+ +
+

+ Sieć SimpleX jest w pełni zdecentralizowana i niezależna od jakiejkolwiek krypto-waluty lub jakiejkolwiek innej platformy, poza Internetem. +

+

+ Możesz używać SimpleX z własnymi serwerami lub z serwerami dostarczonymi przez nas — i nadal łączyć się z dowolnym użytkownikiem. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkcje

+ +
+ +
+
+ + +
+

Wiadomości szyfrowane przez E2E ze składnią markdown i edycją

+
+ +
+
+ + +
+

Obrazy, wideo i pliki
zaszyfrowane przez E2E

+
+ +
+
+ + +
+

Zaszyfrowane E2E zdecentralizowane grupy — tylko użytkownicy wiedzą, że te grupy istnieją

+
+ +
+
+ + +
+

Wiadomości głosowe zaszyfrowane przez E2E

+
+ +
+
+ + +
+

Znikające wiadomości

+
+ +
+
+ + +
+

Połączenia audio i wideo
szyfrowane przez E2E

+
+ +
+
+ + +
+

Przenośna zaszyfrowana pamięć aplikacji — przenieś profil na inne urządzenie

+
+ +
+
+ + +
+

Tryb incognito —
unikalny dla SimpleX Chat

+
+ +
+
+
+ + +
+
+

Co sprawia, że SimpleX jest prywatny

+ +
+
+ + +
+
+ + +
+
+

Tymczasowe anonimowe identyfikatory parami

+
+ +

SimpleX używa tymczasowych anonimowych adresów par i poświadczeń dla każdego kontaktu użytkownika lub członka grupy.

+ +

Pozwala na dostarczanie wiadomości bez identyfikatorów profilu użytkownika, zapewniając lepszą prywatność metadanych niż rozwiązania alternatywne.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Wymiana kluczy
out-of-band

+
+ +

Wiele sieci komunikacyjnych jest podatnych na ataki MITM ze strony serwerów lub dostawców sieci.

+ +

Aby temu zapobiec aplikacje SimpleX przekazują klucze jednorazowe out-of-band, gdy udostępniasz adres jako link lub kod QR.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Dwie warstwy
szyfrowania typu end-to-end

+
+ +

Protokół double-ratchet —
OTR messaging z perfect Forward secrecy i Break-in recovery.

+ +

NaCL cryptobox w każdej kolejce, aby zapobiec korelacji ruchu między kolejkami wiadomości, jeśli bezpieczeństwo protokołu TLS zostanie naruszone.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Weryfikacja
integralności wiadomości

+
+ +

Aby zagwarantować integralność, wiadomości są kolejno numerowane i zawierają hash poprzedniej wiadomości.

+ +

Jeśli jakaś wiadomość zostanie dodana, usunięta lub zmieniona, odbiorca zostanie o tym powiadomiony.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Dodatkowa warstwa
szyfrowania serwera

+
+ +

Dodatkowa warstwa szyfrowania serwera w celu dostarczenia do odbiorcy, aby zapobiec korelacji między odebranym i wysłanym ruchem serwera, jeśli bezpieczeństwo protokołu TLS zostanie naruszone.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Mieszanie wiadomości
w celu zmniejszenia korelacji

+
+ +

Serwery SimpleX działają jak węzły mieszania o niskim opóźnieniu — wiadomości przychodzące i wychodzące mają inną kolejność.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Bezpieczny uwierzytelniony
transport TLS

+
+ +

Do połączeń klient-serwer używany jest tylko TLS 1.2/1.3 z silnymi algorytmami.

+ +

Odcisk palca serwera i wiązanie kanałów zapobiegają atakom MITM i replay.

+ +

Wznowienie połączenia jest wyłączone, aby zapobiec atakom na sesje.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Możliwy
dostęp za pośrednictwem sieci Tor

+
+ +

Aby chronić swój adres IP, możesz uzyskać dostęp do serwerów przez Tor lub inną sieć nakładki transportowej.

+ +

Aby użyć SimpleX przez Tor zainstaluj aplikację Orbot na android i włącz proxy SOCKS5 (lub VPN na iOS).

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Jednokierunkowe
kolejki wiadomości

+
+ +

Każda kolejka z wiadomościami przekazuje wiadomości w jednym kierunku, z różnymi adresami wysyłania i odbierania.

+ +

Zmniejsza wektory ataku, w porównaniu do tradycyjnych brokerów wiadomości, oraz dostępne metadane.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Wielowarstwowy
padding treści

+
+ +

SimpleX używa paddingu treści dla każdej warstwy szyfrowania, aby udaremnić ataki na rozmiar wiadomości.

+ +

Dzięki temu wiadomości o różnych rozmiarach wyglądają tak samo dla serwerów i obserwatorów sieci.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Sieć

+

Simplex Chat zapewnia najlepszą prywatność dzięki połączeniu zalet sieci P2P i sieci federacyjnych.

+ +
+
+
+ + +
+
+

W przeciwieństwie do sieci P2P

+

+ Wszystkie wiadomości są wysyłane przez serwery, co zapewnia lepszą prywatność metadanych i niezawodne asynchroniczne dostarczanie wiadomości, przy jednoczesnym unikaniu wielu problemów sieci P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

W przeciwieństwie do sieci federacyjnych

+

+ Serwery przekaźnikowe SimpleX NIE przechowują profili użytkowników, kontaktów i dostarczonych wiadomości, NIE łączą się ze sobą i NIE ma katalogu serwerów. +

+
+
+ + + +
+
+ + +
+
+

Sieć SimpleX

+

+ serwerów zapewniają jednokierunkowe kolejki do łączenia użytkowników, ale nie mają wglądu w wykres połączeń sieciowych — robią to tylko użytkownicy. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Objaśnienie SimpleX

+ + + + + + + +
+
+ +
+
1. Jakie są doświadczenia użytkowników
+
+ +

+ Możesz tworzyć kontakty i grupy oraz prowadzić dwukierunkowe rozmowy, jak w każdym innym komunikatorze. +

+

+ Jak może to działać z jednokierunkowymi kolejkami i bez identyfikatorów profili użytkowników? +

+
+
+ +
+
2. Jak to działa
+
+ +

+ Dla każdego połączenia używasz dwóch oddzielnych kolejek z wiadomościami do wysyłania i odbierania wiadomości przez różne serwery. +

+

+ Serwery przekazują wiadomości tylko w jedną stronę, nie mając pełnego obrazu konwersacji ani połączeń użytkownika. +

+
+
+ +
+
3. Co widzą serwery
+
+ +

+ Serwery mają osobne anonimowe poświadczenia dla każdej kolejki i nie wiedzą do jakich użytkowników one należą. +

+

+ Użytkownicy mogą jeszcze bardziej zwiększyć prywatność metadanych, używając Tor do uzyskania dostępu do serwerów, co zapobiega korelacji na podstawie adresu IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Porównanie z innymi protokołami

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, duże platformyXMPP, MatrixProtokoły sieci P2P
Wymaga globalnej tożsamościNie - prywatneTak 1Tak 2Tak 3
Możliwość ataku MITMNie - bezpieczny 4Tak 5TakTak
Zależność od DNSNie - odpornyTakTakNie
Sieć pojedyncza lub scentralizowanaNie - zdecentralizowanyTakNie - sfederowany 6Tak 7
Centralny komponent lub inny atak w całej sieciNie - odpornyTakTak 2Tak 8
+
+ +
+ +
+
+
    +
  1. Zazwyczaj na podstawie numeru telefonu, w niektórych przypadkach na podstawie nazwy użytkownika
  2. +
  3. Adresy oparte na DNS
  4. +
  5. Klucz publiczny lub inny globalnie unikalny identyfikator (ID)
  6. +
  7. Przekaźniki SimpleX nie mogą skompromitować szyfrowania e2e. Zweryfikuj kody bezpieczeństwa aby złagodzić atak na kanał pozapasmowy
  8. +
  9. Jeśli bezpieczeństwo serwerów operatora zostało naruszone. Zweryfikuj kody bezpieczeństwa w Signalu lub innej aplikacji aby to złagodzić
  10. +
  11. Nie chroni prywatności metadanych użytkowników
  12. +
  13. Podczas gdy sieci P2P są rozproszone, nie są sfederowane - działają jako jedna sieć
  14. +
  15. Sieci P2P albo mają centralny organ, albo cała sieć może zostać skompromitowana - zobacz tutaj
  16. +
+
+
+
+
+ + +

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

+ + + + + + + + + + diff --git a/privacy/index.html b/privacy/index.html new file mode 100644 index 0000000000..aaf2fca1b0 --- /dev/null +++ b/privacy/index.html @@ -0,0 +1,678 @@ + + + + + + + + SimpleX Privacy Policy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+

SimpleX Chat Operators Privacy Policy and Conditions of Use

+

Summary

+

Introduction and General principles cover SimpleX Chat network design, the network operators, and the principles of privacy and security provided by SimpleX network.

+

Privacy policy covers:

+ +

Conditions of Use are the conditions you need to accept to use SimpleX Chat applications and the relay servers of preset operators. Their purpose is to protect the users and preset server operators.

+

Please note: this summary and any links in this document are provided for information only - they are not a part of the Privacy Policy and Conditions of Use.

+

Introduction

+

SimpleX Chat (also referred to as SimpleX) is the first communication network based on a new protocol stack that builds on the same ideas of complete openness and decentralization as email and web, with the focus on providing security and privacy of communications, and without compromising on usability.

+

SimpleX messaging protocol is the first protocol that has no user profile IDs of any kind, not even random numbers, cryptographic keys or hashes that identify the users. SimpleX apps allow their users to send messages and files via relay server infrastructure. Relay server owners and operators do not have any access to your messages, thanks to double-ratchet end-to-end encryption algorithm (also known as Signal algorithm - do not confuse with Signal protocols or platform) and additional encryption layers, and they also have no access to your profile and contacts - as they do not host user accounts.

+

Double ratchet algorithm has such important properties as forward secrecy, sender repudiation and break-in recovery (also known as post-compromise security).

+

If you believe that any part of this document is not aligned with SimpleX network mission or values, please raise it via email or chat.

+

Privacy Policy

+

General principles

+

SimpleX network software uses the best industry practices for security and encryption to provide client and server software for secure end-to-end encrypted messaging via private connections. This encryption is protected from being compromised by the relays servers, even if they are modified or compromised, via man-in-the-middle attack.

+

SimpleX software is built on top of SimpleX messaging and application protocols, based on a new message routing protocol allowing to establish private connections without having identifiers assigned to its users - it does not use emails, phone numbers, usernames, identity keys or any other user profile identifiers to pass messages between the user applications.

+

SimpleX software is similar in its design approach to email clients and browsers - it allows you to have full control of your data and freely choose the relay server operators, in the same way you choose which website or email provider to use, or use your own relay servers, simply by changing the configuration of the client software. The only current restriction to that is Apple push notifications - at the moment they can only be delivered via the servers operated by SimpleX Chat Ltd, as explained below. We are exploring the solutions to deliver push notifications to iOS devices via other providers or users' own servers.

+

SimpleX network operators are not communication service provider, and provide public relays "as is", as experimental, without any guarantees of availability or data retention. The operators of the relay servers preset in the app ("Preset Server Operators"), including SimpleX Chat Ltd, are committed to maintain a high level of availability, reliability and security. SimpleX client apps can have multiple preset relay server operators that you can opt-in or opt-out of using. You are and will continue to be able to use any other operators or your own servers.

+

SimpleX network design is based on the principles of users and data sovereignty, and device and operator portability.

+

The implementation security assessment of SimpleX cryptography and networking was done in October 2022 by Trail of Bits, and most fixes were released in v4.2 – see the announcement.

+

The cryptographic review of SimpleX protocols design was done in July 2024 by Trail of Bits – see the announcement.

+

Your information

+

User profiles

+

Servers used by SimpleX Chat apps do not create, store or identify user chat profiles. The profiles you can create in the app are local to your device, and can be removed at any time via the app.

+

When you create the local profile, no records are created on any of the relay servers, and infrastructure operators, whether preset in the app or any other, have no access to any part of your information, and even to the fact that you created a profile - it is a local record stored only on your device. That means that if you delete the app, and have no backup, you will permanently lose all your data and the private connections you created with other software users.

+

You can transfer the profile to another device by creating a backup of the app data and restoring it on the new device, but you cannot use more than one device with the copy of the same profile at the same time - it will disrupt any active conversations on either or both devices, as a security property of end-to-end encryption.

+

Messages and Files

+

SimpleX relay servers cannot decrypt or otherwise access the content or even the size of your messages and files you send or receive. Each message is padded to a fixed size of 16kb. Each file is sent in chunks of 64kb, 256kb, 1mb or 4mb via all or some of the configured file relay servers. Both messages and files are sent end-to-end encrypted, and the servers do not have technical means to compromise this encryption, because part of the key exchange happens out-of-band.

+

Your message history is stored only on your own device and the devices of your contacts. While the recipients' devices are offline, messaging relay servers temporarily store end-to-end encrypted messages – you can configure which relay servers are used to receive the messages from the new contacts, and you can manually change them for the existing contacts too.

+

Private message delivery

+

You do not have control over which servers are used to send messages to your contacts - these servers are chosen by your contacts. To send messages your client by default uses configured servers to forward messages to the destination servers, thus protecting your IP address from the servers chosen by your contacts.

+

In case you use preset servers of more than one operator, the app will prefer to use a server of an operator different from the operator of the destination server to forward messages, preventing destination server to correlate messages as belonging to one client.

+

You can additionally use VPN or some overlay network (e.g., Tor) to hide your IP address from the servers chosen by you.

+

Please note: the clients allow changing configuration to connect to the destination servers directly. It is not recommended - if you make such change, your IP address will be visible to the destination servers.

+

Storage of messages and files on the servers

+

The messages are removed from the relay servers as soon as all messages of the file they were stored in are delivered and saving new messages switches to another file, as long as these servers use unmodified published code. Undelivered messages are also marked as delivered after the time that is configured in the messaging servers you use (21 days for preset messaging servers).

+

The files are stored on file relay servers for the time configured in the relay servers you use (48 hours for preset file servers).

+

The encrypted messages can be stored for some time after they are delivered or expired (because servers use append-only logs for message storage). This time varies, and may be longer in connections with fewer messages, but it is usually limited to 1 month, including any backup storage.

+

Connections with other users

+

When you create a connection with another user, two messaging queues (you can think about them as mailboxes) are created on messaging relay servers (chosen by you and your contact each), that can be the preset servers or the servers that you and your contact configured in the app. SimpleX messaging protocol uses separate queues for direct and response messages, and the apps prefer to create these queues on two different relay servers, or, if available, the relays of two different operators, for increased privacy, in case you have more than one relay server configured in the app, which is the default.

+

Preset and unmodified SimpleX relay servers do not store information about which queues are linked to your profile on the device, and they do not collect any information that would allow infrastructure owners and operators to establish that these queues are related to your device or your profile - the access to each queue is authorized by two anonymous unique cryptographic keys, different for each queue, and separate for sender and recipient of the messages.

+ +

When you create a connection with another user, the app generates a link/QR code that can be shared with the user to establish the connection via any channel (email, any other messenger, or a video call). This link is safe to share via insecure channels, as long as you can identify the recipient and also trust that this channel did not replace this link (to mitigate the latter risk you can validate the security code via the app).

+

While the connection "links" contain SimpleX Chat Ltd domain name simplex.chat, this site is never accessed by the app, and is only used for these purposes:

+
    +
  • to direct the new users to the app download instructions,
  • +
  • to show connection QR code that can be scanned via the app,
  • +
  • to "namespace" these links,
  • +
  • to open links directly in the installed app when it is clicked outside of the app.
  • +
+

You can always safely replace the initial part of the link https://simplex.chat/ either with simplex:/ (which is a URI scheme provisionally registered with IANA) or with any other domain name where you can self-host the app download instructions and show the connection QR code (but in case it is your domain, it will not open in the app). Also, while the page renders QR code, all the information needed to render it is only available to the browser, as the part of the "link" after # symbol is not sent to the website server.

+

iOS Push Notifications

+

This section applies only to the notification servers operated by SimpleX Chat Ltd.

+

When you choose to use instant push notifications in SimpleX iOS app, because the design of push notifications requires storing the device token on notification server, the notifications server can observe how many messaging queues your device has notifications enabled for, and approximately how many messages are sent to each queue.

+

Preset notification server cannot observe the actual addresses of these queues, as a separate address is used to subscribe to the notifications. It also cannot observe who sends messages to you. Apple push notifications servers can only observe how many notifications are sent to you, but not from how many contacts, or from which messaging relays, as notifications are delivered to your device end-to-end encrypted by one of the preset notification servers - these notifications only contain end-to-end encrypted metadata, not even encrypted message content, and they look completely random to Apple push notification servers.

+

You can read more about the design of iOS push notifications here.

+

Another information stored on the servers

+

Additional technical information can be stored on the network servers, including randomly generated authentication tokens, keys, push tokens, and other material that is necessary to transmit messages. SimpleX network design limits this additional technical information to the minimum required to operate the software and servers. To prevent server overloading or attacks, the servers can temporarily store data that can link to particular users or devices, including IP addresses, geographic location, or information related to the transport sessions. This information is not stored for the absolute majority of the app users, even for those who use the servers very actively.

+

SimpleX Directory

+

This section applies only to the experimental group directory operated by SimpleX Chat Ltd.

+

SimpleX Directory stores: your search requests, the messages and the members profiles in the registered groups. You can connect to SimpleX Directory via this address.

+

Public groups and content channels

+

You may participate in a public group and receive content from a public channel (Group). In case you send messages or comments to the Group, you grant a license:

+
    +
  • to all recipients: +
      +
    • to share your messages with the new Group members and outside of the group, e.g. via quoting (replying), forwarding and copy-pasting your message. When your message is deleted or marked as deleted, the copies of your message will not be deleted.
    • +
    • to retain a copy of your messages according to the Group settings (e.g., the Group may allow irreversible message deletion from the recipient devices for a limited period of time, or it may only allow to edit and mark messages as deleted on recipient devices). Deleting message from the recipient devices or marking message as deleted revokes the license to share the message.
    • +
    +
  • +
  • to Group owners: to share your messages with the new Group members as history of the Group. Currently, the Group history shared with the new members is limited to 100 messages.
  • +
+

Group owners may use chat relays or automated bots (Chat Relays) to re-broadcast member messages to all members, for efficiency. The Chat Relays may be operated by the group owners, by preset operators or by 3rd parties. The Chat Relays have access to and will retain messages in line with Group settings, for technical functioning of the Group. Neither you nor group owners grant any content license to Chat Relay operators.

+

User Support

+

The app includes support contact operated by SimpleX Chat Ltd. If you contact support, any personal data you share is kept only for the purposes of researching the issue and contacting you about your case. We recommend contacting support via chat when it is possible, and avoid sharing any personal information.

+

Preset Server Operators

+

Preset server operators will not share the information on their servers with each other, other than aggregate usage statistics.

+

Preset server operators must not provide general access to their servers or the data on their servers to each other.

+

Preset server operators will provide non-administrative access to control port of preset servers to SimpleX Chat Ltd, for the purposes of removing illegal content identified in publicly accessible resources (contact and group addresses, and downloadable files). This control port access only allows deleting known links and files, and accessing aggregate server-wide statistics, but does NOT allow enumerating any information on the servers or accessing statistics related to specific users.

+

Information Preset Server Operators May Share

+

The preset server operators use third parties. While they do not have access and cannot share any user data, these third parties may access the encrypted user messages (but NOT the actual unencrypted message content or size) as it is stored or transmitted via the servers. Hosting and network providers can also store IP addresses and other transport information as part of their logs.

+

SimpleX Chat Ltd uses a third party for email services - if you ask for support via email, your and SimpleX Chat Ltd email providers may access these emails according to their privacy policies and terms. When the request is sensitive, please contact us via SimpleX Chat apps or using encrypted email using PGP key published at openpgp.org.

+

The cases when the preset server operators may share the data temporarily stored on the servers:

+
    +
  • To meet any applicable law, or enforceable governmental request or court order.
  • +
  • To enforce applicable terms, including investigation of potential violations.
  • +
  • To detect, prevent, or otherwise address fraud, security, or technical issues.
  • +
  • To protect against harm to the rights, property, or safety of software users, operators of preset servers, or the public as required or permitted by law.
  • +
+

By the time of updating this document, the preset server operators were not served with any enforceable requests and did not provide any information from the servers to any third parties. If the preset server operators are ever requested to provide such access or information, they will follow the due legal process to limit any information shared with the third parties to the minimally required by law.

+

Preset server operators will publish information they are legally allowed to share about such requests in the Transparency reports.

+

Source code license

+

As this software is fully open-source and provided under AGPLv3 license, all infrastructure owners and operators, and the developers of the client and server applications who use the SimpleX Chat source code, are required to publish any changes to this software under the same AGPLv3 license - including any modifications to the servers.

+

In addition to the AGPLv3 license terms, the preset relay server operators are committed to the software users that these servers will always be compiled from the published open-source code, without any modifications.

+

Updates

+

This Privacy Policy applies to SimpleX Chat Ltd and all other preset server operators you use in the app.

+

This Privacy Policy may be updated as needed so that it is current, accurate, and as clear as possible. When it is updated, you will have to review and accept the changed policy within 30 days of such changes to continue using preset relay servers. Even if you fail to accept the changed policy, your continued use of SimpleX Chat software applications and preset relay servers confirms your acceptance of the updated Privacy Policy.

+

Please also read The Conditions of Use of Software and Infrastructure below.

+

If you have questions about this Privacy Policy please contact SimpleX Chat Ltd via email or chat.

+

Conditions of Use of Software and Infrastructure

+

You accept the Conditions of Use of Software and Infrastructure ("Conditions") by installing or using any of SimpleX Chat software or using any of server infrastructure (collectively referred to as "Applications") operated by the Preset Server Operators, including SimpleX Chat Ltd, whether these servers are preset in the software or not.

+

Minimal age. You must be at least 13 years old to use SimpleX Chat Applications. The minimum age to use SimpleX Applications without parental approval may be higher in your country.

+

Infrastructure. Infrastructure of the preset server operators includes messaging and file relay servers. SimpleX Chat Ltd also provides iOS push notification servers for public use. This infrastructure does not have any modifications from the published open-source code available under AGPLv3 license. Any infrastructure provider, whether commercial or not, is required by the Affero clause (named after Affero Inc. company that pioneered the community-based Q&A sites in early 2000s) to publish any modifications under the same license. The statements in relation to Infrastructure and relay servers anywhere in this document assume no modifications to the published code, even in the cases when it is not explicitly stated.

+

Client applications. SimpleX Chat client application Software (referred to as "app" or "apps") also has no modifications compared with published open-source code, and any developers of the alternative client apps based on SimpleX Chat code are required to publish any modifications under the same AGPLv3 license. Client applications should not include any tracking or analytics code, and do not share any tracking information with SimpleX Chat Ltd, preset server operators or any other third parties. If you ever discover any tracking or analytics code, please report it to SimpleX Chat Ltd, so it can be removed.

+

Accessing the infrastructure. For the efficiency of the network access, the client Software by default accesses all queues your app creates on any relay server within one user profile via the same network (TCP/IP) connection. At the cost of additional traffic this configuration can be changed to use different transport session for each connection. Relay servers do not collect information about which queues were created or accessed via the same connection, so the relay servers cannot establish which queues belong to the same user profile. Whoever might observe your network traffic would know which relay servers you use, and how much data you send, but not to whom it is sent - the data that leaves the servers is always different from the data they receive - there are no identifiers or ciphertext in common, even inside TLS encryption layer. Please refer to the technical design document for more information about the privacy model and known security and privacy risks.

+

Privacy of user data. Servers do not retain any data you transmit for any longer than necessary to deliver the messages between apps. Preset server operators collect aggregate statistics across all their servers, as supported by published code and can be enabled by any infrastructure operator, but not any statistics per-user, or per geographic location, or per IP address, or per transport session. SimpleX Chat Ltd does not have information about how many people use SimpleX Chat applications, it only knows an approximate number of app installations and the aggregate traffic through the preset servers. In any case, preset server operators do not and will not sell or in any way monetize user data. The future business model assumes charging for some optional Software features instead, in a transparent and fair way.

+

Operating Infrastructure. For the purpose of using SimpleX Chat Software, if you continue using preset servers, you agree that your end-to-end encrypted messages are transferred via the preset servers in any countries where preset server operators have or use facilities and service providers or partners. The information about geographic location and hosting providers of the preset messaging servers is available on server pages.

+

Software. You agree to downloading and installing updates to SimpleX Chat Applications when they are available; they would only be automatic if you configure your devices in this way.

+

Traffic and device costs. You are solely responsible for the traffic and device costs that you incur while using SimpleX Chat Applications, and any associated taxes.

+

Legal usage. You agree to use SimpleX Chat Applications only for legal purposes. You will not use (or assist others in using) the Applications in ways that: 1) violate or infringe the rights of Software users, SimpleX Chat Ltd, other preset server operators, or others, including privacy, publicity, intellectual property, or other proprietary rights; 2) involve sending illegal communications, e.g. spam. While server operators cannot access content or identify messages or groups, in some cases the links to the illegal communications can be shared publicly on social media or websites. Preset server operators reserve the right to remove such links from the preset servers and disrupt the conversations that send illegal content via their servers, whether they were reported by the users or discovered by the operators themselves.

+

Damage to SimpleX Chat Ltd and Preset Server Operators. You must not (or assist others to) access, use, modify, distribute, transfer, or exploit SimpleX Chat Applications in unauthorized manners, or in ways that harm Software users, SimpleX Chat Ltd, other preset server operators, their Infrastructure, or any other systems. For example, you must not 1) access preset operators' Infrastructure or systems without authorization, in any way other than by using the Software or by using a 3rd party client applications that satisfies the requirements of the Conditions of use (see the next section); 2) disrupt the integrity or performance of preset operators' Infrastructure; 3) collect information about the users in any manner; or 4) sell, rent, or charge for preset operators' Infrastructure. This does not prohibit you from providing your own Infrastructure to others, whether free or for a fee, as long as you do not violate these Conditions and AGPLv3 license, including the requirement to publish any modifications of the relay server software.

+

3rd party client applications. You may use a 3rd party application (App) to access preset operators' Infrastructure or systems, provided that this App:

+
    +
  • is compatible with the protocol specifications not older than 1 year,
  • +
  • provides user-to-user messaging only or enables automated chat bots sending messages requested by users (in case of bots, it must be made clear to the users that these are automated bots),
  • +
  • implements the same limits, rules and restrictions as Software,
  • +
  • requires that the users accept the same Conditions of use of preset operators' Infrastructure as in Software prior to providing access to this Infrastructure,
  • +
  • displays the notice that it is the App for using SimpleX network,
  • +
  • provides its source code under open-source license accessible to the users via the App interface. In case the App uses the source code of Software, the App's source code must be provided under AGPLv3 license, and in case it is developed without using Software code its source code must be provided under any widely recognized free open-source license,
  • +
  • does NOT use the branding of SimpleX Chat Ltd without the permission,
  • +
  • does NOT pretend to be Software,
  • +
  • complies with these Conditions of use.
  • +
+

Keeping your data secure. SimpleX Chat is the first communication software that aims to be 100% private by design - server software neither has the ability to access your messages, nor it has information about who you communicate with. That means that you are solely responsible for keeping your device, your user profile and any data safe and secure. If you lose your phone or remove the Software from the device, you will not be able to recover the lost data, unless you made a back up. To protect the data you need to make regular backups, as using old backups may disrupt your communication with some of the contacts. SimpleX Chat Ltd and other preset server operators are not responsible for any data loss.

+

Storing the messages on the device. The messages are stored in the encrypted database on your device. Whether and how database passphrase is stored is determined by the configuration of the Software you use. The databases created prior to 2023 or in CLI (terminal) app may remain unencrypted, and it will be indicated in the app interface. In this case, if you make a backup of the data and store it unencrypted, the backup provider may be able to access the messages. Please note, that the desktop apps can be configured to store the database passphrase in the configuration file in plaintext, and unless you set the passphrase when first running the app, a random passphrase will be used and stored on the device. You can remove it from the device via the app settings.

+

Storing the files on the device. The files currently sent and received in the apps by default (except CLI app) are stored on your device encrypted using unique keys, different for each file, that are stored in the database. Once the message that the file was attached to is removed, even if the copy of the encrypted file is retained, it should be impossible to recover the key allowing to decrypt the file. This local file encryption may affect app performance, and it can be disabled via the app settings. This change will only affect the new files. If you later re-enable the encryption, it will also affect only the new files. If you make a backup of the app data and store it unencrypted, the backup provider will be able to access any unencrypted files. In any case, irrespective of the storage setting, the files are always sent by all apps end-to-end encrypted.

+

No Access to Emergency Services. SimpleX Chat Applications do not provide access to emergency service providers like the police, fire department, hospitals, or other public safety organizations. Make sure you can contact emergency service providers through a mobile, fixed-line telephone, or other service.

+

Third-party services. SimpleX Chat Applications may allow you to access, use, or interact with the websites of SimpleX Chat Ltd, preset server operators or other third-party websites, apps, content, and other products and services. When you use third-party services, their terms and privacy policies govern your use of those services.

+

Your Rights. You own the messages and the information you transmit through SimpleX Applications. Your recipients are able to retain the messages they receive from you; there is no technical ability to delete data from their devices. While there are various app features that allow deleting messages from the recipients' devices, such as disappearing messages and full message deletion, their functioning on your recipients' devices cannot be guaranteed or enforced, as the device may be offline or have a modified version of the Software. At the same time, repudiation property of the end-to-end encryption algorithm allows you to plausibly deny having sent the message, like you can deny what you said in a private face-to-face conversation, as the recipient cannot provide any proof to the third parties, by design.

+

License. SimpleX Chat Ltd grants you a limited, revocable, non-exclusive, and non-transferable license to use SimpleX Chat Applications in accordance with these Conditions. The source-code of Applications is available and can be used under AGPL v3 license.

+

SimpleX Chat Ltd Rights. SimpleX Chat Ltd (and, where applicable, preset server operators) owns all copyrights, trademarks, domains, logos, trade secrets, and other intellectual property rights associated with the Applications. You may not use SimpleX Chat Ltd copyrights, trademarks, domains, logos, and other intellectual property rights unless you have SimpleX Chat Ltd written permission, and unless under an open-source license distributed together with the source code. To report copyright, trademark, or other intellectual property infringement, please contact chat@simplex.chat.

+

Disclaimers. YOU USE SIMPLEX APPLICATIONS AT YOUR OWN RISK AND SUBJECT TO THE FOLLOWING DISCLAIMERS. SIMPLEX CHAT LTD PROVIDES APPLICATIONS ON AN “AS IS” BASIS WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, AND FREEDOM FROM COMPUTER VIRUS OR OTHER HARMFUL CODE. SIMPLEX CHAT LTD DOES NOT WARRANT THAT ANY INFORMATION PROVIDED BY THEM IS ACCURATE, COMPLETE, OR USEFUL, THAT THEIR APPLICATIONS WILL BE OPERATIONAL, ERROR-FREE, SECURE, OR SAFE, OR THAT THEIR APPLICATIONS WILL FUNCTION WITHOUT DISRUPTIONS, DELAYS, OR IMPERFECTIONS. SIMPLEX CHAT LTD AND OTHER PRESET OPERATORS DO NOT CONTROL, AND ARE NOT RESPONSIBLE FOR, CONTROLLING HOW OR WHEN THE USERS USE APPLICATIONS. SIMPLEX CHAT LTD AND OTHER PRESET OPERATORS ARE NOT RESPONSIBLE FOR THE ACTIONS OR INFORMATION (INCLUDING CONTENT) OF THEIR USERS OR OTHER THIRD PARTIES. YOU RELEASE SIMPLEX CHAT LTD, OTHER PRESET OPERATORS, AFFILIATES, DIRECTORS, OFFICERS, EMPLOYEES, PARTNERS, AND AGENTS ("SIMPLEX PARTIES") FROM ANY CLAIM, COMPLAINT, CAUSE OF ACTION, CONTROVERSY, OR DISPUTE (TOGETHER, "CLAIM") AND DAMAGES, KNOWN AND UNKNOWN, RELATING TO, ARISING OUT OF, OR IN ANY WAY CONNECTED WITH ANY SUCH CLAIM YOU HAVE AGAINST ANY THIRD PARTIES.

+

Limitation of liability. THE SIMPLEX PARTIES WILL NOT BE LIABLE TO YOU FOR ANY LOST PROFITS OR CONSEQUENTIAL, SPECIAL, PUNITIVE, INDIRECT, OR INCIDENTAL DAMAGES RELATING TO, ARISING OUT OF, OR IN ANY WAY IN CONNECTION WITH OUR CONDITIONS, US, OR SIMPLEX APPLICATIONS, EVEN IF THE SIMPLEX PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE AGGREGATE LIABILITY OF THE SIMPLEX PARTIES RELATING TO, ARISING OUT OF, OR IN ANY WAY IN CONNECTION WITH THESE CONDITIONS, THE SIMPLEX PARTIES, OR THE APPLICATIONS WILL NOT EXCEED ONE DOLLAR ($1). THE FOREGOING DISCLAIMER OF CERTAIN DAMAGES AND LIMITATION OF LIABILITY WILL APPLY TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW. THE LAWS OF SOME JURISDICTIONS MAY NOT ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO SOME OR ALL OF THE EXCLUSIONS AND LIMITATIONS SET FORTH ABOVE MAY NOT APPLY TO YOU. NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THE CONDITIONS, IN SUCH CASES, THE LIABILITY OF THE SIMPLEX PARTIES WILL BE LIMITED TO THE EXTENT PERMITTED BY APPLICABLE LAW.

+

Availability. The Applications may be disrupted, including for maintenance, upgrades, or network or equipment failures. SimpleX Chat Ltd may discontinue some or all of their Applications, including certain features and the support for certain devices and platforms, at any time. Preset server operators may discontinue providing the servers, at any time.

+

Resolving disputes. You agree to resolve any Claim you have with SimpleX Chat Ltd and/or preset server operators relating to or arising from these Conditions, them, or the Applications in the courts of England and Wales. You also agree to submit to the personal jurisdiction of such courts for the purpose of resolving all such disputes. The laws of England govern these Conditions, as well as any disputes, whether in court or arbitration, which might arise between SimpleX Chat Ltd (or preset server operators) and you, without regard to conflict of law provisions.

+

Changes to the conditions. SimpleX Chat Ltd may update the Conditions from time to time. The updated conditions have to be accepted within 30 days. Even if you fail to accept updated conditions, your continued use of SimpleX Chat Applications confirms your acceptance of the updated Conditions and supersedes any prior Conditions. You will comply with all applicable export control and trade sanctions laws. These Conditions cover the entire agreement between you and SimpleX Chat Ltd, and any preset server operators where applicable, regarding SimpleX Chat Applications. If you do not agree with these Conditions, you should stop using the Applications.

+

Enforcing the conditions. If SimpleX Chat Ltd or preset server operators fail to enforce any of these Conditions, that does not mean they waive the right to enforce them. If any provision of the Conditions is deemed unlawful, void, or unenforceable, that provision shall be deemed severable from the Conditions and shall not affect the enforceability of the remaining provisions. The Applications are not intended for distribution to or use in any country where such distribution or use would violate local law or would subject SimpleX Chat Ltd to any regulations in another country. SimpleX Chat Ltd reserve the right to limit the access to the Applications in any country. Preset operators reserve the right to limit access to their servers in any country. If you have specific questions about these Conditions, please contact SimpleX Chat Ltd at chat@simplex.chat.

+

Ending these conditions. You may end these Conditions with SimpleX Chat Ltd and preset server operators at any time by deleting the Applications from your devices and discontinuing use of the Infrastructure of SimpleX Chat Ltd and preset server operators. The provisions related to Licenses, Disclaimers, Limitation of Liability, Resolving dispute, Availability, Changes to the conditions, Enforcing the conditions, and Ending these conditions will survive termination of your relationship with SimpleX Chat Ltd and/or preset server operators.

+

Updated March 3, 2025

+
+
+ + + + + + + diff --git a/pt_BR/contact/index.html b/pt_BR/contact/index.html new file mode 100644 index 0000000000..453b006f26 --- /dev/null +++ b/pt_BR/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Você recebeu um endereço para se conectar no SimpleX Chat

+

Para estabelecer uma conexão:

+ +
+

Instale o aplicativo SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Conectar no aplicativo

+ + + Abra o aplicativo Simplex + +
+

2

+
+
+ +
+

Toque no botão "conectar" no aplicativo

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Junte-se ao SimpleX

+

Convidamos você a participar da conversa

+ + + +

Inscreva-se para receber nossas atualizações

+ +
+ + + +
+ +
+ +

Obtenha o SimpleX aplicativo desktop

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/pt_BR/fdroid/index.html b/pt_BR/fdroid/index.html new file mode 100644 index 0000000000..6c085ea690 --- /dev/null +++ b/pt_BR/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat pelo F-Droid

+ +
+ +
+

Repositório Simplex Chat

+
+
+

Versões estáveis e beta criadas pelos desenvolvedores

+

Para adicioná-lo ao seu cliente F-Droid, escaneie o QR code ou use este URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Assinatura de impressão digital de chave (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Repositório F-Droid.org

+ +

Versões estáveis criadas por F-Droid.org

+

Os lançamentos para este repositório são feitos 1 ou 2 dias depois.

+

Os repositórios SimpleX Chat e F-Droid.org assinam compilações com chaves diferentes. Para mudar, exporte o banco de dados de bate-papo e reinstale o aplicativo.

+
+
+ +
+
+ + + + + + + + + + diff --git a/pt_BR/index.html b/pt_BR/index.html new file mode 100644 index 0000000000..0f1cf8e2f2 --- /dev/null +++ b/pt_BR/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/pt_BR/invitation/index.html b/pt_BR/invitation/index.html new file mode 100644 index 0000000000..889461f996 --- /dev/null +++ b/pt_BR/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Você recebeu um link único para se conectar no SimpleX Chat

+

Para estabelecer uma conexão:

+ +
+

Instale o aplicativo SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Conectar no aplicativo

+ + + Abra o aplicativo Simplex + +
+

2

+
+
+ +
+

Toque no botão "conectar" no aplicativo

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Junte-se ao SimpleX

+

Convidamos você a participar da conversa

+ + + +

Inscreva-se para receber nossas atualizações

+ +
+ + + +
+ +
+ +

Obtenha o SimpleX aplicativo desktop

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/pt_BR/learn-more/index.html b/pt_BR/learn-more/index.html new file mode 100644 index 0000000000..c6eec3e904 --- /dev/null +++ b/pt_BR/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Por que o SimpleX é único

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Você tem privacidade total

+
+ +
+ +
+

+ O SimpleX protege a privacidade do seu perfil, contatos e metadados, ocultando-os dos servidores da plataforma SimpleX e de quaisquer observadores. +

+

+ Diferente de qualquer outra plataforma de mensagens existente, o SimpleX não tem identificadores atribuídos aos usuários — nem mesmo números aleatórios. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Você está protegido
contra spam e abusos

+
+ +
+ +
+

+ Como você não tem um identificador ou endereço fixo na plataforma SimpleX, ninguém pode entrar em contato com você, a menos que você compartilhe um endereço de usuário único ou temporário, como um QR code ou um link. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Você controla seus dados

+
+ +
+ +
+

+ O SimpleX armazena todos os dados do usuário nos dispositivos clientes em um formato de banco de dados criptografado portátil — que pode ser transferido para outro dispositivo. +

+

+ As mensagens criptografadas de ponta-a-ponta são mantidas temporariamente nos servidores de retransmissão SimpleX até serem recebidas e, em seguida, são excluídas permanentemente. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Sua própria rede SimpleX

+
+ +
+ +
+

+ A rede SimpleX é totalmente descentralizada e independente de qualquer criptomoeda ou de qualquer outra plataforma, exceto a Internet. +

+

+ Você pode usar o SimpleX com seus próprios servidores ou com os servidores fornecidos por nós — e ainda assim se conectar a qualquer usuário. +

+ +
+ + + Saiba mais + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Recursos

+ +
+ +
+
+ + +
+

Mensagens criptografadas de ponta-a-ponta com markdown e edição

+
+ +
+
+ + +
+

Criptografia de ponta-a-ponta
imagens, vídeos e arquivos

+
+ +
+
+ + +
+

Criptografia de ponta-a-ponta descentralizada de grupos — somente os usuários sabem que eles existem

+
+ +
+
+ + +
+

Mensagens de voz criptografadas de ponta-a-ponta

+
+ +
+
+ + +
+

Mensagens que desaparecem

+
+ +
+
+ + +
+

Chamadas de áudio e vídeo
criptografadas de ponta-a-ponta

+
+ +
+
+ + +
+

Armazenamento do aplicativo criptografado portátil — mova o perfil para outro dispositivo

+
+ +
+
+ + +
+

Modo anônimo —
único do SimpleX Chat

+
+ +
+
+
+ + +
+
+

O que torna o SimpleX privado

+ +
+
+ + +
+
+ + +
+
+

Identificadores temporários anônimos em pares

+
+ +

O SimpleX usa endereços anônimos temporários em pares e credenciais para cada contato de usuário ou membro de grupo.

+ +

Ele permite entregar mensagens sem identificadores de perfil, proporcionando melhor privacidade de metadados do que as alternativas.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Troca de chaves
fora da rede

+
+ +

Muitas plataformas de comunicação são vulneráveis a ataques MITM por servidores ou provedores de rede.

+ +

Para evitar isso, os aplicativos SimpleX passam chaves de uso único fora da banda, quando você compartilha um endereço como um link ou um QR code.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

2 camadas de
criptografia ponta-a-ponta

+
+ +

Protocolo de dupla catraca —
mensagens OTR com Sigilo de Encaminhamento Perfeito (Perfect Forward secrecy) e recuperação de invasão.

+ +

Caixa de criptografia NaCL em cada envio para evitar a correlação de tráfego entre os envios de mensagens se o TLS for comprometido.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Verificação de integridade
da mensagem

+
+ +

Para garantir a integridade, as mensagens são numeradas sequencialmente e incluem o hash da mensagem anterior.

+ +

Se alguma mensagem for adicionada, removida ou alterada, o destinatário será alertado.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Camada adicional de
criptografia do servidor

+
+ +

Camada adicional de criptografia de servidor para entrega ao destinatário, para evitar a correlação entre o tráfego de servidor recebido e enviado se o TLS for comprometido.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Mistura de mensagens
para reduzir a correlação

+
+ +

Os servidores SimpleX atuam como nós de mistura de baixa latência — as mensagens de entrada e saída têm ordem diferente.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Transporte TLS
seguro e autenticado

+
+ +

Somente o TLS 1.2/1.3 com algoritmos fortes é usado para conexões cliente-servidor.

+ +

A impressão digital do servidor e a vinculação de canais evitam ataques MITM e de repetição.

+ +

A retomada da conexão é desativada para evitar ataques à sessão.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Acesso opcional
via Tor

+
+ +

Para proteger seu endereço IP, você pode acessar os servidores por meio do Tor ou de alguma outra rede de sobreposição de transporte.

+ +

Para usar o SimpleX via Tor, instale o aplicativo Orbot e ative o proxy SOCKS5 (ou VPN no iOS).

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Envios de mensagens
unidirecionais

+
+ +

Cada fila de mensagens transmite mensagens em uma direção, com diferentes endereços de envio e recebimento.

+ +

Isso reduz os vetores de ataque, em comparação com os corretores de mensagens tradicionais, e os metadados disponíveis.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Múltiplas camadas de
preenchimento de conteúdos

+
+ +

O SimpleX usa preenchimento de conteúdo em cada camada de criptografia para impedir ataques ao tamanho da mensagem.

+ +

Isso faz com que mensagens de tamanhos diferentes tenham a mesma aparência para os servidores e observadores de rede.

+ +
+

Toque para fechar

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Rede SimpleX

+

O Simplex Chat oferece a melhor privacidade ao combinar as vantagens das redes P2P e federadas.

+ +
+
+
+ + +
+
+

Diferente das redes P2P

+

+ Todas as mensagens são enviadas por meio dos servidores, o que proporciona melhor privacidade de metadados e entrega de mensagens assíncronas confiáveis, além de evitar muitos dos problemas das redes P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Diferente das redes federadas

+

+ Os servidores de retransmissão SimpleX NÃO armazenam perfis de usuário, contatos e mensagens entregues, NÃO se conectam uns aos outros e NÃO há diretório de servidores. +

+
+
+ + + +
+
+ + +
+
+

Rede SimpleX

+

+ Os servidores fornecem filas unidirecionais para conectar os usuários, mas não têm visibilidade do gráfico de conexão de rede — somente os usuários têm. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Explicação do SimpleX

+ + + + + + + +
+
+ +
+
1. O que os usuários experimentam
+
+ +

+ Você pode criar contatos e grupos e ter conversas bidirecionais, como em qualquer outro mensageiro. +

+

+ Como ele pode funcionar com filas unidirecionais e sem identificadores de perfil de usuário? +

+
+
+ +
+
2. Como funciona
+
+ +

+ Para cada conexão, são usadas duas filas de mensagens separadas para enviar e receber mensagens por meio de servidores diferentes. +

+

+ Os servidores só passam mensagens em uma direção, sem ter a imagem completa da conversa ou conexões do usuário. +

+
+
+ +
+
3. O que os servidores veem
+
+ +

+ Os servidores têm credenciais anônimas separadas para cada envio e não sabem a que usuários elas pertencem. +

+

+ Os usuários podem melhorar ainda mais a privacidade de metadados usando o Tor para acessar os servidores, impedindo a correlação pelo endereço de IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparação com outros protocolos

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plataformasMatrix, XMPPProtocolos P2P
Requer uma identidade globalNão - privadoSim 1Sim 2Sim 3
Possibilidade de MITMNão - seguro 4Sim 5SimSim
Dependência do DNSNão - resilienteSimSimNão
Rede única ou centralizadaNão - descentralizadoSimNão - federado 6Sim 7
Componente central ou outro ataque em toda a redeNão - resilienteSimSim 2Sim 8
+
+ +
+ +
+
+
    +
  1. Geralmente com base em um número de telefone, em alguns casos em nomes de usuário
  2. +
  3. Endereços baseados no DNS
  4. +
  5. Chave pública ou alguma outra ID globalmente exclusiva
  6. +
  7. Os relays SimpleX não podem comprometer a criptografia e2e. Verifique o código de segurança para mitigar ataques em canais fora de banda
  8. +
  9. Se os servidores da operadora forem comprometidos. Verifique o código de segurança no Signal e outros aplicativos para mitigá-lo
  10. +
  11. Não protege a privacidade da metadados dos usuários
  12. +
  13. Embora os P2P sejam distribuídos, eles não são federados - operam como uma única rede
  14. +
  15. As redes P2P têm uma autoridade central ou toda a rede pode ser comprometida - veja aqui
  16. +
+
+
+
+
+ + +

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

+ + + + + + + + + + diff --git a/ro/contact/index.html b/ro/contact/index.html new file mode 100644 index 0000000000..9067e20892 --- /dev/null +++ b/ro/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received an address to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ro/fdroid/index.html b/ro/fdroid/index.html new file mode 100644 index 0000000000..835dd48d5e --- /dev/null +++ b/ro/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat repo

+
+
+

Stable and beta versions built by the developers

+

To add it to your F-Droid client, scan the QR code or use this URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Signing key fingerprint (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

Stable versions built by F-Droid.org

+

The releases to this repo are done several days later.

+

SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.

+
+
+ +
+
+ + + + + + + + + + diff --git a/ro/index.html b/ro/index.html new file mode 100644 index 0000000000..c160cf4ded --- /dev/null +++ b/ro/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/ro/invitation/index.html b/ro/invitation/index.html new file mode 100644 index 0000000000..a1f764097c --- /dev/null +++ b/ro/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

You received a 1-time link to connect on SimpleX Chat

+

To make a connection:

+ +
+

Install SimpleX app

+
+ + + +
+ +
+

1

+
+
+ +
+

Connect in app

+ + + Open Simplex app + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Join SimpleX

+

We invite you to join the conversation

+ + + +

Sign up to receive our updates

+ +
+ + + +
+ +
+ +

Get SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ro/learn-more/index.html b/ro/learn-more/index.html new file mode 100644 index 0000000000..fcdda0bbca --- /dev/null +++ b/ro/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
Key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
End-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
Content padding

+
+ +

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

+ + + + + + + + + + diff --git a/ru/contact/index.html b/ru/contact/index.html new file mode 100644 index 0000000000..af52b73ae0 --- /dev/null +++ b/ru/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Вы получили адрес контакта для соединения в SimpleX Chat

+

Чтобы установить соединение:

+ +
+

Установите приложение SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Подключитесь в приложении

+ + + Откройте приложение SimpleX + +
+

2

+
+
+ +
+

Нажмите на кнопку ’подключиться’ в приложении

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Присоединяйтесь к SimpleX

+

Мы приглашаем Вас присоединиться к разговору

+ + + +

Подпишитесь на нашу рассылку новостей

+ +
+ + + +
+ +
+ +

Скачать SimpleX для компьютера

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ru/fdroid/index.html b/ru/fdroid/index.html new file mode 100644 index 0000000000..4bf37f69d8 --- /dev/null +++ b/ru/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat в F-Droid

+ +
+ +
+

Репозиторий SimpleX Chat

+
+
+

Стабильные и бета-версии, созданные разработчиками

+

Чтобы добавить его в свой клиент F-Droid, отсканируйте QR-код или используйте этот адрес:

+ + https://app.simplex.chat/fdroid/repo + +

+ Идентификатор ключа подписи (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Репозиторий F-Droid.org

+ +

Стабильные версии, созданные F-Droid.org

+

Новые версии в этом репозитории публикуются с задержкой в несколько дней.

+

Приложение SimpleX Chat от разработчиков и от репозитория F-Droid.org имеют разные ключи подписи. Если Вы хотите сменить одно на другое, Вам сначала нужно будет экспортировать базу данных и только потом скачать другое приложение.

+
+
+ +
+
+ + + + + + + + + + diff --git a/ru/index.html b/ru/index.html new file mode 100644 index 0000000000..80af665acd --- /dev/null +++ b/ru/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/ru/invitation/index.html b/ru/invitation/index.html new file mode 100644 index 0000000000..0489707a82 --- /dev/null +++ b/ru/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Вы получили одноразовую ссылку для соединения в SimpleX Chat

+

Чтобы установить соединение:

+ +
+

Установите приложение SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Подключитесь в приложении

+ + + Откройте приложение SimpleX + +
+

2

+
+
+ +
+

Нажмите на кнопку ’подключиться’ в приложении

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Присоединяйтесь к SimpleX

+

Мы приглашаем Вас присоединиться к разговору

+ + + +

Подпишитесь на нашу рассылку новостей

+ +
+ + + +
+ +
+ +

Скачать SimpleX для компьютера

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/ru/learn-more/index.html b/ru/learn-more/index.html new file mode 100644 index 0000000000..4ed3c11ddd --- /dev/null +++ b/ru/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Почему SimpleX уникальный

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

У Вас есть полная
конфиденциальность

+
+ +
+ +
+

+ SimpleX защищает конфиденциальность Вашего профиля, контактов и метаданных, скрывая их от серверов сети SimpleX и любых наблюдателей. +

+

+ В отличие от любой другой существующей сети обмена сообщениями, SimpleX не имеет идентификаторов пользователей — нет даже случайных цифр. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Вы защищены от
спама и злоупотреблений

+
+ +
+ +
+

+ Поскольку у Вас нет идентификатора или фиксированного адреса в сети SimpleX, никто не сможет связаться с Вами без Вашего явного согласия mdash; это возможно, только если Вы сами поделитесь адресом в виде QR-кода или ссылки. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Только Вы контролируете
Ваши данные

+
+ +
+ +
+

+ SimpleX хранит все пользовательские данные на клиентских устройствах в портативном формате зашифрованной базы данных — их можно перенести на другое устройство. +

+

+ Сквозные зашифрованные сообщения временно хранятся на серверах SimpleX до получения, после чего они удаляются безвозвратно. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Вы владеете
сетью SimpleX

+
+ +
+ +
+

+ Сеть SimpleX полностью децентрализована и независима от любой криптовалюты/блокчейна или любой другой сети, кроме Интернета. +

+

+ Вы можете использовать SimpleX со своими собственными серверами или с серверами, предоставленными нами — и при этом подключаться к любому пользователю SimpleX. +

+ +
+ + + Узнать больше + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Функции

+ +
+ +
+
+ + +
+

Сообщения с E2E-шифрованием
с форматированием и редактированием

+
+ +
+
+ + +
+

Изображения, видео и файлы
с E2E-шифрованием

+
+ +
+
+ + +
+

Децентрализованные группы — известные только участникам

+
+ +
+
+ + +
+

Голосовые сообщения с E2E-шифрованием

+
+ +
+
+ + +
+

Исчезающие сообщения

+
+ +
+
+ + +
+

Аудио и видео звонки с E2E-шифрованием

+
+ +
+
+ + +
+

Зашифрованное база данных — Вы можете перенести профиль на другое устройство

+
+ +
+
+ + +
+

Режим инкогнито —
уникальный для SimpleX Chat

+
+ +
+
+
+ + +
+
+

Что делает SimpleX конфиденциальным

+ +
+
+ + +
+
+ + +
+
+

Временные анонимные парные идентификаторы

+
+ +

SimpleX использует временные анонимные парные адреса и учетные данные для каждого контакта пользователя или члена группы.

+ +

Это позволяет доставлять сообщения без идентификаторов профиля пользователя, и обеспечивает лучшую конфиденциальность метаданных, чем альтернативы.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Обмен ключами
вне протокола

+
+ +

Многие коммуникационные сети уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.

+ +

Чтобы предотвратить это, приложения SimpleX передают одноразовые ключи вне протокола, когда Вы делитесь адресом в виде ссылки или QR-кода.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

2-уровневое
сквозное шифрование

+
+ +

Протокол двойного обновления ключей —
"отрицаемые" сообщения с идеальной прямой секретностью и восстановлением после взлома.

+ +

NaCL cryptobox в каждой очереди для предотвращения корреляции трафика между очередями сообщений, в случае компрометированного TLS.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Проверка неизменности
сообщений

+
+ +

Для обеспечения неизменности, сообщения нумеруются по порядку и содержат хэш предыдущего сообщения.

+ +

Если какое-либо сообщение будет добавлено, удалено или изменено, получатель будет предупрежден об этом.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Дополнительный уровень
шифрования с сервером

+
+ +

Дополнительный уровень шифрования между сервером и получателем для предотвращения корреляции полученного и отправленного трафика сервера, в случае компрометированного TLS.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Смешивание сообщений
для уменьшения корреляции

+
+ +

Серверы SimpleX действуют как узлы-миксеры с низкой задержкой — входящие и исходящие сообщения имеют разный порядок.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Безопасное аутентифицированное
соединение TLS

+
+ +

Для соединений клиента и сервера используется только протокол TLS 1.2/1.3 с безопасными алгоритмами.

+ +

Идентификатор сервера и привязка к TLS сессии предотвращают атаки перехвата (MITM) и повторного использования.

+ +

Возобновление соединения отключено для предотвращения сеансовых атак.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Возможен доступ
через сеть Tor

+
+ +

Чтобы защитить свой IP-адрес Вы можете подключаться к серверам через сеть Tor или какую-либо другую транспортную оверлейную сеть.

+ +

Чтобы использовать SimpleX через сеть Tor, пожалуйста, установите приложение Orbot и включите прокси (или режим VPN на iOS).

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Однонаправленные
очереди сообщений

+
+ +

Каждая очередь сообщений передает сообщения в одном направлении с разными адресами отправки и получения.

+ +

Это уменьшает векторы атак и доступные метаданные, по сравнению с традиционными серверами доставки сообщений.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Многоуровневое
дополнение сообщений

+
+ +

SimpleX использует дополнение содержания для каждого уровня шифрования, чтобы скрыть размер сообщений.

+ +

Это делает сообщениям разного размера одинаковыми для серверов и сети.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Сеть SimpleX

+

SimpleX Chat обеспечивает наилучшую конфиденциальность, сочетая преимущества P2P и федеративных сетей.

+ +
+
+
+ + +
+
+

В отличие от P2P-сетей

+

+ Все сообщения отправляются через серверы, что обеспечивает лучшую конфиденциальность метаданных и надежную асинхронную доставку сообщений, избегая при этом многих проблем P2P сетей. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

В отличие от федеративных сетей

+

+ Серверные узлы SimpleX НЕ хранят профили пользователей, контакты и доставленные сообщения, НЕ подключаются друг к другу, и НЕ имеют каталога серверов. +

+
+
+ + + +
+
+ + +
+
+

Сеть SimpleX

+

+ серверы предоставляют однонаправленные очереди для подключения пользователей, но у них нет видимости графика сетевых подключений — это делают только пользователи. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Как SimpleX работает

+ + + + + + + +
+
+ +
+
1. Что видят пользователи
+
+ +

+ Вы можете создавать контакты и группы, а также вести двусторонние беседы, как и в любом другом мессенджере. +

+

+ Как это может работать с однонаправленными очередями и без идентификаторов профиля пользователя? +

+
+
+ +
+
2. Как это работает
+
+ +

+ Для каждого контакта Вы используете две отдельные очереди сообщений, отправляя и получая сообщения через разные серверы. +

+

+ Серверы передают сообщения только в одну сторону, не имея полной информации о разговорах и контактах пользователя. +

+
+
+ +
+
3. Что видят серверы
+
+ +

+ Серверы имеют отдельные, анонимные учётные данные для каждой очереди и не знают, каким пользователям они принадлежат. +

+

+ Пользователи могут повысить свою конфиденциальность используя сеть Tor для доступа к серверам. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Сравнение с другими протоколами

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, большие платформыXMPP, MatrixПротоколы P2P
Требуется глобальный идентификаторНет - конфиденциальныйДа 1Да 2Да 3
Возможность MITMНет - безопасный 4Да 5ДаДа
Зависимость от DNSНет - устойчивДаДаНет
Единая или Централизованная сетьНет - децентрализованныйДаНет - федеративные 6Да 7
Центральный компонент или атака на всю сетьНет - устойчивДаДа 2Да 8
+
+ +
+ +
+
+
    +
  1. Обычно требуется номера телефона, в некоторых случаях — имя пользователя
  2. +
  3. Адреса на основе DNS
  4. +
  5. Публичный ключ или какой-либо другой глобально уникальный идентификатор
  6. +
  7. Сервера SimpleX не могут скомпрометировать сквозное шифрование
  8. +
  9. Если операторы серверов скомпрометированы. В Signal, и некоторых других приложениях, есть возможность подтвердить код безопасности
  10. +
  11. Не защищает конфиденциальность пользовательских метаданных
  12. +
  13. Хотя P2P распределены, они не являются федеративными, то есть P2P — работают как единая сеть
  14. +
  15. Сети P2P либо имеют центральный компонент, либо вся сеть может быть атакована - подробнее здесь
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/security/index.html b/security/index.html new file mode 100644 index 0000000000..78547a8bf9 --- /dev/null +++ b/security/index.html @@ -0,0 +1,1113 @@ + + + + + + + + + Security Policy + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Security Policy

+

While great care is taken to ensure the highest level of security and privacy in SimpleX network servers and clients, all software can have flaws, and we believe it is a critical part of an organization's social responsibility to minimize the impact of these flaws through continual vulnerability discovery efforts, defense in depth design, and prompt remediation and notification.

+

The implementation security assessment of SimpleX cryptography and networking was done by Trail of Bits in November 2022.

+

The cryptographic review of SimpleX protocols design was done by Trail of Bits in July 2024.

+

We are planning implementation security assessment in early 2025.

+

Reporting security issues

+

To report a security issue, please contact us directly via email chat@simplex.chat. Please do NOT report security issues via GitHub issues or via any public channels.

+

Please encrypt the email message using the key for this address from keys.openpgp.org (its fingerprint is FB44 AF81 A45B DE32 7319 797C 8510 7E35 7D4A 17FC) and make your key available for a secure reply.

+

While we encourage you to encrypt the message, if this poses a barrier to reporting, an unencrypted submission is better than no submission.

+

Issue triage

+

Our team will investigate and prioritize the reported issue. We may work in private with individuals who are not our direct team members, as well as other organizations, where we believe this can help with the issue investigation, resolution, or testing.

+

Threat Model

+

Please review threat model for SimpleX: https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md#threat-model

+

Certain threats are considered out of the scope of SimpleX security model. For example, we do not consider SimpleX secure against the following classes of attacks:

+
    +
  • CPU/hardware flaws.
  • +
  • physical observation side channels (e.g. power consumption, EM emissions, etc).
  • +
+

Further, any user data stored on the device can be accessed with user's or root privileges, such as:

+
    +
  • user files in the app storage (encrypted or not, depending on the app settings).
  • +
  • encrypted database.
  • +
  • database encryption key in case it is stored on the device.
  • +
+

Mitigations for security issues outside of our threat model may still be implemented, however they will be weighed against competing priorities, and we do not classify them as SimpleX vulnerabilities.

+

Issue severity

+

We will determine the risk of each issue, taking into account our experience dealing with past issues, versions affected, common defaults, and use cases. We classify issues on two dimensions, based on their severity level and the difficulty required to exploit them.

+

Difficulty levels

+
    +
  • Low: The flaw is well known; public tools for its exploitation exist or can be scripted.
  • +
  • Medium: An attacker must write an exploit or will need in-depth knowledge of the system.
  • +
  • High: An attacker must have privileged access to the system, may need to know complex technical details, or must discover other weaknesses to exploit this issue.
  • +
+

Issue severity levels

+
    +
  • CRITICAL severity. Such issues should affect common configurations and be exploitable with low or medium difficulty. For example: significant disclosure of the encrypted users messages or files either via relays or via communication channels, vulnerabilities which can be easily exploited remotely to compromise clients or servers private keys. These issues will be kept private and will trigger a new release of all supported versions.
  • +
  • HIGH severity. This includes issues that are of a lower risk than critical, possibly due to affecting less common configurations, or have high difficulty to be exploited. These issues will be kept private and will trigger a new release of all supported versions.
  • +
  • MEDIUM severity. This includes issues like crashes in client applications caused by the received messages or files, flaws in protocols that are less commonly used, and local flaws. These will in general be kept private until the next release, and that release will be scheduled so that it can roll up several such flaws at one time.
  • +
  • LOW severity. This includes issues such as those that only affect the SimpleX CLI app, or unlikely configurations, or issues that would be classified as medium but are very difficult to exploit. These will in general be fixed immediately in latest development versions, and may be back-ported to older versions that are still getting updates. These issues may be kept private or be included in commit messages.
  • +
+

Notification policy

+

Security fixes of critical, high and medium severity MUST NOT be mentioned in the commit message. Security fixes of low severity MAY be mentioned in the commit messages.

+

We will privately notify trusted partners about forthcoming security fixes on the day when the fix is publicly released and available for download via all supported channels, indicating the issue level, but not further details.

+

7 days after the new software version is released and available for download via all supported channels, we will indicate that it fixes a security issue and its level, but not further details. This notification will be published in our release notes and broadcast channels we use.

+

14 days later the details will be published in the release notes, describing the impact and the nature of vulnerability, but not necessarily providing detailed instruction for the exploit - it will be decided on a case by case basis.

+

Trusted partners

+

You may be privately notified about the forthcoming releases containing fixes to the security issues of critical, high and medium severity. We will communicate only the level of the issue severity, and not the issue itself.

+

To be included in this list, you should be one of the following:

+
    +
  • software or hardware vendor depending on our code.
  • +
  • commercial or non-profit organization that uses our software in scenarios where security and privacy is critically important.
  • +
  • we may also include other organizations that are not listed but would otherwise qualify for list membership.
  • +
  • we may also include organizations with which we have a commercial relationship.
  • +
  • we may withdraw notifying certain organizations if they leak issues before they are public or do not add value.
  • +
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/tr/contact/index.html b/tr/contact/index.html new file mode 100644 index 0000000000..d3e4a30f5f --- /dev/null +++ b/tr/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

SimpleX Chat ile bağlantı kurmak için bir adres aldınız

+

Bağlantı başlatmak için:

+ +
+

SimpleX uygulamasını yükleyin

+
+ + + +
+ +
+

1

+
+
+ +
+

Uygulamada bağlanın

+ + + SimpleX uygulamasını açın + +
+

2

+
+
+ +
+

Uygulamada "Bağlan" düğmesine dokunun

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Katılın SimpleX

+

Sizi sohbete katılmaya davet ediyoruz

+ + + +

Güncellemelerimizi almak için kaydolun

+ +
+ + + +
+ +
+ +

SimpleX' masaüstü uygulamasını indirin

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/tr/fdroid/index.html b/tr/fdroid/index.html new file mode 100644 index 0000000000..8ac4e1bfc6 --- /dev/null +++ b/tr/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

F-Droid ile SimpleX Chat

+ +
+ +
+

SimpleX Chat deposu

+
+
+

Geliştiriciler tarafından oluşturulan kararlı ve beta sürümler

+

F-Droid istemcinize eklemek için QR kodunu tarayın veya bu URL'yi kullanın:

+ + https://app.simplex.chat/fdroid/repo + +

+ İmza anahtarı parmak izi (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org deposu

+ +

F-Droid.org tarafından oluşturulan kararlı sürümler

+

Bu depoya sürümler birkaç gün sonra eklenir.

+

SimpleX Chat ve F-Droid.org depoları farklı anahtarlarla imzalanır. Geçiş yapmak için sohbet veritabanınızı dışa aktarın ve uygulamayı yeniden yükleyin.

+
+
+ +
+
+ + + + + + + + + + diff --git a/tr/index.html b/tr/index.html new file mode 100644 index 0000000000..380d17b5d9 --- /dev/null +++ b/tr/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/tr/invitation/index.html b/tr/invitation/index.html new file mode 100644 index 0000000000..a1321d86d2 --- /dev/null +++ b/tr/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

SimpleX Chat ile bağlantı kurmak için tek kullanımlık bir bağlantı aldınız

+

Bağlantı başlatmak için:

+ +
+

SimpleX uygulamasını yükleyin

+
+ + + +
+ +
+

1

+
+
+ +
+

Uygulamada bağlanın

+ + + SimpleX uygulamasını açın + +
+

2

+
+
+ +
+

Uygulamada "Bağlan" düğmesine dokunun

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Katılın SimpleX

+

Sizi sohbete katılmaya davet ediyoruz

+ + + +

Güncellemelerimizi almak için kaydolun

+ +
+ + + +
+ +
+ +

SimpleX' masaüstü uygulamasını indirin

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/tr/learn-more/index.html b/tr/learn-more/index.html new file mode 100644 index 0000000000..7acec7cd2f --- /dev/null +++ b/tr/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

SimpleX neden benzersiz

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Tam gizlilik elde edersiniz

+
+ +
+ +
+

+ SimpleX, profilinizin, kişilerin ve meta verilerinizin gizliliğini korur ve bunları SimpleX ağ sunucularından ve diğer olası gözlemcilerden gizler. +

+

+ Mevcut tüm diğer mesajlaşma ağlarının aksine, SimpleX kullanıcılarına hiçbir kimlik atamaz — rastgele sayılar bile yoktur. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Spam ve kötüye kullanıma
karşı koruma

+
+ +
+ +
+

+ SimpleX ağında kimliğiniz veya sabit bir adresiniz olmadığı için, kimse size ulaşamaz; yalnızca tek kullanımlık veya geçici bir kullanıcı adresini QR kodu veya bağlantı olarak paylaşırsanız iletişim kurabilir. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Verilerinizin kontrolü sizde

+
+ +
+ +
+

+ SimpleX, kullanıcı verilerini yalnızca uç cihazlarda ve taşınabilir, şifreli bir veritabanı formatında saklar — bu, başka bir cihaza aktarılabilir. +

+

+ Uçtan uca şifreli mesajlar, son cihaza ulaşana kadar SimpleX aktarma sunucularında geçici olarak saklanır ve ardından kalıcı olarak silinir. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

SimpleX ağının sahibi sizsiniz

+
+ +
+ +
+

+ SimpleX ağı tamamen merkeziyetsizdir ve kripto para birimleri veya internet dışında başka ağlara bağlı değildir. +

+

+ Kendi sunucularınızla SimpleX'i kullanabilirsiniz veya bizim sunduğumuz sunucuları kullanabilirsiniz — yine de tüm kullanıcılarla bağlantı kurabilirsiniz. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Özellikler

+ +
+ +
+
+ + +
+

Uçtan uca şifreli mesajlar, markdown ve düzenleme desteğiyle

+
+ +
+
+ + +
+

Uçtan uca şifreli
resimler, videolar ve dosyalar

+
+ +
+
+ + +
+

Uçtan uca şifreli merkeziyetsiz gruplar — Sadece kullanıcılar bu grupların varlığını bilir

+
+ +
+
+ + +
+

Uçtan uca şifreli sesli mesajlar

+
+ +
+
+ + +
+

Kaybolan gizli sohbetler

+
+ +
+
+ + +
+

Uçtan uca şifreli
sesli ve görüntülü aramalar

+
+ +
+
+ + +
+

Taşınabilir ve şifreli uygulama veri depolama — tüm profilinizi başka bir cihaza kolayca taşıyın

+
+ +
+
+ + +
+

Gizli mod —
SimpleX Chat'te benzersiz

+
+ +
+
+
+ + +
+
+

SimpleX'i gizli yapan nedir

+ +
+
+ + +
+
+ + +
+
+

Geçici, anonim çift yönlü kimlikler

+
+ +

SimpleX, her kullanıcı bağlantısı veya grup üyesi için kendi geçici, anonim ve çift yönlü adreslerini ve kimlik bilgilerini kullanır.

+ +

SimpleX, kullanıcı profili tanımlayıcıları olmadan mesaj göndermeye olanak tanır ve diğer alternatiflere göre daha iyi meta veri gizliliği sunar.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Ağ Dışı
Anahtar Değişimi

+
+ +

Birçok iletişim ağı, sunucu veya ağ sağlayıcıları tarafından yapılan MITM saldırılarına karşı savunmasızdır.

+ +

Bunu önlemek için, SimpleX bağlantı adresini link veya QR kodu olarak paylaştığınızda tek kullanımlık anahtarları ağ dışı yollarla iletir.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

İki Katmanlı
Uçtan Uca Şifreleme

+
+ +

Double-Ratchet protokolü —
Perfect Forward secrecy, inkar edilebilirlik ve ihlal sonrası kurtarma ile Off-the-Record mesajlar.

+ +

Her kuyrukta NaCL kriptobox kullanılır, böylece TLS ihlal edilse bile mesaj kuyrukları arasındaki trafik ilişkilendirilemez.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Mesaj Bütünlüğü
Doğrulaması

+
+ +

Mesaj bütünlüğünü sağlamak için, mesajlar sıralı olarak numaralandırılır ve önceki mesajın hash'i eklenir.

+ +

Bir mesaj eklendiğinde, silindiğinde veya değiştirildiğinde alıcı uyarılır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Ek Sunucu
Şifreleme Katmanı

+
+ +

Alıcıya teslimat için ek sunucu şifreleme katmanı, TLS ihlal edilirse alınan ve gönderilen sunucu verileri arasındaki ilişkiyi önler.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Mesajları karıştırma,
korelasyonu azaltma

+
+ +

SimpleX sunucuları, düşük gecikmeli karıştırıcı düğümler olarak çalışır — gelen ve giden mesajların sırası farklıdır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Güvenli Doğrulanmış
TLS Taşıma Katmanı

+
+ +

İstemci-sunucu bağlantıları için yalnızca güçlü algoritmalarla TLS 1.2/1.3 kullanılır.

+ +

Sunucu parmak izleri ve kanal bağlama, MITM ve tekrar saldırılarını önler.

+ +

Oturum saldırılarını önlemek için bağlantı devamı devre dışı bırakılmıştır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

İsteğe Bağlı
Tor Erişimi

+
+ +

IP adresinizi korumak için Tor veya başka bir taşıma katmanı ağı üzerinden sunuculara erişebilirsiniz.

+ +

Android'de Tor ile SimpleX kullanmak için Orbot uygulamasını yükleyin ve SOCKS5 proxy'yi etkinleştirin veya iOS'ta VPN kullanın.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Tek Yönlü
Mesaj Kuyrukları

+
+ +

Her mesaj kuyruğu, farklı gönderici ve alıcı adresleriyle mesajları yalnızca tek yönde iletir.

+ +

Geleneksel mesaj aracılarına kıyasla, olası saldırı vektörleri ve mevcut metaveriler azaltılır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Çoklu İçerik
Doldurma Katmanları

+
+ +

SimpleX, mesaj boyutu saldırılarını önlemek için her şifreleme katmanında içerik doldurma kullanır.

+ +

Sunucu ve ağ gözlemcileri için aynı görünen farklı boyutlarda mesajlar üretir.

+ +
+

Kapatmak için dokunun

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX-Ağı

+

P2P ve federasyonlu ağların avantajlarını birleştirerek SimpleX, mümkün olan en iyi gizliliği sunar.

+ +
+
+
+ + +
+
+

P2P ağlarının aksine

+

+ Tüm mesajlar sunucular üzerinden gönderilir; bu, meta veri korumasını artırır ve daha güvenilir asenkron mesaj iletimi sağlar ve birçok sorunu önler P2P ağlarının sorunları. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Federasyonlu ağların aksine

+

+ SimpleX aktarma sunucuları KULLANICI PROFİLLERİNİ, kişileri ve teslim edilen mesajları SAKLAMAZ ve birbirleriyle bağlantı kurmaz, ayrıca bir sunucu dizini yoktur. +

+
+
+ + + +
+
+ + +
+
+

SimpleX Ağı

+

+ Sunucular, kullanıcıları birbirine bağlamak için tek yönlü kuyruklar sağlar. Ancak ağın bağlantı grafiğini göremezler — bunu yalnızca kullanıcılar bilir. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX açıklıyor

+ + + + + + + +
+
+ +
+
1. Kullanıcıların nasıl deneyimlediği
+
+ +

+ Kişiler ve gruplar oluşturabilir ve tıpkı diğer mesajlaşma programlarında olduğu gibi iki yönlü iletişim kurabilirsiniz. +

+

+ Tek yönlü kuyruklarla ve kullanıcı profil tanımlayıcıları olmadan nasıl çalışabilir? +

+
+
+ +
+
2. Nasıl çalışır
+
+ +

+ Her bağlantı için, farklı sunucular üzerinden mesaj göndermek ve almak üzere iki ayrı mesaj kuyruğu kullanırsınız. +

+

+ Sunucular, kullanıcı konuşmalarının veya bağlantılarının tüm geçmişini bilmeden mesajları yalnızca tek bir yönde iletir. +

+
+
+ +
+
3. Sunucuların ne gördüğü
+
+ +

+ Sunucular her kuyruk için ayrı, anonim oturum açma bilgileri kullanır ve hangi kullanıcıya ait olduğunu bilmez. +

+

+ Tor erişim sunucuları kullanarak kullanıcılar, meta veri gizliliğini artırabilir ve IP adresi korelasyonunu önleyebilir. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Diğer protokollerle karşılaştırma

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, büyük platformlarXMPP / MatrixP2P protokolleri
Küresel bir kimlik gerektirirHayır – gizliEvet 1Evet 2Evet 3
MITM saldırısı riskiHayır – güvenli 4Evet 5EvetEvet
DNS sistemine bağımlılıkHayır – dayanıklıEvetEvetHayır
Tek veya merkezi ağHayır – merkeziyetsizEvetHayır – federasyonlu 6Evet 7
Merkezi bileşen veya diğer ağ genelinde saldırılarHayır – dayanıklıEvetEvet 2Evet 8
+
+ +
+ +
+
+
    +
  1. Genellikle telefon numarasına, bazen kullanıcı adına dayalı
  2. +
  3. DNS tabanlı adresler
  4. +
  5. Genel anahtar veya başka bir küresel benzersiz kimlik
  6. +
  7. SimpleX aktarıcıları uçtan uca şifrelemeyi tehlikeye atamaz. Olası bir ağ dışı kanal saldırısını önlemek için güvenlik kodunu doğrulayın
  8. +
  9. Operatörün sunucuları ele geçirilirse. Signal ve diğer uygulamalarda bunu azaltmak için güvenlik kodu doğrulanabilir
  10. +
  11. Kullanıcı meta verilerinin gizliliği korunmaz
  12. +
  13. P2P dağıtık olsa da federasyonlu değildir — tek bir ağ olarak çalışır
  14. +
  15. P2P ağlarının ya merkezi bir yönetimi vardır ya da tüm ağ tehlikeye girebilir - Buraya bakın
  16. +
+
+
+
+
+ + +

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

+ + + + + + + + + + diff --git a/transparency/index.html b/transparency/index.html new file mode 100644 index 0000000000..fe6a58a2ab --- /dev/null +++ b/transparency/index.html @@ -0,0 +1,1085 @@ + + + + + + + + + Transparency Reports + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+
+ +
+ + + +
+
+ + + +
+
+

Transparency Reports

+

Updated: Jan 15, 2025

+

SimpleX Chat Ltd. is a company registered in the UK – it develops communication software enabling users to operate and communicate via SimpleX network, without user profile identifiers of any kind, and without having their data hosted by any network infrastructure operators.

+

This page will include any and all reports on requests for user data.

+

To date, we received none.

+

In 2024 we received enquiries from several law enforcement agencies seeking information on our procedures for handling data requests. We responded by noting that we operate under the UK law and will consider such requests pursuant to UK law.

+

Our objective is to consistently ensure that no user data and absolute minimum of the metadata required for the network to function is available for disclosure by any infrastructure operators, under any circumstances.

+

Helpful resources:

+ +

Have a more specific question? Reach out to us via SimpleX Chat or via email chat@simplex.chat.

+

For any sensitive questions please use SimpleX Chat or encrypted email messages using the key for this address from keys.openpgp.org (its fingerprint is FB44 AF81 A45B DE32 7319 797C 8510 7E35 7D4A 17FC) and make your key available for a secure reply.

+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/uk/contact/index.html b/uk/contact/index.html new file mode 100644 index 0000000000..f3afbe2f42 --- /dev/null +++ b/uk/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Ви отримали адресу для підключення в SimpleX Chat

+

Щоб здійснити підключення:

+ +
+

Встановити додаток SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Підключитися в додатку

+ + + Відкрити додаток SimpleX + +
+

2

+
+
+ +
+

Торкніться кнопки ‘підключити’ в додатку

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Приєднатися SimpleX

+

Ми запрошуємо вас приєднатися до розмови

+ + + +

Підпишіться, щоб отримувати наші оновлення

+ +
+ + + +
+ +
+ +

Отримати SimpleX додаток для настільних комп'ютерів

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/uk/fdroid/index.html b/uk/fdroid/index.html new file mode 100644 index 0000000000..4b148bc3a6 --- /dev/null +++ b/uk/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat через F-Droid

+ +
+ +
+

Репозитарій SimpleX Chat

+
+
+

Стабільні та бета-версії, побудовані розробниками

+

Щоб додати його до свого клієнта F-Droid, скануйте QR-код або використовуйте цей URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ Відбиток підпису ключа (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

Репозитарій F-Droid.org

+ +

Стабільні версії, побудовані F-Droid.org

+

Релізи в це репо відбуваються на кілька днів пізніше.

+

SimpleX Chat та репозитарії F-Droid.org підписують збірки різними ключами. Щоб переключитися, будь ласка, експортуйте базу даних чату та перевстановіть додаток.

+
+
+ +
+
+ + + + + + + + + + diff --git a/uk/index.html b/uk/index.html new file mode 100644 index 0000000000..7d9d44468e --- /dev/null +++ b/uk/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/uk/invitation/index.html b/uk/invitation/index.html new file mode 100644 index 0000000000..16b0fb7082 --- /dev/null +++ b/uk/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

Ви отримали 1-разове посилання для підключення в SimpleX Chat

+

Щоб здійснити підключення:

+ +
+

Встановити додаток SimpleX

+
+ + + +
+ +
+

1

+
+
+ +
+

Підключитися в додатку

+ + + Відкрити додаток SimpleX + +
+

2

+
+
+ +
+

Торкніться кнопки ‘підключити’ в додатку

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

Приєднатися SimpleX

+

Ми запрошуємо вас приєднатися до розмови

+ + + +

Підпишіться, щоб отримувати наші оновлення

+ +
+ + + +
+ +
+ +

Отримати SimpleX додаток для настільних комп'ютерів

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/uk/learn-more/index.html b/uk/learn-more/index.html new file mode 100644 index 0000000000..1a67e56c4d --- /dev/null +++ b/uk/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

Чому SimpleX є унікальним

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Ви маєте повну конфіденційність

+
+ +
+ +
+

+ SimpleX захищає конфіденційність вашого профілю, контактів та метаданих, приховуючи їх від серверів мережі SimpleX та будь-яких спостерігачів. +

+

+ На відміну від будь-якої іншої існуючої мережі для обміну повідомленнями, у SimpleX немає ідентифікаторів, призначених користувачам — не навіть випадкових чисел. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Вас захищено
від спаму та зловживань

+
+ +
+ +
+

+ Оскільки у вас немає ідентифікатора або фіксованої адреси в мережі SimpleX, ніхто не може зв'язатися з вами, якщо ви не поділитеся одноразовою або тимчасовою адресою користувача, як QR-кодом або посиланням. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Ви контролюєте свої дані

+
+ +
+ +
+

+ SimpleX зберігає всі дані користувачів на пристроях клієнтів у переносному зашифрованому форматі бази даних — його можна передавати на інший пристрій. +

+

+ Зашифровані повідомлення від кінця до кінця тимчасово зберігаються на ретрансляційних серверах SimpleX до їх отримання, після чого вони назавжди видаляються. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Ви власник мережі SimpleX

+
+ +
+ +
+

+ Мережа SimpleX повністю децентралізована та незалежна від будь-якої криптовалюти або будь-якої іншої мережі, окрім Інтернету. +

+

+ Ви можете використовувати SimpleX з власними серверами або з серверами, які ми надаємо — і все одно підключатися до будь-якого користувача. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Особливості

+ +
+ +
+
+ + +
+

Повідомлення з шифруванням від кінця до кінця з можливістю використання Markdown та редагування

+
+ +
+
+ + +
+

Зображення, відео та файли з шифруванням від кінця до кінця

+
+ +
+
+ + +
+

Децентралізовані групи з шифруванням від кінця до кінця — тільки користувачі знають про їх існування

+
+ +
+
+ + +
+

Голосові повідомлення з шифруванням від кінця до кінця

+
+ +
+
+ + +
+

Зникнення повідомлень

+
+ +
+
+ + +
+

Дзвінки з шифруванням від кінця до кінця для аудіо та відео

+
+ +
+
+ + +
+

Переносне зашифроване зберігання додатку — переміщуйте профіль на інший пристрій

+
+ +
+
+ + +
+

Режим інкогніто —
унікальний для SimpleX Chat

+
+ +
+
+
+ + +
+
+

Що робить SimpleX конфіденційним

+ +
+
+ + +
+
+ + +
+
+

Тимчасові анонімні парні ідентифікатори

+
+ +

SimpleX використовує тимчасові анонімні парні адреси та облікові дані для кожного користувача, контакту чи учасника групи.

+ +

Це дозволяє доставляти повідомлення без ідентифікаторів профілю користувача та забезпечує кращу конфіденційність метаданих, ніж альтернативи.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Позаканальний
обмін ключами

+
+ +

Багато комунікаційних мереж вразливі до MITM-атак серверів чи постачальників мережі.

+ +

Щоб запобігти цьому, програми SimpleX передають одноразові ключі позаканально, коли ви ділитесь адресою як посиланням або QR-кодом.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

2 рівні шифрування від кінця до кінця

+
+ +

Протокол подвійної рейки — OTR-повідомлення з ідеальною передачею секрету та відновленням злому.

+ +

NaCL криптокоробка в кожній черзі для запобігання кореляції трафіку між чергами повідомлень у разі компрометації TLS.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Перевірка
цілісності повідомлення

+
+ +

Для гарантії цілісності повідомлення пронумеровані послідовно та містять хеш попереднього повідомлення.

+ +

Якщо будь-яке повідомлення додається, вилучається чи змінюється, отримувач буде проінформований.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Додатковий рівень
шифрування сервера

+
+ +

Додатковий рівень шифрування сервера для доставки отримувачу для запобігання кореляції між отриманим та відісланим трафіком сервера у разі компрометації TLS.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Змішування повідомлень
для зменшення кореляції

+
+ +

Сервери SimpleX виступають як вузли низької затримки для змішування — вхідні та вихідні повідомлення мають різний порядок.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Безпечний аутентифікований
транспорт TLS

+
+ +

Використовується лише TLS 1.2/1.3 із сильними алгоритмами для з'єднань клієнт-сервер.

+ +

Відбиток сервера та зв'язування каналу запобігають MITM та атакам повтору.

+ +

Відновлення з'єднання вимкнено для запобігання атакам на сесію.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Опційний
доступ через Tor

+
+ +

Для захисту вашої IP-адреси ви можете отримати доступ до серверів через Tor чи іншу транспортну оверлейну мережу.

+ +

Для використання SimpleX через Tor, будь ласка, встановіть додаток Orbot та активуйте SOCKS5-проксі (або VPN на iOS).

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Однобічні
черги повідомлень

+
+ +

Кожна черга повідомлень передає повідомлення в одному напрямку, з різними адресами для відправки та отримання.

+ +

Це зменшує вектори атак порівняно із традиційними брокерами повідомлень та доступними метаданими.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Кілька рівнів
наповнення вмісту

+
+ +

SimpleX використовує наповнення вмісту для кожного шару шифрування для ускладнення атак за розміром повідомлень.

+ +

Це забезпечує, що повідомлення різних розмірів виглядають однаково для серверів та спостерігачів мережі.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat надає найкращу конфіденційність, поєднуючи переваги P2P та федеративних мереж.

+ +
+
+
+ + +
+
+

На відміну від мереж P2P

+

+ Всі повідомлення відправляються через сервери, що забезпечує кращу конфіденційність метаданих та надійну асинхронну доставку повідомлень, уникаючи багатьох проблем P2P-мереж. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

На відміну від федеративних мереж

+

+ Сервери SimpleX Chat НЕ зберігають профілі користувачів, контакти та доставлені повідомлення, НЕ підключаються один до одного, і НЕ існує каталог серверів. +

+
+
+ + + +
+
+ + +
+
+

Мережа SimpleX

+

+ сервери надають однобічні черги для з'єднання користувачів, але вони не мають видимості графа підключень в мережі — лише користувачі. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Пояснення SimpleX

+ + + + + + + +
+
+ +
+
1. Що відчувають користувачі
+
+ +

+ Ви можете створювати контакти та групи і вести двосторонні розмови, як у будь-якому іншому месенджері. +

+

+ Як це може працювати з однобічними чергами та без ідентифікаторів профілю користувача? +

+
+
+ +
+
2. Як це працює
+
+ +

+ Для кожного з'єднання ви використовуєте дві окремі черги обміну повідомленнями для відправки та отримання повідомлень через різні сервери. +

+

+ Сервери передають повідомлення тільки в одному напрямку, не маючи повної картини розмов або підключень користувача. +

+
+
+ +
+
3. Що бачать сервери
+
+ +

+ Сервери мають окремі анонімні облікові дані для кожної черги і не знають, які користувачі до них відносяться. +

+

+ Користувачі можуть додатково підвищити конфіденційність метаданих, використовуючи Tor для доступу до серверів, що запобігає кореляції за IP-адресою. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Порівняння з іншими протоколами

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, великі платформиXMPP, MatrixПротоколи P2P
Потребує глобального ідентифікатораНі - конфіденційноТак 1Так 2Так 3
Можливість MITMНі - безпечно 4Так 5ТакТак
Залежність від DNSНі - стійкоТакТакНі
Одна чи централізована мережаНі - децентралізованоТакНі - федеративно 6Так 7
Центральний компонент чи інша атака на всю мережуНі - стійкоТакТак 2Так 8
+
+ +
+ +
+
+
    +
  1. Зазвичай базується на номері телефону, у деяких випадках на іменах користувачів
  2. +
  3. Адреси, засновані на DNS
  4. +
  5. Відкритий ключ чи який-небудь інший глобально унікальний ідентифікатор
  6. +
  7. Ретранслятори SimpleX не можуть порушити e2e-шифрування. Перевірте безпековий код для зменшення ризику атаки на зовнішньобандовий канал
  8. +
  9. Якщо сервери оператора порушені. Перевірте безпековий код в Signal та деяких інших додатках для зменшення ризику
  10. +
  11. Не захищає конфіденційність метаданих користувачів
  12. +
  13. Хоча P2P є розподіленими, вони не є федеративними — вони працюють як одна мережа
  14. +
  15. Мережі P2P мають або центральний орган управління, або всю мережу можна порушити - дивіться тут
  16. +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/video/connect.mp4 b/video/connect.mp4 new file mode 100644 index 0000000000..626172b3ee Binary files /dev/null and b/video/connect.mp4 differ diff --git a/zh_Hans/contact/index.html b/zh_Hans/contact/index.html new file mode 100644 index 0000000000..34d1c5b8d0 --- /dev/null +++ b/zh_Hans/contact/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

您收到了一个用于连接 SimpleX Chat 的地址

+

要建立连接:

+ +
+

安装 SimpleX 应用程序

+
+ + + +
+ +
+

1

+
+
+ +
+

在应用程序中连接

+ + + 打开 Simplex 应用程序 + +
+

2

+
+
+ +
+

点按应用中的 “连接” 按钮

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

加入 SimpleX

+

我们邀请您加入对话

+ + + +

注册以接收我们的更新

+ +
+ + + +
+ +
+ +

获取 SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/zh_Hans/fdroid/index.html b/zh_Hans/fdroid/index.html new file mode 100644 index 0000000000..82885371b7 --- /dev/null +++ b/zh_Hans/fdroid/index.html @@ -0,0 +1,840 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

通过 F-Droid 下载 SimpleX

+ +
+ +
+

SimpleX 存储库

+
+
+

开发人员构建的稳定版和测试版

+

要将其添加到您的 F-Droid 客户端,请扫描二维码或使用以下 URL:

+ + https://app.simplex.chat/fdroid/repo + +

+ 签名密钥指纹 (SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org 存储库

+ +

由 F-Droid.org 构建的稳定版本

+

此存储库的版本将延迟数天发布.

+

SimpleX Chat 和 F-Droid.org 存储库使用不同的密钥对构建进行签名。 如需切换,请导出聊天数据库并重新安装应用。

+
+
+ +
+
+ + + + + + + + + + diff --git a/zh_Hans/index.html b/zh_Hans/index.html new file mode 100644 index 0000000000..d7fde8c7f0 --- /dev/null +++ b/zh_Hans/index.html @@ -0,0 +1,766 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/zh_Hans/invitation/index.html b/zh_Hans/invitation/index.html new file mode 100644 index 0000000000..2639cebd7b --- /dev/null +++ b/zh_Hans/invitation/index.html @@ -0,0 +1,1002 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

您收到了一个连接 SimpleX Chat 的一次性链接

+

要建立连接:

+ +
+

安装 SimpleX 应用程序

+
+ + + +
+ +
+

1

+
+
+ +
+

在应用程序中连接

+ + + 打开 Simplex 应用程序 + +
+

2

+
+
+ +
+

点按应用中的 “连接” 按钮

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

加入 SimpleX

+

我们邀请您加入对话

+ + + +

注册以接收我们的更新

+ +
+ + + +
+ +
+ +

获取 SimpleX desktop app

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/zh_Hans/learn-more/index.html b/zh_Hans/learn-more/index.html new file mode 100644 index 0000000000..8a9f1e1316 --- /dev/null +++ b/zh_Hans/learn-more/index.html @@ -0,0 +1,1856 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

为什么 SimpleX 是 独特的

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

您有完整的隐私

+
+ +
+ +
+

+ SimpleX 保护您的个人资料、联系人和元数据的隐私,不让 SimpleX 网络服务器和任何观察者看到它们。 +

+

+ 与任何其他现有的消息传递网络不同,SimpleX 没有分配给用户的标识符—— 甚至随机数也没有。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

您可以免受垃圾消息和平台滥用的侵害

+
+ +
+ +
+

+ 因为您在 SimpleX 网络上没有标识符或固定地址,所以除非您以二维码或链接的形式分享一次性或临时用户地址,没有人可以联系您。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

您控制您的数据

+
+ +
+ +
+

+ SimpleX 以便携式加密数据库格式将所有用户数据存储在客户端设备上—— 它可以转移到另一个设备。 +

+

+ 端到端加密的消息在被收到前会暂时保存在 SimpleX 中继服务器上,传送完成后它们会被永久删除。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

您拥有 SimpleX 网络

+
+ +
+ +
+

+ SimpleX 网络是完全去中心化的,并且独立于任何加密货币或除互联网以外的任何其他网络。 +

+

+ 您可以搭配自己的服务器来使用 SimpleX 或使用我们提供的服务器 — 并仍然连接到任何用户。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

功能

+ +
+ +
+
+ + +
+

端到端加密的文字消息,支持markdown和编辑

+
+ +
+
+ + +
+

端到端加密的
图片、视频和文件

+
+ +
+
+ + +
+

端到端加密的去中心化的秘密群组 —只有用户知道它们的存在

+
+ +
+
+ + +
+

端到端加密的语音消息

+
+ +
+
+ + +
+

支持消息自动销毁

+
+ +
+
+ + +
+

端到端加密的音视频通话

+
+ +
+
+ + +
+

便携的加密应用存储— 可将您的个人资料移至另一台设备

+
+ +
+
+ + +
+

隐身模式 —
SimpleX Chat 独有

+
+ +
+
+
+ + +
+
+

是什么让 SimpleX 能够保密

+ +
+
+ + +
+
+ + +
+
+

临时匿名成对标识符

+
+ +

SimpleX 为每个用户的联系人或群组成员均使用临时匿名成对地址和凭据。

+ +

它让在没有用户标识符的情况下传递消息成为可能,并提供比替代方案更好的元数据隐私。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

带外密钥交换

+
+ +

许多通信平台容易受到服务器或网络提供商的中间人攻击。

+ +

为防止这种情况,当您将通讯地址作为链接或二维码共享时,SimpleX 应用程序会在带外传递一次性密钥。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

双层端到端加密

+
+ +

双棘轮协议——具有完美前向保密和入侵恢复功能的 OTR(不留记录即时通讯) 消息传递。

+ +

每个队列中的网络与密码学库加密盒(NaCL cryptobox)可防止 TLS 受到威胁时消息队列之间的流量关联。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

消息完整性验证

+
+ +

为了保证消息完整性,消息按顺序编号并会包含前一条消息的哈希值。

+ +

如果添加、删除或更改任何消息,收件人都会收到警告。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

服务器提供的另一层加密

+
+ +

为来信附加服务器加密层,以防止在 TLS 受破坏时接收和发送的服务器流量之间发生关联。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

通过消息混合减少相关性

+
+ +

SimpleX 服务器会充当低延迟混合节点,打乱传入和传出消息的顺序。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

安全认证的TLS传输

+
+ +

客户端与服务器之间的连接只使用强加密的 TLS 1.2/1.3。

+ +

服务器指纹和通道绑定可防止中间人与重放攻击。

+ +

禁用连接恢复以防止会话攻击。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

可选择通过 Tor 访问

+
+ +

为了保护您的 IP 地址,您可以通过 Tor 或其他传输覆盖网络访问服务器。

+ +

要通过 Tor 使用 SimpleX,请安装 Orbot 应用并启用 SOCKS5 代理(在 iOS上需要使用 VPN 模式)。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

单向消息队列

+
+ +

每个消息队列都有不同的发送和接收地址,单向地传递消息。

+ +

与传统的消息代理相比,它减少了攻击媒介和可用的元数据。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

多层级的内容填充

+
+ +

SimpleX 为每个加密层进行内容填充来对抗长度扩展攻击。

+ +

它使不同大小的消息在服务器和网络监视者看来是一样的。

+ +
+

点击关闭

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX 网络

+

Simplex Chat 通过结合 P2P 和联邦网络的优势使其保密性无与伦比。

+ +
+
+
+ + +
+
+

与 P2P 网络不同

+

+ 所有消息都通过服务器发送,既能更好地保护元数据隐私和可靠地传递异步消息,同时也能避免许多 P2P网络存在的问题. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

不同于联邦网络

+

+ SimpleX 中继服务器不存储用户配置文件、联系人和传递的消息,不相互连接,并且没有服务器目录。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX 网络

+

+ 服务器提供单向队列来连接用户,但是他们看不到网络连接图图谱— 只有用户可以。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX 简述

+ + + + + + + +
+
+ +
+
1. 用户会体验到什么
+
+ +

+ 您可以创建联系人和群组,并进行双向对话,就像是任何其他即时通讯软件一样。 +

+

+ 它是如何利用单向消息队列并不利用用户识别符工作的? +

+
+
+ +
+
2. 背后的运作原理
+
+ +

+ 对于每个连接,您都会使用两个单独的消息队列,通过不同的服务器发送和接收消息。 +

+

+ 服务器只会单向传输消息,而无法掌握用户的对话或连接的全貌。 +

+
+
+ +
+
3. 服务器能看到什么
+
+ +

+ 服务器对每个队列都有单独的匿名凭证,并且不知道这些凭证属于哪些用户。 +

+

+ 用户可以通过使用 Tor 访问服务器以进一步提高元数据隐私,防止通过 IP 地址关联实际身份。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

与其他协议的比较

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal、其他大平台XMPP、MatrixP2P协议
需要全局身份否 - 私密123
中间人攻击的可能性不可能 - 安全 45
对 DNS 的依赖不依赖 - 有韧性
单一或中心化网络不依赖 - 去中心化的不依赖 - 联邦式网络 67
中央组件或其他全网攻击不依赖 - 有韧性28
+
+ +
+ +
+
+
    +
  1. 通常基于电话号码,在某些情况下基于用户名
  2. +
  3. 基于 DNS 的地址
  4. +
  5. 公钥或其他一些全球唯一的 ID
  6. +
  7. SimpleX 中继无法破坏 e2e 加密。 验证安全代码以减轻对带外通道的攻击
  8. +
  9. 如果运营商的服务器受到威胁。 验证 Signal 和其他一些应用程序中的安全代码以缓解该问题
  10. +
  11. 不保护用户的元数据
  12. +
  13. P2P 是分布式的,但并非联邦式的 — 它们作为单个网络运行
  14. +
  15. P2P 网络要么拥有中央权威,要么整个网络可能被攻陷 - 参见此处
  16. +
+
+
+
+
+ + +

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

+ + + + + + + + + + diff --git a/zh_Hant/contact/index.html b/zh_Hant/contact/index.html new file mode 100644 index 0000000000..0689271d7e --- /dev/null +++ b/zh_Hant/contact/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Contact + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

您收到了SimpleX聯絡地址

+

建立連結:

+ +
+

安裝 SimpleX 應用程式

+
+ + + +
+ +
+

1

+
+
+ +
+

在應用中連結

+ + + 開啟SimpleX應用程式 + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

加入 SimpleX

+

We invite you to join the conversation

+ + + +

登記以收取更新

+ +
+ + + +
+ +
+ +

下載SimpleX 桌面版應用程式

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/zh_Hant/fdroid/index.html b/zh_Hant/fdroid/index.html new file mode 100644 index 0000000000..8f301f2d75 --- /dev/null +++ b/zh_Hant/fdroid/index.html @@ -0,0 +1,832 @@ + + + + + + + SimpleX Chat - Get the app via F-Droid + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + +
+
+

SimpleX Chat via F-Droid

+ +
+ +
+

SimpleX Chat儲存庫

+
+
+

Stable and beta versions built by the developers

+

掃描二維碼或使用此URL以添加SimpleX儲存庫至您的F-Droid客戶端:

+ + https://app.simplex.chat/fdroid/repo + +

+ 簽名密鑰指紋(SHA-256): +

+ 9F 35 8F F2 84 D1 F7 16 56 A2 BF AF 0E 00 5D EA E6 AA 14 14 37 20 E0 89 F1 1F F2 DD CF EB 01 BA +
+

+
+ + +
+
+ +
+

F-Droid.org repo

+ +

由F-Droid.org編譯的穩定版

+

The releases to this repo are done several days later.

+

SimpleX Chat 和F-Droid.org 儲存庫使用不同的金鑰為安裝包簽名。若要切換,請匯出聊天資料庫並重新安裝應用程式。

+
+
+ +
+
+ + + + + + + + + + diff --git a/zh_Hant/index.html b/zh_Hant/index.html new file mode 100644 index 0000000000..18173cadf5 --- /dev/null +++ b/zh_Hant/index.html @@ -0,0 +1,761 @@ + + + + + + + Simplex Chat + + + + + + + + +
+ + + +
+ +
+
+
+
+

Be Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security, servers can’t see your messages or who you talk to.

+ Learn more about SimpleX messaging +
+
+
+ +
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+ +
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more about Community Vouchers +
+
+
+ +
+
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
+ + + + + +
+
+ + + + + + + + diff --git a/zh_Hant/invitation/index.html b/zh_Hant/invitation/index.html new file mode 100644 index 0000000000..66c67aac96 --- /dev/null +++ b/zh_Hant/invitation/index.html @@ -0,0 +1,994 @@ + + + + + + + SimpleX Chat - Invitation + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + +
+
+
+

您收到了SimpleX一次性連結

+

建立連結:

+ +
+

安裝 SimpleX 應用程式

+
+ + + +
+ +
+

1

+
+
+ +
+

在應用中連結

+ + + 開啟SimpleX應用程式 + +
+

2

+
+
+ +
+

Tap the ‘connect’ button in the app

+ +
+

3

+
+
+
+
+
+ + + + + + + + +
+
+

加入 SimpleX

+

We invite you to join the conversation

+ + + +

登記以收取更新

+ +
+ + + +
+ +
+ +

下載SimpleX 桌面版應用程式

+
+ + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/zh_Hant/learn-more/index.html b/zh_Hant/learn-more/index.html new file mode 100644 index 0000000000..25a573831d --- /dev/null +++ b/zh_Hant/learn-more/index.html @@ -0,0 +1,1848 @@ + + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+

Learn More

+

The First Messenger Without User IDs

+

Unlike other messaging apps, SimpleX Chat has no user identifiers at all - not even random numbers. This protects both your messages and your metadata, hiding who you communicate with from servers and observers.

+

Why It Matters

+

Complete Privacy: Other apps use phone numbers, usernames, or IDs. SimpleX uses none of these, making it impossible to build your social graph.

+

No Spam: You can't be contacted unless you share a one-time invitation link.

+

Your Data: Everything stays on your device. Servers only hold messages temporarily until delivered.

+

True Decentralization: Use your own servers or the provided ones - everyone can still communicate.

+

Key Features

+
    +
  • 🔐 Double ratchet end-to-end encryption with post-quantum resistance
  • +
  • 📱 Mobile apps for iOS and Android, desktop apps for all platforms
  • +
  • 🎭 Incognito mode, disappearing messages, multiple profiles
  • +
  • 🌐 Tor support and private message routing
  • +
  • 💾 Encrypted local database and files
  • +
  • 🚀 Open source with security audits by Trail of Bits
  • +
+

How It Works

+

Connect by sharing a QR code or link. SimpleX uses disposable message queues instead of user addresses - like having a different phone number for each contact, automatically managed.

+

Get Started | Read the Docs

+ +
+
+ + +
+
+

SimpleX為何與眾不同

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

您擁有完整的私隱權

+
+ +
+ +
+

+ SimpleX 保護您的個人資料、聯絡人和元資料的隱私,使其對 SimpleX 網路伺服器和任何觀察者隱藏。 +

+

+ 與任何其他現有的訊息網路不同,SimpleX 不指定使用者的標識符—甚至沒有隨機數。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

SimpleX保護您免受垃圾訊息、濫用之害

+
+ +
+ +
+

+ 由於您在 SimpleX 網路上沒有任何標識符或固定地址,因此除非您分享一次性或臨時地址 (如 二維碼或連結),任何人都無法與您聯絡。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

您掌控您的數據

+
+ +
+ +
+

+ SimpleX 以 可攜式加密數據庫格式 儲存用戶端裝置上的所有使用者資料;這些資料可傳輸至其他設備。 +

+

+ 端對端加密的訊息暫時保留在 SimpleX 中繼伺服器上,收到訊息後會被永久刪除。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

您擁有SimpleX網路

+
+ +
+ +
+

+ SimpleX 網路是完全去中心化的,獨立於任何加密貨幣或任何其他網路(除Internet)。 +

+

+ 您可以使用您自己的伺服器運行SimpleX,或使用我們提供的伺服器並仍連線到任何使用者。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

特徵

+ +
+ +
+
+ + +
+

支持Markdown與編輯的、端到端加密的訊息

+
+ +
+
+ + +
+

端到端加密的圖像、視訊、檔案

+
+ +
+
+ + +
+

端到端加密的、去中心化的群組—存在只有用戶自己知道

+
+ +
+
+ + +
+

端到端加密的語音訊息

+
+ +
+
+ + +
+

自刪除訊息

+
+ +
+
+ + +
+

端到端加密的語音、視訊通話

+
+ +
+
+ + +
+

可攜、加密存儲—將設定檔移至另一設備

+
+ +
+
+ + +
+

隱身模式—SimpleX獨有

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

臨時匿名標識符對

+
+ +

對用戶與群組成員,SimpleX使用臨時、匿名的地址對與憑證對。

+ +

SimpleX使不用用戶設定檔傳輸訊息成為可能,與其他軟體相比提供更強的詮釋資料私隱性。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

頻帶外密鑰交換

+
+ +

許多通訊網路容易受到伺服器或網路供應商的中間人攻擊。

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

雙層端到端加密

+
+ +

雙棘輪協定—帶有前向保密、入侵恢復特質的不留記錄即時通訊協定。

+ +

如TLS安全受威脅,每個隊列中的NaCL cryptobox可防止關聯訊息隊列間的通訊。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

訊息完整性驗證

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

伺服器附加加密層

+
+ +

傳送至收件者的伺服器加密附加層,以防止 TLS 遭到攻擊時,接收和傳送的伺服器流量之間的關聯。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

訊息混雜以降低關聯性

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

經安全鑑權的TLS 傳送

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

連線恢復被停用,以防止會話攻擊。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

選擇性
經由 Tor 訪問

+
+ +

為保護您的 IP 位址,您可透過 Tor 或其他傳輸覆蓋網路訪問伺服器。

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

單向訊息隊列

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

與傳統的訊息代理相比,它可減小攻擊媒介及可見的詮釋資料量。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

多層內容填充

+
+ +

SimpleX 為每個加密層使用內容填充,以挫敗通過監控訊息長度的攻擊。

+ +

它讓不同長度的訊息在伺服器和網路觀察者看來相同。

+ +
+

輕觸以關閉

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

SinpleX Chat 結合點對點和互聯網路的優點,提供最佳的隱私性。

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ 所有訊息都經由伺服器傳送,既能提供更好的元資料隱私和可靠的異步訊息傳送,又能避免許多 點對點網路的弊病. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

與互聯網路不同

+

+ SimpleX 中繼伺服器不儲存使用者個人資料、聯絡人和傳送的訊息,也不連線彼此,也沒有伺服器目錄。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX網路

+

+ 伺服器提供單向佇列以連接使用者,但伺服器無法看到網路連線圖 —只有使用者能看到。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX 解釋

+ + + + + + + +
+
+ +
+
1. 用戶體驗
+
+ +

+ 你可以建立聯絡人和群組,並進行雙向對話,就像在任何其他即時通訊軟件中一樣。 +

+

+ 它如何在沒有使用者個人檔案識別符的情況下使用單向佇列? +

+
+
+ +
+
2. 它是如何工作的
+
+ +

+ 對於每個連接,您可以使用兩個單獨的消息佇列通過不同的伺服器發送和接收消息。 +

+

+ 伺服器僅單向傳遞消息,無法全面瞭解使用者的對話記錄或連接。 +

+
+
+ +
+
3. 伺服器可以看到什麼
+
+ +

+ 伺服器對每個佇列都有單獨的匿名憑證,並且不知道它們屬於哪些使用者。 +

+

+ 用戶可以通過使用 Tor 訪問伺服器來進一步提高元數據隱私,防止按 IP 位址進行序列化。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

與其他協議之比較

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal,大平台XMPP、Matrix點對點協議
需要全局身份No - privateYes 1Yes 2Yes 3
中間人攻擊之可能No - secure 4Yes 5YesYes
對DNS的依賴No - resilientYesYesNo
單一或集中式網路No - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. 通常基於電話號碼,有時用戶名
  2. +
  3. 基於DNS的位址
  4. +
  5. 公鑰或其他某種全局獨一的標識符
  6. +
  7. SimpleX中繼不可能威脅端到端加密。由其他方式驗證安全碼以杜絕攻擊之可能
  8. +
  9. 如果運營商的伺服器受到攻擊,用其他應用程式(如 Signal)驗證 SimpleX 安全碼,以減輕風險
  10. +
  11. 不保護使用者的元數據隱私
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. 點對點網路必須有中央權威,否則整個網路都可能受到攻擊 - 見此
  16. +
+
+
+
+
+ + +

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

+ + + + + + + + + +