Compare commits

...

68 Commits

Author SHA1 Message Date
tsu-gu a65c0b6efc add slovak translation 2023-02-05 21:13:03 +00:00
tsu-gu a8de1f8467 Delete 'lib/l10n/cwtch.arb'
wrong file name
2023-02-05 21:12:26 +00:00
tsu-gu a97b6e3dd8 add slovak translation 2023-02-05 21:11:25 +00:00
Sarah Jamie Lewis 8417204a24 Update UI Tests to Run with Flutter 3 / In Drone (#621)
Reviewed-on: cwtch.im/cwtch-ui#621
Co-authored-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
Co-committed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2023-02-01 22:48:36 +00:00
Sarah Jamie Lewis bf05a52d63 Fix debug layout errors + Fix Quoted File Message Layout 2022-12-30 23:17:18 +00:00
Sarah Jamie Lewis 23ae1ac0bb Allow Links to be Selectable / Fix Performance of Message Row to prevent Spurious Renders 2022-12-30 23:17:18 +00:00
Dan Ballard 7bcde5a1fa Merge pull request 'Ensure all Scrollbars have dedicated Controllers' (#613) from scrollbars into trunk
Reviewed-on: cwtch.im/cwtch-ui#613
2022-12-30 23:16:00 +00:00
Sarah Jamie Lewis 723b0eb04d Ensure all Scrollbars have dedicated Controllers
Fix: #602
2022-12-30 23:16:00 +00:00
Dan Ballard 119e683d3d Merge pull request 'Error fetch lcg scripts on failure' (#612) from failonfetch into trunk
Reviewed-on: cwtch.im/cwtch-ui#612
2022-12-30 23:15:29 +00:00
Sarah Jamie Lewis 6abf506f18 Error fetch lcg scripts on failure 2022-12-28 18:55:06 -08:00
Sarah Jamie Lewis fd8790fab6 Fix Mac Builds 2022-12-16 20:54:30 +00:00
Sarah Jamie Lewis 00c385bb91 Merge pull request 'fix ffi DeactivatePeerEngine call - hide it - bump pubspec version' (#599) from fixDeactivate into trunk
Reviewed-on: cwtch.im/cwtch-ui#599
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2022-12-15 03:58:17 +00:00
Dan Ballard c2f46a0117 Merge branch 'noDisable' into fixDeactivate 2022-12-14 16:16:01 -08:00
Dan Ballard f7da7b4bb7 bump pubspec for 1.10 release 2022-12-14 16:15:30 -08:00
Dan Ballard 448900b48e no isable profiles till it works 2022-12-14 16:14:58 -08:00
Dan Ballard 4a11968567 update flutter-desktop linux container to use newer build with older glibc for compat 2022-12-13 09:54:36 -08:00
Dan Ballard abec0f3ad5 Merge pull request 'Fix Android File Sharing' (#600) from newjson into trunk
Reviewed-on: cwtch.im/cwtch-ui#600
2022-12-13 00:37:17 +00:00
Sarah Jamie Lewis 28ce08637b Fix Android File Sharing 2022-12-12 15:13:32 -08:00
Sarah Jamie Lewis c8bdc56507 Merge pull request 'save profile.autostart on create' (#598) from saveAutostart into trunk
Reviewed-on: cwtch.im/cwtch-ui#598
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2022-12-12 02:54:32 +00:00
Dan Ballard 4e895723e2 Merge branch 'trunk' into saveAutostart 2022-12-12 00:00:20 +00:00
Dan Ballard 9958c72d5d fix ffi DeactivatePeerEngine call 2022-12-11 15:59:37 -08:00
Dan Ballard c498a0c86a fix kotlin mainactivity createPeer 2022-12-11 15:14:05 -08:00
Sarah Jamie Lewis 596b65f12d Merge pull request 'add offline icon to server rows' (#597) from serverOfflineIcon into trunk
Reviewed-on: cwtch.im/cwtch-ui#597
2022-12-11 18:35:16 +00:00
Sarah Jamie Lewis 16eda0ce8a Merge branch 'trunk' into serverOfflineIcon 2022-12-11 18:35:09 +00:00
Dan Ballard ff332dee9c save profile.autostart on create 2022-12-11 10:16:08 -08:00
Dan Ballard 8eb2e73b10 add offline icon to server rows 2022-12-11 10:13:07 -08:00
Sarah Jamie Lewis 469624c46c Merge pull request 'add windowManager.focus to notification click response' (#595) from notiFocus into trunk
Reviewed-on: cwtch.im/cwtch-ui#595
2022-12-11 17:25:34 +00:00
Dan Ballard ffa52f697a add windowManager.focus to notification click response 2022-12-11 17:25:29 +00:00
Sarah Jamie Lewis f585122f57 Fix NPE Exception in Double Col View During Notification Swtiching 2022-12-11 09:18:18 -08:00
Sarah Jamie Lewis be26d40176 Update Splash Screen Animation with new Cwtch Logo (by Marcia) 2022-12-09 19:45:50 -08:00
Sarah Jamie Lewis 9a67008ece Update LCG + Fuzzbot Fix
Fix: #584
Fix: #575
2022-12-07 15:02:53 -08:00
Sarah Jamie Lewis 27a729d09a Fix Change Password for Unencrypted Profiles / Handle TokenUpdates with No Tokens / Format 2022-12-06 12:11:55 -08:00
Sarah Jamie Lewis 7ee619f1a6 Merge pull request 'lcgbump' (#591) from lcgBump into trunk
Reviewed-on: cwtch.im/cwtch-ui#591
2022-12-06 18:05:26 +00:00
Dan Ballard 993f42113e lcgbump 2022-12-06 09:35:37 -08:00
Sarah Jamie Lewis 6418170b2e Merge pull request '69 nice theme fixes' (#590) from 69nicefixes into trunk
Reviewed-on: cwtch.im/cwtch-ui#590
2022-12-06 00:33:23 +00:00
erinn 91f44d631c Merge branch 'trunk' into 69nicefixes 2022-12-06 00:27:58 +00:00
erinn 928a201a3b missing contactsview.dart from last commit 2022-12-05 16:16:08 -08:00
erinn 007fb02cba another double toast fix, more comment cleanup 2022-12-05 16:14:21 -08:00
erinn 65b0ecc0c3 many theme consistency updates per marcia 2022-12-05 16:06:33 -08:00
Sarah Jamie Lewis faba13d435 Merge pull request 'fixes' (#588) from fixes into trunk
Reviewed-on: cwtch.im/cwtch-ui#588
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2022-12-06 00:06:19 +00:00
Dan Ballard 6746abacd7 fix translations for new feature, use icon 2022-12-05 12:26:42 -08:00
Dan Ballard d4546199e4 support (de)activatePeerEngine; turning peers on/off; autostart peers; new UI update for offline contacts/profiles 2022-12-05 12:26:42 -08:00
Dan Ballard f29e926d28 fix lunux scripts LD_LIBRARY_PATH to include Tor (for ssl etc) and fix color of add/edit profile button 2022-12-05 12:26:42 -08:00
Sarah Jamie Lewis ada351f778 Set home directory in linux setup
Fix: #586
2022-12-04 09:33:01 -08:00
Sarah Jamie Lewis 65a1280b35 Update LCG
Fix: #560
2022-11-30 11:41:47 -08:00
Sarah Jamie Lewis 3b60bf085a Fix context listen issues in debug 2022-11-28 13:59:43 -08:00
Sarah Jamie Lewis 3784ec04e3 Asset TextCaptialization.sentences on Android
Fix: #21
2022-11-28 13:46:59 -08:00
Sarah Jamie Lewis 17ffe03dba Fix Android Profile Export
Fix #512.
2022-11-28 13:35:12 -08:00
Sarah Jamie Lewis 059d32718b Enable Formatting on Quoted Messages
Fix: #556
2022-11-28 10:33:04 -08:00
Sarah Jamie Lewis f6710484a2 Add replying to 2022-11-24 13:28:25 -08:00
Sarah Jamie Lewis b0668812e4 Juniper Theme Intro 2022-11-23 12:20:02 -08:00
Sarah Jamie Lewis cfe5f29213 Juniper Theme
A theme dedicated to Juniper.
2022-11-23 12:19:01 -08:00
Sarah Jamie Lewis b866124147 Hide Address Copy in Peer Settings when Streamer Mode is Enabled
Fix: #557
2022-11-23 11:58:49 -08:00
Sarah Jamie Lewis ed4bb99fde Add More Prominant Unlock Profile Button
+ add buttons to onboarding flow

Fix: #561
2022-11-23 10:05:54 -08:00
Sarah Jamie Lewis b282ace9c3 Allow Message formatting to be turned off when experiments are disabled
Fix: #549
2022-11-23 08:34:14 -08:00
Sarah Jamie Lewis daa0e65070 Update 2022-11-18 06:24:24 -08:00
Sarah Jamie Lewis 25e1300b2b Support for Brazilian Portuguese (#564) 2022-11-18 06:21:32 -08:00
Kaio Duarte Costa d4a87cd416 language localization corrections and line inclusion
Added: 'LocalePtBr' 
Correction: 'locale'
2022-11-18 13:28:36 +00:00
Kaio Duarte Costa 0455ed15d7 Brazilian Portuguese translation - 99% complete 2022-11-18 13:23:29 +00:00
Kaio Duarte Costa 1f15e8af39 Translation Update - 80% 2022-11-17 21:23:50 +00:00
Kaio Duarte Costa 32b4ad2576 File with Brazilian Portuguese translation 2022-11-17 00:45:01 +00:00
Sarah Jamie Lewis 08d337401f Update Flutter Build Images 2022-11-16 17:54:23 +00:00
Sarah Jamie Lewis 91eca10f12 Update test/crypto deps 2022-11-16 17:54:23 +00:00
Sarah Jamie Lewis 870e7338ae Copyright notice 2022-11-16 17:54:23 +00:00
Sarah Jamie Lewis af4aab3a47 New Cwtch Icons, Dutch / Turkish Translations 2022-11-16 17:54:23 +00:00
Dan Ballard 8972d0eef5 Merge pull request 'Fix Mac Builds' (#541) from fix-mac into trunk
Reviewed-on: cwtch.im/cwtch-ui#541
2022-09-10 21:34:51 +00:00
Sarah Jamie Lewis 881cfbd0a3 Merge branch 'trunk' into fix-mac 2022-09-10 21:34:19 +00:00
Sarah Jamie Lewis c5f684e42e Fix Mac Builds 2022-09-10 14:33:33 -07:00
126 changed files with 2457 additions and 338550 deletions

View File

@ -8,7 +8,7 @@ clone:
steps:
- name: clone
image: cirrusci/flutter:3.0.1
image: cirrusci/flutter:3.3.8
environment:
buildbot_key_b64:
from_secret: buildbot_key_b64
@ -24,7 +24,7 @@ steps:
- git checkout $DRONE_COMMIT
- name: fetch
image: cirrusci/flutter:3.0.1
image: cirrusci/flutter:3.3.8
volumes:
- name: deps
path: /root/.pub-cache
@ -47,7 +47,7 @@ steps:
# #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting
- name: build-linux
image: openpriv/flutter-desktop:linux-fstable-3.0.1
image: openpriv/flutter-desktop:linux-fstable-3.3.9
volumes:
- name: deps
path: /root/.pub-cache
@ -60,8 +60,20 @@ steps:
- tar -czf cwtch-`cat ../VERSION`.tar.gz cwtch
- rm -r cwtch
- name: linux-ui-tests
image: openpriv/flutter-desktop:linux-fstable-3.3.9
volumes:
- name: deps
path: /root/.pub-cache
commands:
- # todo: add xvfb to openpriv/flutter-desktop:linux-fstable-3.7
- sudo apt update
- sudo apt-get install -y xvfb
- ./fetch-tor.sh
- ./run-tests-headless.sh 02_save_load
- name: test-build-android
image: cirrusci/flutter:3.0.1
image: cirrusci/flutter:3.3.8
when:
event: pull_request
volumes:
@ -71,7 +83,7 @@ steps:
- flutter build apk --debug
- name: build-android
image: cirrusci/flutter:3.0.1
image: cirrusci/flutter:3.3.8
when:
event: push
environment:
@ -95,7 +107,7 @@ steps:
#- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android
- name: widget-tests
image: cirrusci/flutter:3.0.1
image: cirrusci/flutter:3.3.8
volumes:
- name: deps
path: /root/.pub-cache
@ -177,7 +189,7 @@ clone:
steps:
- name: clone
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.0.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
environment:
buildbot_key_b64:
from_secret: buildbot_key_b64
@ -195,7 +207,7 @@ steps:
- git checkout $Env:DRONE_COMMIT
- name: fetch
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.0.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
commands:
- git describe --tags --abbrev=1 > VERSION
- powershell -command "Get-Date -Format 'yyyy-MM-dd-HH-mm'" > BUILDDATE
@ -203,7 +215,7 @@ steps:
- .\fetch-libcwtch-go.ps1
- name: build-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.0.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
commands:
- flutter pub get
- $Env:version += type .\VERSION
@ -262,7 +274,7 @@ steps:
- move *.sha512 deploy\$Env:builddir
- name: deploy-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.0.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
when:
event: push
status: [ success ]

18
.gitignore vendored
View File

@ -41,15 +41,29 @@ app.*.symbols
app.*.map.json
# Tor
data-dir*
*data-dir*
# Test Artificats
*.log
flutter_gherkin
run-tests.env
report.json
package.
# Compiled Libs
linux/tor
linux/libCwtch.so
android/cwtch/cwtch.aar
android/app/src/main/jniLibs/*/libtor.so
libCwtch.dylib
*.dylib
integration_test/gherkin_suite_test.g.dart
integration_test/gherkin_suite_test.dart
integration_test/gherkin/
integration_test/CustomSteps.md
analysis_options.yaml
integration_test/env/default/tor
linux/Tor
linux/tor.tar.gz
coverage
test/failures

View File

@ -1 +1 @@
2022-09-10-19-30-v1.9.0-6-g397d264
2022-12-12-17-58-v1.10.1-3-g3d0a3a5

View File

@ -1 +1 @@
2022-09-10-19-30-v1.9.0-6-g397d264
2022-12-12-22-59-v1.10.1-3-g3d0a3a5

View File

@ -51,6 +51,8 @@ android {
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
signingConfigs {
@ -93,6 +95,13 @@ dependencies {
implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
implementation "com.android.support.constraint:constraint-layout:2.0.4"
// Test Dependencies
testImplementation 'junit:junit:4.12'
// https://developer.android.com/jetpack/androidx/releases/test/#1.2.0
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// WorkManager
// (Java only)

View File

@ -0,0 +1,12 @@
package im.cwtch.flwtch;
import androidx.test.rule.ActivityTestRule;
import dev.flutter.plugins.integration_test.FlutterTestRunner;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith(FlutterTestRunner.class)
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class, true, false);
}

View File

@ -68,7 +68,7 @@ class MainActivity: FlutterActivity() {
private val PROFILE_EXPORT_REQUEST_CODE = 236
private val REQUEST_DOZE_WHITELISTING_CODE:Int = 9
private var dlToProfile = ""
private var dlToHandle = ""
private var dlToHandle = 0
private var dlToFileKey = ""
private var exportFromPath = ""
@ -128,38 +128,45 @@ class MainActivity: FlutterActivity() {
if (requestCode == FILEPICKER_REQUEST_CODE) {
val filePath = intent!!.getData().toString();
val manifestPath = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(this.dlToFileKey).toString();
Log.d("MainActivity:FILEPICKER_REQUEST_CODE", "DownloadableFileCreated");
handleCwtch(MethodCall("DownloadFile", mapOf(
"ProfileOnion" to this.dlToProfile,
"handle" to this.dlToHandle,
"conversation" to this.dlToHandle.toInt(),
"filepath" to filePath,
"manifestpath" to manifestPath,
"filekey" to this.dlToFileKey
)), ErrorLogResult(""));//placeholder; this Result is never actually invoked
} else if (requestCode == PREVIEW_EXPORT_REQUEST_CODE) {
val targetPath = intent!!.getData().toString()
val sourcePath = Paths.get(this.exportFromPath);
val targetUri = Uri.parse(targetPath);
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
val bytesWritten = Files.copy(sourcePath, os);
Log.d("MainActivity:PREVIEW_EXPORT", "copied " + bytesWritten.toString() + " bytes");
if (bytesWritten != 0L) {
os?.flush();
os?.close();
//Files.delete(sourcePath);
try {
val sourcePath = Paths.get(this.exportFromPath);
val targetUri = intent!!.getData();
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri!!);
val bytesWritten = Files.copy(sourcePath, os);
Log.d("MainActivity:PREVIEW_EXPORT", "copied " + bytesWritten.toString() + " bytes");
if (bytesWritten != 0L) {
os?.flush();
os?.close();
//Files.delete(sourcePath);
}
} catch (e: Exception) {
Log.d("MainActivity:PREVIEW_EXPORT FAILED", e.toString());
}
} else if (requestCode == PROFILE_EXPORT_REQUEST_CODE ) {
val targetPath = intent!!.getData().toString()
val srcFile = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(this.exportFromPath).toString();
Log.i("MainActivity:PREVIEW_EXPORT", "exporting previewed file " + srcFile);
val sourcePath = Paths.get(srcFile);
val targetUri = Uri.parse(targetPath);
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
val bytesWritten = Files.copy(sourcePath, os);
Log.d("MainActivity:PREVIEW_EXPORT", "copied " + bytesWritten.toString() + " bytes");
if (bytesWritten != 0L) {
os?.flush();
os?.close();
//Files.delete(sourcePath);
Log.i("MainActivity:EXPORT_PROFILE", "exporting profile: " + srcFile);
try {
val sourcePath = Paths.get(srcFile);
val targetUri = intent!!.getData();
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri!!);
val bytesWritten = Files.copy(sourcePath, os);
Log.d("MainActivity:EXPORT_PROFILE", "copied " + bytesWritten.toString() + " bytes");
if (bytesWritten != 0L) {
os?.flush();
os?.close();
//Files.delete(sourcePath);
}
} catch (e: Exception) {
Log.d("MainActivity:EXPORT_PROFILE FAILED", e.toString());
}
}
}
@ -222,7 +229,7 @@ class MainActivity: FlutterActivity() {
var method = call.method
// todo change usage patern to match that in FlwtchWorker
// Unsafe for anything using int args, causes access time attempt to cast to string which will fail
val argmap: Map<String, String> = call.arguments as Map<String, String>
val argmap: Map<String, String> = call.arguments as Map<String,String>
// the frontend calls Start every time it fires up, but we don't want to *actually* call Cwtch.Start()
// in case the ForegroundService is still running. in both cases, however, we *do* want to re-register
@ -249,7 +256,7 @@ class MainActivity: FlutterActivity() {
}
"CreateDownloadableFile" -> {
this.dlToProfile = argmap["ProfileOnion"] ?: ""
this.dlToHandle = argmap["handle"] ?: ""
this.dlToHandle = call.argument("conversation")!!
val suggestedName = argmap["filename"] ?: "filename.ext"
this.dlToFileKey = argmap["filekey"] ?: ""
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
@ -280,6 +287,12 @@ class MainActivity: FlutterActivity() {
startActivityForResult(intent, PREVIEW_EXPORT_REQUEST_CODE)
}
"ExportProfile" -> {
val profileOnion: String = call.argument("ProfileOnion") ?: ""
val file: String = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(call.argument("file") ?: "").toString()
Log.i("FlwtchWorker", "constructing exported file " + file);
Cwtch.exportProfile(profileOnion,file)
this.exportFromPath = argmap["file"] ?: ""
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
@ -346,12 +359,21 @@ class MainActivity: FlutterActivity() {
"CreateProfile" -> {
val nick: String = call.argument("nick") ?: ""
val pass: String = call.argument("pass") ?: ""
Cwtch.createProfile(nick, pass)
val autostart: Boolean = call.argument("autostart") ?: true
Cwtch.createProfile(nick, pass, autostart)
}
"LoadProfiles" -> {
val pass: String = call.argument("pass") ?: ""
Cwtch.loadProfiles(pass)
}
"ActivatePeerEngine" -> {
val profile: String = call.argument("profile") ?: ""
Cwtch.activatePeerEngine(profile)
}
"DeactivatePeerEngine" -> {
val profile: String = call.argument("profile") ?: ""
Cwtch.deactivatePeerEngine(profile)
}
"ChangePassword" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val pass: String = call.argument("OldPass") ?: ""
@ -406,6 +428,7 @@ class MainActivity: FlutterActivity() {
}
"DownloadFile" -> {
Log.d("MainActivity.kt", "Cwtch Download File Called...")
val profile: String = call.argument("ProfileOnion") ?: ""
val conversation: Int = call.argument("conversation") ?: 0
val filepath: String = call.argument("filepath") ?: ""
@ -516,12 +539,6 @@ class MainActivity: FlutterActivity() {
val v: String = call.argument("Val") ?: ""
Cwtch.setServerAttribute(serverOnion, key, v)
}
"ExportProfile" -> {
val profileOnion: String = call.argument("ProfileOnion") ?: ""
val file: String = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(call.argument("file") ?: "").toString()
Log.i("FlwtchWorker", "constructing exported file " + file);
Cwtch.exportProfile(profileOnion,file)
}
"ImportProfile" -> {
val file: String = call.argument("file") ?: ""
val pass: String = call.argument("pass") ?: ""
@ -585,6 +602,7 @@ class MainActivity: FlutterActivity() {
}
}
override fun onDestroy() {
super.onDestroy()
Log.i("MainActivity.kt", "onDestroy - cancelling all WORKER_TAG and pruning old work")

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}

View File

@ -1,6 +1,6 @@
#Mon Jun 20 10:33:21 PDT 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

View File

@ -3,6 +3,6 @@
VERSION=`cat LIBCWTCH-GO-MACOS.version`
echo $VERSION
curl https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.x64.dylib --output libCwtch.x64.dylib
curl https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.arm64.dylib --output libCwtch.arm64.dylib
curl --fail https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.x64.dylib --output libCwtch.x64.dylib
curl --fail https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.arm64.dylib --output libCwtch.arm64.dylib

View File

@ -1,6 +1,7 @@
$Env:VERSION = type LIBCWTCH-GO.version
echo $Env:VERSION
# This should automatically fail on error...
Invoke-WebRequest -Uri https://build.openprivacy.ca/files/libCwtch-go-$Env:VERSION/libCwtch.dll -OutFile windows/libCwtch.dll
#Invoke-WebRequest -Uri https://build.openprivacy.ca/files/libCwtch-go-$Env:VERSION/cwtch.aar -OutFile android/cwtch/cwtch.aar

View File

@ -3,5 +3,5 @@
VERSION=`cat LIBCWTCH-GO.version`
echo $VERSION
wget https://build.openprivacy.ca/files/libCwtch-go-$VERSION/cwtch.aar -O android/cwtch/cwtch.aar
wget https://build.openprivacy.ca/files/libCwtch-go-$VERSION/libCwtch.so -O linux/libCwtch.so
curl --fail https://build.openprivacy.ca/files/libCwtch-go-$VERSION/cwtch.aar --output android/cwtch/cwtch.aar
curl --fail https://build.openprivacy.ca/files/libCwtch-go-$VERSION/libCwtch.so --output linux/libCwtch.so

View File

@ -1,53 +0,0 @@
// This is a basic Flutter integration test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:cwtch/main_test.dart' as app;
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
_testMain();
}
void _testMain() {
testWidgets('Blocked message rejection test', (WidgetTester tester) async {
final String testerProfile = "mr roboto";
final String blockedProfile = "rudey";
// start the app and render a few frames
app.main();
await tester.pump(); await tester.pump(); await tester.pump();
//await tester.pumpAndSettle();
for (var i = 0; i < 30; i++) {
print("$i pump");
await tester.pump();
}
// log in to a profile with a blocked contact
await tester.tap(find.text(testerProfile));
await tester.pump(); await tester.pump(); await tester.pump();
expect(find.byIcon(Icons.block), findsOneWidget);
// use the debug control to inject a message from the contact
await tester.tap(find.byIcon(Icons.bug_report));
await tester.pump(); await tester.pump(); await tester.pump();
// screenshot test
print(Directory.current);
//Directory.current = "/home/erinn/AndroidStudioProjects/flwtch/integration_test";
await expectLater(find.byKey(Key('app')), matchesGoldenFile('blockedcontact.png'));
// any active message badges?
expect(find.text('1'), findsNothing);
});
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,411 +0,0 @@
dir-key-certificate-version 3
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
dir-key-published 2021-09-01 00:00:00
dir-key-expires 2022-03-01 00:00:00
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
lyS28jsPht9VAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
S8iAur2GohFFAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
dir-key-published 2021-08-01 20:00:02
dir-key-expires 2022-08-01 20:00:02
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
qTCMStn1jfDDAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
VsB9h7YagNHJHLiGeBT1kg==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
dir-key-published 2021-11-28 16:32:54
dir-key-expires 2022-02-28 16:32:54
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
ThLI/8OzZq4LAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
AZHvl12tKzZF3F9MKPcNyQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
dir-key-published 2021-03-29 03:27:58
dir-key-expires 2022-03-29 03:27:58
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
DNyyzRG8iP61AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
60UQ0hNb6KAP+FZKPz9/dA==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
dir-key-published 2021-09-06 18:42:41
dir-key-expires 2022-09-06 18:42:41
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
JHkjBCD4WTWVAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
C8amqpSD8HqsCK6MvN7V9g==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
dir-key-published 2021-08-21 23:12:45
dir-key-expires 2022-08-21 23:12:45
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
y7Pu7li8WyW9AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
vFWU7GzcNIdDjKBUd+IhTQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
dir-key-published 2021-11-09 19:16:37
dir-key-expires 2023-05-09 19:16:37
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
7LXm/wENwn1/AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
pEW/OauwlDlr3yXEKh05aQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
dir-key-published 2021-09-18 16:07:20
dir-key-expires 2022-09-18 16:07:20
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
dOFYaftOkuGPAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
X4d/mLOAQeYWEalQC812iw==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
-----END SIGNATURE-----
dir-key-certificate-version 3
dir-address 154.35.175.225:80
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
dir-key-published 2021-02-08 18:16:07
dir-key-expires 2022-02-08 18:16:07
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
5RDUlwZaQiaXAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
ungKyPS6LTytSuU/rjWCbQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
-----END SIGNATURE-----

File diff suppressed because one or more lines are too long

View File

@ -1,58 +0,0 @@
# Tor state file last generated on 2022-02-04 13:53:23 local time
# Other times below are in UTC
# You *do not* need to edit this file.
CircuitBuildTimeBin 675 1
CircuitBuildTimeBin 825 1
CircuitBuildTimeBin 875 1
CircuitBuildTimeBin 925 1
CircuitBuildTimeBin 975 1
CircuitBuildTimeBin 1075 1
CircuitBuildTimeBin 1125 2
CircuitBuildTimeBin 1175 1
CircuitBuildTimeBin 1225 9
CircuitBuildTimeBin 1275 21
CircuitBuildTimeBin 1325 7
CircuitBuildTimeBin 1375 6
CircuitBuildTimeBin 1425 9
CircuitBuildTimeBin 1475 2
CircuitBuildTimeBin 1525 6
CircuitBuildTimeBin 1575 4
CircuitBuildTimeBin 1625 4
CircuitBuildTimeBin 1675 13
CircuitBuildTimeBin 1725 3
CircuitBuildTimeBin 1775 1
CircuitBuildTimeBin 1875 1
CircuitBuildTimeBin 1925 1
CircuitBuildTimeBin 1975 3
CircuitBuildTimeBin 2025 1
CircuitBuildTimeBin 2075 2
CircuitBuildTimeBin 2275 1
CircuitBuildTimeBin 2325 1
CircuitBuildTimeBin 2575 1
CircuitBuildTimeBin 2725 1
CircuitBuildTimeBin 2775 2
Dormant 0
Guard in=default rsa_id=BD4C647508162F59CB44E4DFC1C2B2B8A9387CCA nickname=regar42 sampled_on=2022-01-27T11:01:16 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-25T23:44:41 confirmed_idx=2 pb_use_attempts=78.000000 pb_use_successes=78.000000 pb_circ_attempts=102.000000 pb_circ_successes=100.000000 pb_successful_circuits_closed=100.000000 pb_timeouts=1.000000
Guard in=default rsa_id=AADD84AF8D3C24F492D9EC1E08360D1C7CD5730D nickname=axeTorC sampled_on=2022-01-28T04:55:37 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-04T01:41:15 confirmed_idx=0 pb_use_attempts=1.000000 pb_use_successes=1.000000 pb_circ_attempts=1.000000 pb_circ_successes=1.000000 pb_successful_circuits_closed=1.000000
Guard in=default rsa_id=F7B8A4B5F16ECDF6CA626F96F4E3C219D1A664EC nickname=kerneloopsRelay sampled_on=2022-01-26T16:41:28 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-24T18:55:06 confirmed_idx=1
Guard in=default rsa_id=274A1DC6210E91827CDF40DC0E95E4A3CA929A08 nickname=AllanonTor sampled_on=2022-01-26T18:56:19 sampled_idx=3 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=891FB8477529A6B2894B7A3129402E0FD5DD281F nickname=hers sampled_on=2022-01-31T03:58:06 sampled_idx=4 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=898B2FBA56F3707B72A0B97CC492CBB466D9D707 nickname=julianrelay sampled_on=2022-01-30T07:22:54 sampled_idx=5 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=84A9473665250B752B621892834E71EECBD610FF nickname=flyingcubetech sampled_on=2022-01-24T19:47:40 sampled_idx=6 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=7DFC30D7EAAEF6E74B081EC0291757E9414A8C06 nickname=TorRelay1337 sampled_on=2022-01-27T01:43:00 sampled_idx=7 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=A5E42F1A3AFA948A7F2FDB1954A4CF6C6489D418 nickname=bauruine sampled_on=2022-01-31T11:16:43 sampled_idx=8 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=F9AEA07ACE06E8E7D55E10FFBAE037E8C833FA93 nickname=DTFNODE46 sampled_on=2022-01-24T22:18:09 sampled_idx=9 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=3910C5CA0CC5AFE22C709DF471A2B5B6B4AEDC98 nickname=criticalcat sampled_on=2022-01-25T22:53:24 sampled_idx=10 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=FD449127D30D8F5D124653D9EF736EDF4A12B4DC nickname=lw sampled_on=2022-02-01T00:36:22 sampled_idx=11 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=0E2EEC125A6AC8D5EBF5DB36B776A3DA5510E7A0 nickname=Nako sampled_on=2022-02-04T00:40:19 sampled_idx=12 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=2C7C9294CFA7AAFB3D25B72DEAED242E96927F03 nickname=ChomelesDEnetcup sampled_on=2022-01-30T05:51:02 sampled_idx=13 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=916DC3199F639168CD20AEC4D45969268E807699 nickname=defcon777 sampled_on=2022-01-27T11:01:04 sampled_idx=14 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=A6C3B64EC8EE20D77987EBC5E894CA6CCE4B5295 nickname=OwlRelay sampled_on=2022-01-30T19:20:11 sampled_idx=15 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=6FB33CCBEF5135AFA3D6D33CE030F96728EDD70C nickname=MDMIT1 sampled_on=2022-01-31T16:49:37 sampled_idx=16 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=85703987A509438D96E22AD367E99FF295E089AF nickname=gbtUSicebeer09b sampled_on=2022-02-03T22:13:49 sampled_idx=17 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=BA053C72E476C1EB9D05237D0D6A289C18FBE8E7 nickname=straDEicebeer02b sampled_on=2022-01-24T08:18:24 sampled_idx=18 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=225A8EA367DF3073433E0A845DDDA26D2357E4C6 nickname=Manureva sampled_on=2022-01-29T21:39:31 sampled_idx=19 sampled_by=0.4.5.9 listed=1
LastWritten 2022-02-04 21:53:23
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
TotalBuildTimes 108

View File

@ -1,3 +0,0 @@
SocksPort 9667 OnionTrafficOnly
ControlPort 9668
HashedControlPassword 16:501107AD0642A3C66029D6A37845E976D5F55B4DED7C4A43CC044638A5

View File

@ -1,411 +0,0 @@
dir-key-certificate-version 3
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
dir-key-published 2021-11-09 19:16:37
dir-key-expires 2023-05-09 19:16:37
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
7LXm/wENwn1/AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
pEW/OauwlDlr3yXEKh05aQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
-----END SIGNATURE-----
dir-key-certificate-version 3
dir-address 154.35.175.225:80
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
dir-key-published 2021-02-08 18:16:07
dir-key-expires 2022-02-08 18:16:07
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
5RDUlwZaQiaXAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
ungKyPS6LTytSuU/rjWCbQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
dir-key-published 2021-11-28 16:32:54
dir-key-expires 2022-02-28 16:32:54
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
ThLI/8OzZq4LAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
AZHvl12tKzZF3F9MKPcNyQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
dir-key-published 2021-09-06 18:42:41
dir-key-expires 2022-09-06 18:42:41
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
JHkjBCD4WTWVAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
C8amqpSD8HqsCK6MvN7V9g==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
dir-key-published 2021-03-29 03:27:58
dir-key-expires 2022-03-29 03:27:58
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
DNyyzRG8iP61AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
60UQ0hNb6KAP+FZKPz9/dA==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
dir-key-published 2021-09-01 00:00:00
dir-key-expires 2022-03-01 00:00:00
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
lyS28jsPht9VAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
S8iAur2GohFFAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
dir-key-published 2021-08-21 23:12:45
dir-key-expires 2022-08-21 23:12:45
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
y7Pu7li8WyW9AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
vFWU7GzcNIdDjKBUd+IhTQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
dir-key-published 2021-08-01 20:00:02
dir-key-expires 2022-08-01 20:00:02
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
qTCMStn1jfDDAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
VsB9h7YagNHJHLiGeBT1kg==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
dir-key-published 2021-09-18 16:07:20
dir-key-expires 2022-09-18 16:07:20
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
dOFYaftOkuGPAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
X4d/mLOAQeYWEalQC812iw==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
-----END SIGNATURE-----

File diff suppressed because one or more lines are too long

View File

@ -1,39 +0,0 @@
# Tor state file last generated on 2022-02-04 13:57:02 local time
# Other times below are in UTC
# You *do not* need to edit this file.
CircuitBuildTimeBin 875 1
CircuitBuildTimeBin 1025 1
CircuitBuildTimeBin 1125 1
CircuitBuildTimeBin 1175 1
CircuitBuildTimeBin 1275 1
CircuitBuildTimeBin 1475 1
CircuitBuildTimeBin 1875 1
CircuitBuildTimeBin 1925 1
CircuitBuildTimeBin 2025 1
CircuitBuildTimeBin 2375 1
Dormant 0
Guard in=default rsa_id=D70A5E01EC14D078164D5E587608949F85FD771B nickname=leaders2 sampled_on=2022-01-30T18:34:14 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-02T06:04:33 confirmed_idx=1 pb_circ_attempts=13.000000 pb_circ_successes=10.000000 pb_successful_circuits_closed=10.000000 pb_timeouts=1.000000
Guard in=default rsa_id=598C8E4E92D8D7750991D23F6776EE92EC1A00C1 nickname=Unnamed sampled_on=2022-02-01T01:24:07 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-29T15:09:32 confirmed_idx=2
Guard in=default rsa_id=013ABAED8F4CDB677BE0B5212E4B2583B86035EE nickname=b0rken sampled_on=2022-01-27T22:32:07 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-03T10:23:27 confirmed_idx=0
Guard in=default rsa_id=66DFC51E724E38DDCB3AB67DDF4C0BB0F1F49C0B nickname=Seccom04 sampled_on=2022-01-26T06:52:32 sampled_idx=3 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=9400AF52EC2929DA41E6DDD3B684F23643BC316C nickname=BM03 sampled_on=2022-01-30T16:35:42 sampled_idx=4 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=DD0C8EEC5CA402A9FA4478F10C31A440F71F6885 nickname=chaosDelroth sampled_on=2022-01-31T18:30:35 sampled_idx=5 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=6055FE90C18DD4B2593A9D0E02DDC4D68E9BA62E nickname=elects2 sampled_on=2022-01-29T10:24:36 sampled_idx=6 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=79233E8202A0EE755B39BC24BE80939C023B3FCD nickname=m83fr2 sampled_on=2022-02-01T17:58:48 sampled_idx=7 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=C4BDBFD1049EE1D4F6977C42485F94CD5F97BA92 nickname=lenin sampled_on=2022-01-29T15:57:51 sampled_idx=8 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=876C5AC1D2811E650AD4C78B77841C1ACB3B0088 nickname=whoUSicebeer05b sampled_on=2022-01-29T15:26:49 sampled_idx=9 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=FF8B7CAD5F508972509D79F933FB24D2F524AB75 nickname=einNettesRelay sampled_on=2022-02-02T09:24:01 sampled_idx=10 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=BFB14B9ADF1F19E59258CAE7FCDBAAC9937B7B10 nickname=Yggdrasil sampled_on=2022-02-02T13:42:48 sampled_idx=11 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=ACBD72F9395DE8DE293D37CCF7733F1BE23EDA53 nickname=hopUSicebeer7b sampled_on=2022-02-02T18:42:20 sampled_idx=12 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=F79370BA46ADC03CC10866924EE4A3C470BAFE93 nickname=skankhunt42de4 sampled_on=2022-01-25T11:00:17 sampled_idx=13 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=C1939D36649DE98A202429631D8EFC70128D5F5F nickname=rinderwahnRelay10L sampled_on=2022-01-26T01:10:26 sampled_idx=14 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=3BC258C20BBB8094C12DA7CB982B36D1502FAC3C nickname=Assange041us sampled_on=2022-01-31T23:57:37 sampled_idx=15 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=B2242163F681F77F93190663AC5F696ACF76C4FD nickname=torexit42 sampled_on=2022-02-03T12:50:47 sampled_idx=16 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=1F953ACBFB9F44CE38543B7E9C0E0BE1BDC7E941 nickname=bauruine sampled_on=2022-01-24T00:30:24 sampled_idx=17 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=F00C8B7589FEE52BE84387CDB422C1F1386979C0 nickname=JennyRelay sampled_on=2022-01-30T03:59:39 sampled_idx=18 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=CD39C258265B25EAA4ABA4FDCB2DF98104CAA362 nickname=normaray sampled_on=2022-01-30T09:12:11 sampled_idx=19 sampled_by=0.4.5.9 listed=1
LastWritten 2022-02-04 21:57:02
MinutesSinceUserActivity 3
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
TotalBuildTimes 10

View File

@ -1,3 +0,0 @@
SocksPort 9735 OnionTrafficOnly
ControlPort 9736
HashedControlPassword 16:178423CBFA6B25BD608424EE12A1FACF5D36FF43215636A5917F8D64DF

View File

@ -1,411 +0,0 @@
dir-key-certificate-version 3
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
dir-key-published 2021-09-01 00:00:00
dir-key-expires 2022-03-01 00:00:00
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
lyS28jsPht9VAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
S8iAur2GohFFAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
dir-key-published 2021-09-06 18:42:41
dir-key-expires 2022-09-06 18:42:41
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
JHkjBCD4WTWVAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
C8amqpSD8HqsCK6MvN7V9g==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
dir-key-published 2021-11-28 16:32:54
dir-key-expires 2022-02-28 16:32:54
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
ThLI/8OzZq4LAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
AZHvl12tKzZF3F9MKPcNyQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
dir-key-published 2021-08-21 23:12:45
dir-key-expires 2022-08-21 23:12:45
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
y7Pu7li8WyW9AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
vFWU7GzcNIdDjKBUd+IhTQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
dir-key-published 2021-03-29 03:27:58
dir-key-expires 2022-03-29 03:27:58
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
DNyyzRG8iP61AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
60UQ0hNb6KAP+FZKPz9/dA==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
dir-key-published 2021-09-18 16:07:20
dir-key-expires 2022-09-18 16:07:20
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
dOFYaftOkuGPAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
X4d/mLOAQeYWEalQC812iw==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
-----END SIGNATURE-----
dir-key-certificate-version 3
dir-address 154.35.175.225:80
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
dir-key-published 2021-02-08 18:16:07
dir-key-expires 2022-02-08 18:16:07
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
5RDUlwZaQiaXAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
ungKyPS6LTytSuU/rjWCbQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
dir-key-published 2021-08-01 20:00:02
dir-key-expires 2022-08-01 20:00:02
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
qTCMStn1jfDDAgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
VsB9h7YagNHJHLiGeBT1kg==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
-----END SIGNATURE-----
dir-key-certificate-version 3
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
dir-key-published 2021-11-09 19:16:37
dir-key-expires 2023-05-09 19:16:37
dir-identity-key
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
7LXm/wENwn1/AgMBAAE=
-----END RSA PUBLIC KEY-----
dir-signing-key
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
-----END RSA PUBLIC KEY-----
dir-key-crosscert
-----BEGIN ID SIGNATURE-----
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
pEW/OauwlDlr3yXEKh05aQ==
-----END ID SIGNATURE-----
dir-key-certification
-----BEGIN SIGNATURE-----
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
-----END SIGNATURE-----

File diff suppressed because one or more lines are too long

View File

@ -1,35 +0,0 @@
# Tor state file last generated on 2022-02-04 13:58:29 local time
# Other times below are in UTC
# You *do not* need to edit this file.
CircuitBuildTimeBin 1075 1
CircuitBuildTimeBin 1175 1
CircuitBuildTimeBin 1325 1
CircuitBuildTimeBin 1675 1
CircuitBuildTimeBin 2125 2
CircuitBuildTimeBin 2175 1
Dormant 0
Guard in=default rsa_id=73283C4DEBC01D3E4A5FD1BB1F2B50D927379F59 nickname=rinderwahnRelay29L sampled_on=2022-01-31T13:54:49 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-26T00:18:13 confirmed_idx=2 pb_circ_attempts=7.000000 pb_circ_successes=7.000000 pb_successful_circuits_closed=7.000000
Guard in=default rsa_id=955F15325D6F3E3350EA8A70EB5C49C5BF95C5A0 nickname=XTOMDUS sampled_on=2022-01-31T07:54:08 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-01T08:12:17 confirmed_idx=1
Guard in=default rsa_id=82DA9678A0BAE60087AA68A3E1D6E6A2C4246D6D nickname=Ichotolot63 sampled_on=2022-02-03T05:29:22 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-02T08:46:50 confirmed_idx=0
Guard in=default rsa_id=77A3ADC5D455778B53C2803761916DFB7DA0A790 nickname=redvader sampled_on=2022-02-02T15:23:39 sampled_idx=3 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=2096BCFEBB95A1134F39FCF8CEB076FF41A2B48B nickname=freja sampled_on=2022-02-03T19:51:55 sampled_idx=4 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=AE4FAE2EB5DC5D078458F0FCBF2B37F5D73F0868 nickname=sinkrlogin sampled_on=2022-01-24T19:30:40 sampled_idx=5 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=680F212ADE23311C658CC560DAF80DB42FEB85DF nickname=a9 sampled_on=2022-01-28T12:54:55 sampled_idx=6 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=3D5D6178C44537E3692853B344385F6572A55767 nickname=TorZabehlice sampled_on=2022-01-31T02:57:52 sampled_idx=7 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=CEDB8AB22915097A3A14F63F28E1E43F86CBECC0 nickname=knight sampled_on=2022-01-26T09:02:31 sampled_idx=8 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=0B555940D37DC849728841C0B290074E1A1BDCA8 nickname=TORro sampled_on=2022-01-26T04:11:45 sampled_idx=9 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=2A6D9EAE2FB319486C5E3BF5CC0F83F06B73CE0F nickname=clicker1 sampled_on=2022-01-28T16:27:29 sampled_idx=10 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=7B3535760987464C8B5686F203B6EBE767C0873E nickname=Hydra69 sampled_on=2022-01-25T23:46:36 sampled_idx=11 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=0F0F690AF1D32C7C3C72C543836625628887BA85 nickname=Hydra57 sampled_on=2022-01-24T15:26:39 sampled_idx=12 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=AC2275831607A95CD8B939C3B8DC466CCF48E2B9 nickname=notsorelay sampled_on=2022-01-25T04:52:58 sampled_idx=13 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=38F732DD349A2E59078434651162A2F4201934A5 nickname=mixminion sampled_on=2022-01-25T18:16:12 sampled_idx=14 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=2F844B6701E6C614240214489A99DF607F43C5B0 nickname=3totalrecovery3 sampled_on=2022-01-31T01:50:15 sampled_idx=15 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=EBE718E1A49EE229071702964F8DB1F318075FF8 nickname=fluxe4 sampled_on=2022-01-24T07:17:01 sampled_idx=16 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=8118F4C0E60C84A453ACCD1641F3A7328CBE6280 nickname=wilfong sampled_on=2022-02-01T10:05:37 sampled_idx=17 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=2AA5F598F9A1812F01CD99E3B59BB87362ED7438 nickname=setsun sampled_on=2022-02-01T12:40:07 sampled_idx=18 sampled_by=0.4.5.9 listed=1
Guard in=default rsa_id=CF6A6080091BB210AA3892FEFE2F6A396DA08DF3 nickname=cryzrelay01 sampled_on=2022-02-01T11:05:41 sampled_idx=19 sampled_by=0.4.5.9 listed=1
LastWritten 2022-02-04 21:58:29
MinutesSinceUserActivity 1
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
TotalBuildTimes 7

View File

@ -1,3 +0,0 @@
SocksPort 9982 OnionTrafficOnly
ControlPort 9983
HashedControlPassword 16:D95A03E7895DC6A2605B7AF7E28AB1E24D813742A0E86A2818C7179CE6

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,11 +1,9 @@
@env:clean
Feature: Splash screen displays and then closes
Scenario: splash screen appears
Then I expect the widget 'SplashView' to be present within 1 second
Scenario: splash screen completes
Then I expect the widget 'SplashView' to be present within 10 seconds
Then I expect the widget 'ProfileManagerView' to be present within 10 seconds
Scenario: first-run of cwtch creates expected files and folders
Given I expect the widget 'ProfileManagerView' to be present within 10 seconds
# first-run of cwtch creates expected files and folders
Then I expect the folder 'integration_test/env/temp' to exist
And I expect the folder 'integration_test/env/temp/dev' to exist
And I expect the file 'integration_test/env/temp/dev/SALT' to exist

View File

@ -1,26 +1,26 @@
@env:persist
Feature: Settings pane opens and can save settings persistently
Scenario: Open the Settings pane
Given I tap the 'OpenSettingsView' button
Then I expect the text 'Cwtch Settings' to be present
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the 'OpenSettingsView' button
And I wait until the text 'Cwtch Settings' is present
And I take a screenshot
Scenario: Change every setting (except Language)
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait for 1 second
And I wait until the text 'Use Light Themes' is present
When I tap the widget that contains the text "Use Light Themes"
#And I choose option 3 from the "DropdownTheme" dropdown
#When I tap the "DropdownTheme" button
#And I tap the first "ddi_mermaid" element
#And I tap the element that contains the text "Mermaid"
#And I tap the element that contains the text "Mermaid" within the "DropdownTheme"
And I tap the widget that contains the text "Block Unknown Contacts"
And I tap the widget that contains the text "Streamer/Presentation Mode"
And I tap the widget that contains the text "Enable Experiments"
Then I wait until the text 'Enable Group Chat' is present
And I tap the widget that contains the text "Enable Group Chat"
And I tap the widget that contains the text "Hosting Servers"
And I tap the widget that contains the text "File Sharing"
Then I wait until the text 'Image Previews and Profile Pictures' is present
And I tap the widget that contains the text "Image Previews and Profile Pictures"
And I wait until the text 'Download Folder' is present
And I fill the "DownloadFolderPicker" field with "/this/is/a/test"
And I tap the widget that contains the text "Enable Clickable Links"
Then I expect the switch that contains the text "Use Light Themes" to be checked
@ -35,8 +35,9 @@ Feature: Settings pane opens and can save settings persistently
And I expect the switch that contains the text "Enable Clickable Links" to be checked
Scenario: When the app is reloaded, settings from the previous scenario have persisted
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait for 1 second
And I wait until the text 'Use Light Themes' is present
Then I expect the switch that contains the text "Use Light Themes" to be checked
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked

View File

@ -1,11 +1,14 @@
Feature: Tor initializes correctly
Scenario: Check the Tor version
Given I tap the icon with type "TorIcon"
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the icon with type "TorIcon"
Then I expect the Tor version to be present
And I expect the string 'Online' to be present within 60 seconds
Scenario: Reset Tor
Given I tap the icon with type "TorIcon"
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the icon with type "TorIcon"
Then I expect the string 'Online' to be present within 60 seconds
Then I tap the button with text "Reset"
Then I tap the button that contains the text "Reset"
And I wait for 1 second
Then I expect the text "Online" to be absent

View File

@ -1,6 +1,7 @@
Feature: Shutdown Cwtch button works correctly
Scenario: Clicking 'Shutdown Cwtch' shuts down Cwtch
Given I tap the button with tooltip 'Shutdown Cwtch'
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the button with tooltip 'Shutdown Cwtch'
Then I expect the text 'Shutdown Cwtch?' to be present
#this also kills the testing framework sadly. will have to find a workaround
#And I tap the button that contains the text 'Shutdown Cwtch'

View File

@ -1,14 +1,16 @@
Feature: Global 'language' setting
Scenario: Change the language to French and back
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait for 1 second
And I wait until the text 'Language' is present
Then I expect the text 'Language' to be present
And I expect the text 'Langue' to be absent
When I tap the widget that contains the text "English"
And I tap the widget that contains the text "Frances"
Then I expect the text 'Langue' to be present
And I wait until the text 'French' is present
And I tap the widget that contains the text "French"
And I wait until the text 'Langue' is present
And I expect the text 'Language' to be absent
When I tap the widget that contains the text "Français"
And I tap the widget that contains the text "Anglais"
Then I expect the text 'Language' to be present
And I wait until the text 'Language' is present
And I expect the text 'Langue' to be absent

View File

@ -1,10 +1,12 @@
Feature: Global 'Theme' setting
Scenario: Change the theme to Mermaid
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait for 1 second
When I tap the "DropdownTheme" button
And I tap the element that contains the text "Mermaid"
Scenario: Change the theme to Light Mode
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait for 1 second
And I tap the widget that contains the text "Theme"

View File

@ -9,6 +9,7 @@ import 'dart:io';
import 'package:cwtch/main.dart' as app;
import 'package:glob/glob.dart';
import 'gherkin_suite_test.dart';
import 'hooks/env.dart';
import 'steps/chat.dart';
import 'steps/files.dart';
@ -18,10 +19,11 @@ import 'steps/text.dart';
import 'steps/utils.dart';
part 'gherkin_suite_test.g.dart';
const REPLACED_BY_SCRIPT = <String>['integration_test/features/**.feature'];
@GherkinTestSuite(executionOrder: ExecutionOrder.alphabetical, featurePaths: REPLACED_BY_SCRIPT)
void main() {
void main() async {
final params = [
SwitchStateParameter(),
];
@ -56,45 +58,50 @@ void main() {
];
var sb = StringBuffer();
sb..writeln("## Custom Parameters\n")
..writeln("| name | pattern |")
..writeln("| --- | --- |");
sb
..writeln("## Custom Parameters\n")
..writeln("| name | pattern |")
..writeln("| --- | --- |");
for (var i in params) {
sb..write("| ")..write(i.identifier)..write(" | ")..write(i.pattern.toString().replaceFirst("RegExp: pattern=","").replaceFirst(" flags=i","").replaceAll("|", "&#124;"))..writeln(" |");
sb
..write("| ")
..write(i.identifier)
..write(" | ")
..write(i.pattern.toString().replaceFirst("RegExp: pattern=", "").replaceFirst(" flags=i", "").replaceAll("|", "&#124;"))
..writeln(" |");
}
sb..writeln("\n## Custom steps\n")
..writeln("| pattern |")
..writeln("| --- |");
sb
..writeln("\n## Custom steps\n")
..writeln("| pattern |")
..writeln("| --- |");
for (var i in steps) {
sb.writeln(i.pattern.toString().replaceFirst("RegExp: pattern=", "| ").replaceFirst(" flags=", " |").replaceAll("|", "&#124;"));
}
var f = File("integration_test/CustomSteps.md");
f.writeAsString(sb.toString());
executeTestSuite(
FlutterTestConfiguration.DEFAULT([])
..reporters = [
StdoutReporter(MessageLevel.error)
..setWriteLineFn(print)
..setWriteFn(print),
ProgressReporter()
..setWriteLineFn(print)
..setWriteFn(print),
TestRunSummaryReporter()
..setWriteLineFn(print)
..setWriteFn(print),
JsonReporter(
writeReport: (_, __) => Future<void>.value(),
),
]
..customStepParameterDefinitions = [
SwitchStateParameter(),
]
..stepDefinitions = steps
..hooks = [
ResetCwtchEnvironment(),
AttachScreenshotOnFailedStepHook(),
],
(World world) => app.main(),
await executeTestSuite(
configuration: FlutterTestConfiguration(
reporters: [
StdoutReporter(MessageLevel.verbose)
..setWriteLineFn(print)
..setWriteFn(print),
ProgressReporter()
..setWriteLineFn(print)
..setWriteFn(print),
TestRunSummaryReporter()
..setWriteLineFn(print)
..setWriteFn(print),
JsonReporter(),
],
customStepParameterDefinitions: [
SwitchStateParameter(),
],
stepDefinitions: steps,
hooks: [
ResetCwtchEnvironment(),
AttachScreenshotOnFailedStepHook(),
]),
appMainFunction: (World world) => app.main(),
);
}
}

View File

@ -10,6 +10,7 @@ class ResetCwtchEnvironment extends Hook {
Future<void> onBeforeRun(TestConfiguration config) async {
// initialize @env:persist
await Process.run("rm", ["-rf", "integration_test/env/temp-persist"]);
await Process.run("rm", ["-rf", "integration_test/env/temp"]);
await Process.run("cp", ["-R", "integration_test/env/persist", "integration_test/env/temp-persist"]);
return super.onBeforeRun(config);
@ -17,7 +18,10 @@ class ResetCwtchEnvironment extends Hook {
@override
Future<void> onAfterRun(TestConfiguration config) async {
// Clean up After a Test Run...
print("clean up environments after run...");
await Process.run("rm", ["-rf", "integration_test/env/temp-persist"]);
await Process.run("rm", ["-rf", "integration_test/env/temp"]);
return super.onAfterRun(config);
}
@ -31,18 +35,16 @@ class ResetCwtchEnvironment extends Hook {
// use the default environment if no @env: tag specified
await Process.run("cp", ["-R", "integration_test/env/default", "integration_test/env/temp"]);
} else {
print("no environment initialized");
print("clean environment initialized");
}
return super.onBeforeScenario(config, scenario, tags);
}
@override
Future<void> onAfterScenario(TestConfiguration config, String scenario, Iterable<Tag> tags) async {
Future<void> onAfterScenario(TestConfiguration config, String scenario, Iterable<Tag> tags, {bool passed = true}) async {
if (tags.any((t) => t.name == "@env:persist")) {
await Process.run("mv", ["integration_test/env/temp", "integration_test/env/temp-persist"]);
} else {
await Process.run("rm", ["-rf", "integration_test/env/temp"]);
}
return super.onAfterScenario(config, scenario, tags);
}
}
}

View File

@ -15,28 +15,20 @@ import 'overrides.dart';
StepDefinitionGeneric ExpectReply() {
return given3<String, String, int, FlutterWorld>(
RegExp(
r'I expect to see the message {string} replying to {string} within {int} second(s)$'),
(originalMessage, responseMessage, seconds, context) async {
RegExp(r'I expect to see the message {string} replying to {string} within {int} second(s)$'),
(originalMessage, responseMessage, seconds, context) async {
await context.world.appDriver.waitUntil(
() async {
() async {
await context.world.appDriver.waitForAppToSettle();
return await context.world.appDriver.isPresent(
context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(QuotedMessageBubble, FindType.type),
context.world.appDriver.findBy(originalMessage, FindType.text)
)
) && await context.world.appDriver.isPresent(
context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(QuotedMessageBubble, FindType.type),
context.world.appDriver.findBy(responseMessage, FindType.text)
));
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(QuotedMessageBubble, FindType.type), context.world.appDriver.findBy(originalMessage, FindType.text))) &&
await context.world.appDriver.isPresent(
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(QuotedMessageBubble, FindType.type), context.world.appDriver.findBy(responseMessage, FindType.text)));
},
timeout: Duration(seconds: seconds),
);
},
configuration: StepDefinitionConfiguration()
..timeout = const Duration(days: 1),
configuration: StepDefinitionConfiguration()..timeout = const Duration(days: 1),
);
}
}

View File

@ -4,9 +4,8 @@ import 'package:gherkin/gherkin.dart';
StepDefinitionGeneric FolderExists() {
return then1<String, FlutterWorld>(
RegExp(
r'I expect the folder {string} to exist'),
(input1, context) async {
RegExp(r'I expect the folder {string} to exist'),
(input1, context) async {
context.expect(Directory(input1).existsSync(), true);
},
);
@ -14,10 +13,9 @@ StepDefinitionGeneric FolderExists() {
StepDefinitionGeneric FileExists() {
return then1<String, FlutterWorld>(
RegExp(
r'I expect the file {string} to exist'),
(input1, context) async {
RegExp(r'I expect the file {string} to exist'),
(input1, context) async {
context.expect(File(input1).existsSync(), true);
},
);
}
}

View File

@ -11,16 +11,16 @@ enum SwitchState { checked, unchecked }
class SwitchStateParameter extends CustomParameter<SwitchState> {
SwitchStateParameter()
: super("toggle", RegExp(r"(checked|unchecked)", caseSensitive: false), (s) {
switch (s.toLowerCase()) {
case "checked":
return SwitchState.checked;
case "unchecked":
return SwitchState.unchecked;
}
});
switch (s.toLowerCase()) {
case "checked":
return SwitchState.checked;
case "unchecked":
return SwitchState.unchecked;
}
});
}
class CheckSwitchState extends Given2WithWorld<String,SwitchState,FlutterWorld> {
class CheckSwitchState extends Given2WithWorld<String, SwitchState, FlutterWorld> {
@override
Future<void> executeStep(String input1, SwitchState state) async {
final switch1 = world.appDriver.findBy(input1, FindType.key);
@ -38,9 +38,8 @@ class CheckSwitchState extends Given2WithWorld<String,SwitchState,FlutterWorld>
StepDefinitionGeneric CheckSwitchStateWithText() {
return then2<String, SwitchState, FlutterWorld>(
RegExp(
r'I expect the switch that contains the text {string} to be {toggle}'),
(input1, state, context) async {
RegExp(r'I expect the switch that contains the text {string} to be {toggle}'),
(input1, state, context) async {
final textFinder = context.world.appDriver.findBy(input1, FindType.text);
await context.world.appDriver.scrollIntoView(textFinder);
final switchTypeFinder = context.world.appDriver.findBy(SwitchListTile, FindType.type);
@ -53,9 +52,8 @@ StepDefinitionGeneric CheckSwitchStateWithText() {
StepDefinitionGeneric DropdownChoose() {
return then2<int, String, FlutterWorld>(
RegExp(
r'I choose option {int} from the {string} dropdown'),
(idx, input1, context) async {
RegExp(r'I choose option {int} from the {string} dropdown'),
(idx, input1, context) async {
await context.world.appDriver.waitForAppToSettle();
final ddFinder = context.world.appDriver.findBy(input1, FindType.key);
await context.world.appDriver.scrollIntoView(ddFinder);
@ -78,4 +76,3 @@ StepDefinitionGeneric DropdownChoose() {
},
);
}

View File

@ -30,11 +30,9 @@ StepDefinitionGeneric TapWidgetWithType() {
StepDefinitionGeneric TapWidgetWithLabel() {
return given2<String, String, FlutterWorld>(
RegExp(r'I tap the {string} widget with label {string}$'),
(ofType, text, context) async {
final finder = context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
context.world.appDriver.findBy(text, FindType.text),
firstMatchOnly: true);
(ofType, text, context) async {
final finder =
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type), context.world.appDriver.findBy(text, FindType.text), firstMatchOnly: true);
//Text wdg = await context.world.appDriver.widget(finder, ExpectedWidgetResultType.first);
//print(wdg.debugDescribeChildren().first.)
await context.world.appDriver.scrollIntoView(finder);
@ -47,11 +45,9 @@ StepDefinitionGeneric TapWidgetWithLabel() {
StepDefinitionGeneric TapWidgetWithTooltip() {
return given2<String, String, FlutterWorld>(
RegExp(r'I tap the {string} widget with tooltip {string}$'),
(ofType, text, context) async {
final finder = context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
context.world.appDriver.findBy(text, FindType.tooltip),
firstMatchOnly: true);
(ofType, text, context) async {
final finder = context.world.appDriver
.findByDescendant(context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type), context.world.appDriver.findBy(text, FindType.tooltip), firstMatchOnly: true);
await context.world.appDriver.scrollIntoView(finder);
await context.world.appDriver.tap(finder);
await context.world.appDriver.waitForAppToSettle();
@ -62,11 +58,9 @@ StepDefinitionGeneric TapWidgetWithTooltip() {
StepDefinitionGeneric ExpectWidgetWithText() {
return given2<String, String, FlutterWorld>(
RegExp(r'I expect a {string} widget with text {string}$'),
(ofType, text, context) async {
final finder = context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
context.world.appDriver.findBy(text, FindType.text),
firstMatchOnly: true);
(ofType, text, context) async {
final finder =
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type), context.world.appDriver.findBy(text, FindType.text), firstMatchOnly: true);
//Text wdg = await context.world.appDriver.widget(finder, ExpectedWidgetResultType.first);
//print(wdg.debugDescribeChildren().first.)
await context.world.appDriver.isPresent(finder);
@ -78,11 +72,9 @@ StepDefinitionGeneric ExpectWidgetWithText() {
StepDefinitionGeneric AbsentWidgetWithText() {
return given2<String, String, FlutterWorld>(
RegExp(r'I expect a {string} widget with text {string} to be absent$'),
(ofType, text, context) async {
final finder = context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
context.world.appDriver.findBy(text, FindType.text),
firstMatchOnly: true);
(ofType, text, context) async {
final finder =
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type), context.world.appDriver.findBy(text, FindType.text), firstMatchOnly: true);
//Text wdg = await context.world.appDriver.widget(finder, ExpectedWidgetResultType.first);
//print(wdg.debugDescribeChildren().first.)
await context.world.appDriver.isAbsent(finder);
@ -91,15 +83,11 @@ StepDefinitionGeneric AbsentWidgetWithText() {
);
}
StepDefinitionGeneric TapButtonWithText() {
return given1<String, FlutterWorld>(
RegExp(r'I tap the {string} (?:button|element|label|icon|field|text|widget)$'),
(input1, context) async {
final finder = context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(Flwtch, FindType.type),
context.world.appDriver.findBy(input1, FindType.key),
firstMatchOnly: true);
(input1, context) async {
final finder = context.world.appDriver.findByDescendant(context.world.appDriver.findBy(Flwtch, FindType.type), context.world.appDriver.findBy(input1, FindType.key), firstMatchOnly: true);
await context.world.appDriver.scrollIntoView(finder);
await context.world.appDriver.tap(finder);
await context.world.appDriver.waitForAppToSettle();
@ -110,18 +98,18 @@ StepDefinitionGeneric TapButtonWithText() {
StepDefinitionGeneric WaitUntilTypeExists() {
return then2<String, Existence, FlutterWorld>(
'I wait until the (?:button|element|label|icon|field|text|widget) with type {string} is {existence}',
(ofType, existence, context) async {
(ofType, existence, context) async {
await context.world.appDriver.waitUntil(
() async {
() async {
await context.world.appDriver.waitForAppToSettle();
return existence == Existence.absent
? context.world.appDriver.isAbsent(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
)
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
)
: context.world.appDriver.isPresent(
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
);
context.world.appDriver.findBy(widgetTypeByName(ofType), FindType.type),
);
},
);
},
@ -130,11 +118,10 @@ StepDefinitionGeneric WaitUntilTypeExists() {
StepDefinitionGeneric ExpectTextToBePresent() {
return given2<String, int, FlutterWorld>(
RegExp(
r'I expect the string {string} to be present within {int} second(s)$'),
(key, seconds, context) async {
RegExp(r'I expect the string {string} to be present within {int} second(s)$'),
(key, seconds, context) async {
await context.world.appDriver.waitUntil(
() async {
() async {
await context.world.appDriver.waitForAppToSettle();
return context.world.appDriver.isPresent(
@ -144,94 +131,85 @@ StepDefinitionGeneric ExpectTextToBePresent() {
timeout: Duration(seconds: seconds),
);
},
configuration: StepDefinitionConfiguration()
..timeout = const Duration(days: 1),
configuration: StepDefinitionConfiguration()..timeout = const Duration(days: 1),
);
}
StepDefinitionGeneric ExpectWidgetWithTextWithin() {
return given3<String, String, int, FlutterWorld>(
RegExp(
r'I expect a {string} widget with text {string} to be present within {int} second(s)$'),
(widgetType, text, seconds, context) async {
await context.world.appDriver.waitUntil(
() async {
RegExp(r'I expect a {string} widget with text {string} to be present within {int} second(s)$'),
(widgetType, text, seconds, context) async {
await () async {
var result = false;
while (!result) {
await context.world.appDriver.waitForAppToSettle();
return context.world.appDriver.isPresent(
context.world.appDriver.findByDescendant(
context.world.appDriver.findBy(widgetTypeByName(widgetType), FindType.type),
context.world.appDriver.findBy(text, FindType.text)
),
result = await context.world.appDriver.isPresent(
context.world.appDriver.findByDescendant(context.world.appDriver.findBy(widgetTypeByName(widgetType), FindType.type), context.world.appDriver.findBy(text, FindType.text)),
);
},
timeout: Duration(seconds: seconds),
);
}
}()
.timeout(Duration(seconds: 120));
},
configuration: StepDefinitionConfiguration()
..timeout = const Duration(days: 1),
configuration: StepDefinitionConfiguration()..timeout = const Duration(days: 1),
);
}
StepDefinitionGeneric WaitUntilTextExists() {
return then2<String, Existence, FlutterWorld>(
'I wait until the text {string} is {existence}',
(text, existence, context) async {
await context.world.appDriver.waitUntil(
() async {
(text, existence, context) async {
await () async {
var result = false;
while (!result) {
await context.world.appDriver.waitForAppToSettle();
return existence == Existence.absent
result = await (existence == Existence.absent
? context.world.appDriver.isAbsent(
context.world.appDriver.findBy(text, FindType.text),
)
context.world.appDriver.findBy(text, FindType.text),
)
: context.world.appDriver.isPresent(
context.world.appDriver.findBy(text, FindType.text),
);
},
timeout: Duration(seconds: 120),
);
context.world.appDriver.findBy(text, FindType.text),
));
}
}()
.timeout(Duration(seconds: 120));
},
configuration: StepDefinitionConfiguration()
..timeout = const Duration(days: 1),
configuration: StepDefinitionConfiguration()..timeout = const Duration(days: 1),
);
}
StepDefinitionGeneric WaitUntilTooltipExists() {
return then2<String, Existence, FlutterWorld>(
'I wait until the tooltip {string} is {existence}',
(ofType, existence, context) async {
(ofType, existence, context) async {
await context.world.appDriver.waitUntil(
() async {
() async {
await context.world.appDriver.waitForAppToSettle();
return existence == Existence.absent
? context.world.appDriver.isAbsent(
context.world.appDriver.findBy(ofType, FindType.tooltip),
)
context.world.appDriver.findBy(ofType, FindType.tooltip),
)
: context.world.appDriver.isPresent(
context.world.appDriver.findBy(ofType, FindType.tooltip),
);
context.world.appDriver.findBy(ofType, FindType.tooltip),
);
},
timeout: Duration(seconds: 120),
);
},
configuration: StepDefinitionConfiguration()
..timeout = const Duration(days: 1),
configuration: StepDefinitionConfiguration()..timeout = const Duration(days: 1),
);
}
mixin _SwipeHelper
on When4WithWorld<SwipeDirection, int, String, String, FlutterWorld> {
mixin _SwipeHelper on When4WithWorld<SwipeDirection, int, String, String, FlutterWorld> {
Future<void> swipeOnFinder(
dynamic finder,
SwipeDirection direction,
int swipeAmount,
) async {
dynamic finder,
SwipeDirection direction,
int swipeAmount,
) async {
if (direction == SwipeDirection.left || direction == SwipeDirection.right) {
final offset =
direction == SwipeDirection.right ? swipeAmount : (swipeAmount * -1);
final offset = direction == SwipeDirection.right ? swipeAmount : (swipeAmount * -1);
await world.appDriver.scroll(
finder,
dx: offset.toDouble(),
@ -239,8 +217,7 @@ on When4WithWorld<SwipeDirection, int, String, String, FlutterWorld> {
timeout: timeout,
);
} else {
final offset =
direction == SwipeDirection.up ? swipeAmount : (swipeAmount * -1);
final offset = direction == SwipeDirection.up ? swipeAmount : (swipeAmount * -1);
await world.appDriver.scroll(
finder,
@ -251,26 +228,21 @@ on When4WithWorld<SwipeDirection, int, String, String, FlutterWorld> {
}
}
}
class SwipeOnType
extends When4WithWorld<SwipeDirection, int, String, String, FlutterWorld>
with _SwipeHelper {
class SwipeOnType extends When4WithWorld<SwipeDirection, int, String, String, FlutterWorld> with _SwipeHelper {
@override
Future<void> executeStep(
SwipeDirection direction,
int swipeAmount,
String typeOf,
String text,
) async {
final finder = this.world.appDriver.findByDescendant(
this.world.appDriver.findBy(widgetTypeByName(typeOf), FindType.type),
this.world.appDriver.findBy(text, FindType.text)
);
SwipeDirection direction,
int swipeAmount,
String typeOf,
String text,
) async {
final finder = this.world.appDriver.findByDescendant(this.world.appDriver.findBy(widgetTypeByName(typeOf), FindType.type), this.world.appDriver.findBy(text, FindType.text));
await swipeOnFinder(finder, direction, swipeAmount);
}
@override
RegExp get pattern => RegExp(
r'I swipe {swipe_direction} by {int} pixels on the widget of type {string} with text {string}');
RegExp get pattern => RegExp(r'I swipe {swipe_direction} by {int} pixels on the widget of type {string} with text {string}');
}
Type widgetTypeByName(String input1) {
@ -284,12 +256,12 @@ Type widgetTypeByName(String input1) {
case "TorIcon":
return TorIcon;
case "button":
return ElevatedButton;
return ElevatedButton;
case "IconButton":
return IconButton;
case "ProfileRow":
return ProfileRow;
return ProfileRow;
default:
throw("Unknown type $input1. add to integration_test/features/overrides.dart");
throw ("Unknown type $input1. add to integration_test/features/overrides.dart");
}
}
}

View File

@ -4,46 +4,44 @@ import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:gherkin/gherkin.dart';
StepDefinitionGeneric TooltipTap() {
return given1<String, FlutterWorld>(
RegExp(r'I tap the button with tooltip {string}'),
(input1, context) async {
final finder = context.world.appDriver.findBy(input1, FindType.tooltip);
await context.world.appDriver.tap(finder);
await context.world.appDriver.waitForAppToSettle();
}
);
return given1<String, FlutterWorld>(RegExp(r'I tap the button with tooltip {string}'), (input1, context) async {
final finder = context.world.appDriver.findBy(input1, FindType.tooltip);
await context.world.appDriver.tap(finder);
await context.world.appDriver.waitForAppToSettle();
});
}
StepDefinitionGeneric TorVersionPresent() {
return given<FlutterWorld>(
RegExp(r'I expect the Tor version to be present$'),
(context) async {
String versionString = "";
final file = File('fetch-tor.sh');
Stream<String> lines = file.openRead()
.transform(utf8.decoder)
.transform(LineSplitter());
try {
await for (var line in lines) {
if (line.startsWith("wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-")) {
versionString = line.substring(81, 88);
break;
}
}
print('File is now closed.');
} catch (e) {
print('Error: $e');
(context) async {
String versionString = "";
final file = File('fetch-tor.sh');
Stream<String> lines = file.openRead().transform(utf8.decoder).transform(LineSplitter());
try {
await for (var line in lines) {
if (line.startsWith("wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-")) {
versionString = line.substring(81, 88);
break;
}
if (versionString == "") {
context.expect(versionString, "#.#.#", reason: "error reading version string from fetch-tor.sh");
return;
}
context.world.attach(versionString, "text/plain", "Then I expect the Tor version to be present");
context.reporter.message("test!!!", MessageLevel.info);
print("looking for version string $versionString");
final finder = context.world.appDriver.findBy(versionString, FindType.text,);
final isP = await context.world.appDriver.isPresent(finder);
context.expect(isP, true);
}
print('File is now closed.');
} catch (e) {
print('Error: $e');
}
if (versionString == "") {
context.expect(versionString, "#.#.#", reason: "error reading version string from fetch-tor.sh");
return;
}
context.world.attach(versionString, "text/plain", "Then I expect the Tor version to be present");
//context.reporter.message("test!!!", MessageLevel.info);
print("looking for version string $versionString");
final finder = context.world.appDriver.findBy(
versionString,
FindType.text,
);
final isP = await context.world.appDriver.isPresent(finder);
context.expect(isP, true);
},
);
}
}

View File

@ -4,14 +4,16 @@ import 'package:gherkin/gherkin.dart';
StepDefinitionGeneric TakeScreenshot() {
return then<FlutterWorld>(
RegExp(
r'I take a screenshot'),
(context) async {
RegExp(r'I take a screenshot'),
(context) async {
try {
final bytes = await context.world.appDriver.screenshot();
final screenshotData = base64Encode(bytes);
print("EMBEDDING SCREENSHOT....");
print("$screenshotData");
context.world.attach(screenshotData, 'image/png', 'And I take a screenshot');
} catch (e, st) {
print("FAILED TO EMBED??? $e $st");
context.world.attach('Failed to take screenshot\n$e\n$st', 'text/plain');
}
},

View File

@ -11,7 +11,13 @@ abstract class Cwtch {
Future<void> ReconnectCwtchForeground();
// ignore: non_constant_identifier_names
void CreateProfile(String nick, String pass);
void CreateProfile(String nick, String pass, bool autostart);
// ignore: non_constant_identifier_names
void ActivatePeerEngine(String profile);
// ignore: non_constant_identifier_names
void DeactivatePeerEngine(String profile);
// ignore: non_constant_identifier_names
void LoadProfiles(String pass);
// ignore: non_constant_identifier_names

View File

@ -72,7 +72,8 @@ class CwtchNotifier {
}
EnvironmentConfig.debugLog("NewPeer $data");
// if tag != v1-defaultPassword then it is either encrypted OR it is an unencrypted account created during pre-beta...
profileCN.add(data["Identity"], data["name"], data["picture"], data["defaultPicture"], data["ContactsJson"], data["ServerList"], data["Online"] == "true", data["tag"] != "v1-defaultPassword");
profileCN.add(data["Identity"], data["name"], data["picture"], data["defaultPicture"], data["ContactsJson"], data["ServerList"], data["Online"] == "true", data["autostart"] == "true",
data["tag"] != "v1-defaultPassword");
break;
case "ContactCreated":
EnvironmentConfig.debugLog("ContactCreated $data");
@ -310,12 +311,16 @@ class CwtchNotifier {
profileCN.getProfile(data["ProfileOnion"])?.replaceServers(data["ServerList"]);
break;
case "TokenManagerInfo":
List<dynamic> associatedGroups = jsonDecode(data["Data"]);
int count = int.parse(data["ServerTokenCount"]);
associatedGroups.forEach((identifier) {
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(identifier.toString()))!.antispamTickets = count;
});
EnvironmentConfig.debugLog("update server token count for ${associatedGroups}, $count");
try {
List<dynamic> associatedGroups = jsonDecode(data["Data"]);
int count = int.parse(data["ServerTokenCount"]);
associatedGroups.forEach((identifier) {
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(identifier.toString()))!.antispamTickets = count;
});
EnvironmentConfig.debugLog("update server token count for ${associatedGroups}, $count");
} catch (e) {
// No tokens in data...
}
break;
case "NewGroup":
String invite = data["GroupInvite"].toString();

View File

@ -153,6 +153,7 @@ class CwtchFfi implements Cwtch {
String cwtchDir = "";
if (Platform.isLinux) {
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
home = envVars['HOME'] ?? "";
if (await File("linux/Tor/tor").exists()) {
bundledTor = "linux/Tor/tor";
} else if (await File("lib/Tor/tor").exists()) {
@ -289,17 +290,35 @@ class CwtchFfi implements Cwtch {
}
// ignore: non_constant_identifier_names
void CreateProfile(String nick, String pass) {
var createProfileC = library.lookup<NativeFunction<void_from_string_string_function>>("c_CreateProfile");
void CreateProfile(String nick, String pass, bool autostart) {
var createProfileC = library.lookup<NativeFunction<void_from_string_string_byte_function>>("c_CreateProfile");
// ignore: non_constant_identifier_names
final CreateProfile = createProfileC.asFunction<VoidFromStringStringFn>();
final CreateProfile = createProfileC.asFunction<VoidFromStringStringByteFn>();
final utf8nick = nick.toNativeUtf8();
final ut8pass = pass.toNativeUtf8();
CreateProfile(utf8nick, utf8nick.length, ut8pass, ut8pass.length);
CreateProfile(utf8nick, utf8nick.length, ut8pass, ut8pass.length, autostart ? 1 : 0);
malloc.free(utf8nick);
malloc.free(ut8pass);
}
// ignore: non_constant_identifier_names
void ActivatePeerEngine(String profile) {
var activatePeerEngineC = library.lookup<NativeFunction<string_to_void_function>>("c_ActivatePeerEngine");
final ActivatePeerEngine = activatePeerEngineC.asFunction<StringFn>();
final ut8profile = profile.toNativeUtf8();
ActivatePeerEngine(ut8profile, ut8profile.length);
malloc.free(ut8profile);
}
// ignore: non_constant_identifier_names
void DeactivatePeerEngine(String profile) {
var deactivatePeerEngineC = library.lookup<NativeFunction<string_to_void_function>>("c_DeactivatePeerEngine");
final DeactivatePeerEngine = deactivatePeerEngineC.asFunction<StringFn>();
final ut8profile = profile.toNativeUtf8();
DeactivatePeerEngine(ut8profile, ut8profile.length);
malloc.free(ut8profile);
}
// ignore: non_constant_identifier_names
void LoadProfiles(String pass) {
var loadProfileC = library.lookup<NativeFunction<string_to_void_function>>("c_LoadProfiles");
@ -763,10 +782,11 @@ class CwtchFfi implements Cwtch {
@override
String? defaultDownloadPath() {
Map<String, String> envVars = Platform.environment;
String nominalPath = path.join(envVars[Platform.isWindows ? 'UserProfile' : 'HOME']!, "Downloads");
if (Directory(nominalPath).existsSync() == false) {
return null;
return Directory.current.path;
}
return nominalPath;
}

View File

@ -71,8 +71,18 @@ class CwtchGomobile implements Cwtch {
}
// ignore: non_constant_identifier_names
void CreateProfile(String nick, String pass) {
cwtchPlatform.invokeMethod("CreateProfile", {"nick": nick, "pass": pass});
void CreateProfile(String nick, String pass, bool autostart) {
cwtchPlatform.invokeMethod("CreateProfile", {"nick": nick, "pass": pass, "autostart": autostart});
}
// ignore: non_constant_identifier_names
void ActivatePeerEngine(String profile) {
cwtchPlatform.invokeMethod("ActivatePeerEngine", {"profile": profile});
}
// ignore: non_constant_identifier_names
void DeactivatePeerEngine(String profile) {
cwtchPlatform.invokeMethod("DeactivatePeerEngine", {"profile": profile});
}
// ignore: non_constant_identifier_names

View File

@ -1,5 +1,5 @@
/// Flutter icons CwtchIcons
/// Copyright (C) 2021 by Open Privacy Research Society via fluttericon.com, fontello.com
/// Flutter icons Cwtch
/// Copyright (C) 2021-2022 by Open Privacy Research Society
/// This font was generated by FlutterIcon.com, which is derived from Fontello.
///
/// To use this font, place it in your fonts/ directory and include the
@ -7,9 +7,9 @@
///
/// flutter:
/// fonts:
/// - family: CwtchIcons
/// - family: Cwtch
/// fonts:
/// - asset: assets/fonts/CwtchIcons.ttf
/// - asset: fonts/Cwtch.ttf
///
///
///
@ -18,103 +18,112 @@ import 'package:flutter/widgets.dart';
class CwtchIcons {
CwtchIcons._();
static const _kFontFam = 'CwtchIcons';
static const _kFontFam = 'Cwtch';
static const String? _kFontPkg = null;
static const IconData arrow_back_24px = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attach_file_24px = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_peer = IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_unknown = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_24px = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData brightness_5_24px = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData camera_alt_24px = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData change_language = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData change_theme = IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_bubble_empty_24px = IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_bubble_24px = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_seetings_24px = IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_24px = IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chevron_left_24px = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData clear_24px = IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData content_copy_24px = IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData create_group = IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData cwtch_knott = IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dark_mode_24px = IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData delete_24px = IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_24px = IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData drag_indicator_24px = IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData edit_24px = IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData enable_experiments = IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData enable_groups = IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_closed = IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_open = IconData(0xe81a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_24dp = IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_broken = IconData(0xe81c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_brokenhalf = IconData(0xe81d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_malformed = IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_sad = IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData group_add_24px = IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData group_settings_24px = IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData groups_24px = IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData info_24px = IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData join_group = IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData list_black_24dp = IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData lock_open_24px = IconData(0xe826, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData lock_24px = IconData(0xe827, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData maps_ugc_24px = IconData(0xe828, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_24px = IconData(0xe829, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_24px = IconData(0xe82a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mood_24px = IconData(0xe82b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData more_vert_24px = IconData(0xe82c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData negative_heart_24px = IconData(0xe82d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_off = IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_on = IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_waiting = IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData peer_history = IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData peer_settings_24px = IconData(0xe832, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_add_alt_1_24px = IconData(0xe833, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_add_24px = IconData(0xe834, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_24px = IconData(0xe835, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData push_pin_black_24dp = IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData push_pin_24px = IconData(0xe837, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_24px = IconData(0xe838, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_24px = IconData(0xe839, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData settings_24px = IconData(0xe83a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_4_bar_24px = IconData(0xe83b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_alt_24px = IconData(0xe83c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_connected_no_internet_4_bar_24px = IconData(0xe83d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_off_24px = IconData(0xe83e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData swap_horiz_24px = IconData(0xe83f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_disabled_24px = IconData(0xe840, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_problem_24px = IconData(0xe841, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_24px = IconData(0xe842, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_01 = IconData(0xe843, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_02 = IconData(0xe844, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_03 = IconData(0xe845, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData toggle_on_24px = IconData(0xe846, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData vpn_key_24px = IconData(0xe847, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_blocked = IconData(0xe848, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px = IconData(0xe849, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_lines = IconData(0xe84a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_lines_thin___blocked = IconData(0xe84b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_user = IconData(0xe84c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_circle_24px = IconData(0xe84d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_group = IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_peer = IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_24px = IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData address_copy_2 = IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData address = IconData(0xe856, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData streamer_bunnymask = IconData(0xe85b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData streamer_ghost = IconData(0xe85c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData cancel_schedule_send_black_24dp = IconData(0xe85d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData more_horiz_black_24dp = IconData(0xe85e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_black_add_24dp = IconData(0xe85f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_black_24dp = IconData(0xe860, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData info_black_24dp = IconData(0xe861, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData accept_unknown = IconData(0xe862, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_closed_1 = IconData(0xe863, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_open_1 = IconData(0xe864, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_invite = IconData(0xe888, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData leave_group = IconData(0xe88a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData leave_chat = IconData(0xe88b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_blocked = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_lines = IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_lines_thin___blocked = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData account_circle_24px_user = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_circle_24px = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_group = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_peer = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_24px = IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData address = IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData address_copy = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData alternate_email_black_24dp = IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData arrow_back_24px = IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attach_file_24px = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attached_file = IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_peer = IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_unknown = IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData block_24px = IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData brightness_5_24px = IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData camera_alt_24px = IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData cancel_schedule_send_black_24dp = IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData change_language = IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData change_theme = IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_bubble_empty_24px = IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_bubble_24px = IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chat_seetings_24px = IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_24px = IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chevron_left_24px = IconData(0xe81c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData clear_24px = IconData(0xe81d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData content_copy_24px = IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData copy_address = IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData create_group = IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData cwtch_knott = IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dark_mode_24px = IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData delete_24px = IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_black_24dp = IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_black_add_24dp = IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dns_24px = IconData(0xe826, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData drag_indicator_24px = IconData(0xe827, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData edit_24px = IconData(0xe828, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData enable_experiments = IconData(0xe829, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData enable_groups = IconData(0xe82a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_closed = IconData(0xe82b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_open = IconData(0xe82c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_24dp = IconData(0xe82d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_broken = IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_brokenhalf = IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_malformed = IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData favorite_black_24dp_sad = IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData folder_black_24dp = IconData(0xe832, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData group_add_24px = IconData(0xe833, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData group_settings_24px = IconData(0xe834, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData groups_24px = IconData(0xe835, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData image_black_24dp = IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData info_black_24dp = IconData(0xe837, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData info_24px = IconData(0xe838, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData join_group = IconData(0xe839, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData leave_chat = IconData(0xe83a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData leave_group = IconData(0xe83b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData link_ = IconData(0xe83c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData list_black_24dp = IconData(0xe83d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData lock_open_24px = IconData(0xe83e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData lock_24px = IconData(0xe83f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData maps_ugc_24px = IconData(0xe841, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_24px = IconData(0xe842, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_24px = IconData(0xe843, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mood_24px = IconData(0xe844, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData more_horiz_black_24dp = IconData(0xe845, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData more_vert_24px = IconData(0xe846, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData negative_heart_24px = IconData(0xe848, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_off = IconData(0xe849, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_on = IconData(0xe84a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData onion_waiting = IconData(0xe84b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData peer_history = IconData(0xe84c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData peer_settings_24px = IconData(0xe84d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_add_alt_1_24px = IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_add_24px = IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData person_24px = IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData push_pin_black_24dp = IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData push_pin_24px = IconData(0xe853, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_24px = IconData(0xe855, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_invite = IconData(0xe856, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_24px = IconData(0xe857, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData settings_24px = IconData(0xe858, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_4_bar_24px = IconData(0xe859, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_alt_24px = IconData(0xe85a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_connected_no_internet_4_bar_24px = IconData(0xe85b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData signal_cellular_off_24px = IconData(0xe85c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData streamer_bunnymask = IconData(0xe85d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData streamer_ghost = IconData(0xe85e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData swap_horiz_24px = IconData(0xe85f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_disabled_24px = IconData(0xe860, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_problem_24px = IconData(0xe861, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sync_24px = IconData(0xe862, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_01 = IconData(0xe863, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_02 = IconData(0xe864, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData syncing_03 = IconData(0xe865, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData toggle_on_24px = IconData(0xe866, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData vpn_key_24px = IconData(0xe867, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData accept_unknown = IconData(0xe868, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData view_replies = IconData(0xe869, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData anti_spam_2 = IconData(0xe86b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData manage_files = IconData(0xe86c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attached_file_2 = IconData(0xe86d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData anti_spam_3 = IconData(0xe86e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}

View File

@ -1,6 +1,11 @@
{
"@@locale": "cy",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "da",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,13 +1,18 @@
{
"@@locale": "de",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Show QR Code",
"shareProfileMenuTooltop": "Share profile via...",
"acquiredTicketsFromServer": "Antispam Challenge Complete",
"acquiringTicketsFromServer": "Performing Antispam Challenge",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"acquiringTicketsFromServer": "Antispam-Herausforderung meistern",
"acquiredTicketsFromServer": "Antispam-Herausforderung abgeschlossen",
"shareProfileMenuTooltop": "Profil teilen über...",
"localeNl": "Niederländisch \/ Nederlands",
"localePtBr": "Brasilianisches Portugiesisch \/ Português do Brasil",
"shareMenuQRCode": "QR-Code anzeigen",
"enableExperimentQRCode": "QR-Codes",
"experimentQRCodeDescription": "QR-Code-Unterstützung ermöglicht den Austausch von Daten (z. B. Profilidentität) über QR-Codes",
"localeIt": "Italienisch \/ Italiano",
"errorDownloadDirectoryDoesNotExist": "Die Dateifreigabe kann nicht aktiviert werden, da der Download-Ordner nicht festgelegt wurde oder auf einen nicht vorhandenen Ordner festgelegt ist.",
"localeTr": "Türkisch \/ Türk",

View File

@ -1,6 +1,11 @@
{
"@@locale": "el",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "en",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "es",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,13 +1,18 @@
{
"@@locale": "fr",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"shareProfileMenuTooltop": "Partager le profil via...",
"shareMenuQRCode": "Afficher le QR code",
"localePtBr": "Portugais du Brésil \/ Português do Brasil",
"localeNl": "néerlandais \/ néerlandais",
"experimentQRCodeDescription": "La prise en charge des QR codes permet de partager des données (telles que l'identité du profil) par des QR codes \n",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Show QR Code",
"shareProfileMenuTooltop": "Share profile via...",
"acquiredTicketsFromServer": "Antispam Challenge Complete",
"acquiringTicketsFromServer": "Performing Antispam Challenge",
"acquiringTicketsFromServer": "Réaliser un défi anti-spam",
"acquiredTicketsFromServer": "Défi anti-spam terminé",
"errorDownloadDirectoryDoesNotExist": "Le partage de fichiers ne peut pas être activé car le dossier de téléchargement n'a pas été défini ou est défini sur un dossier qui n'existe pas.",
"localeIt": "italien \/ italien",
"localeTr": "Turc \/ Türk",

View File

@ -1,6 +1,11 @@
{
"@@locale": "it",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"tooltipPinConversation": "Aggiungi la conversazione in cima alla lista \"Conversazioni\"",
"tooltipUnpinConversation": "Rimuovi la conversazione dalla cima della lista \"Conversazioni\"",

View File

@ -1,6 +1,11 @@
{
"@@locale": "lb",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,7 +1,245 @@
{
"@@locale": "nl",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"localeNl": "Dutch \/ Dutch",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Braziliaans Portugees \/ Português do Brasil",
"acquiredTicketsFromServer": "Anti-spam uitdaging voltooid",
"acquiringTicketsFromServer": "Anti-spam uitdaging uitvoeren",
"acknowledgedLabel": "Erkend",
"descriptionFileSharing": "Het experiment met het delen van bestanden staat u toe om bestanden van Cwtch-contactpersonen en groepen te verzenden en te ontvangen. Merk op dat het delen van een bestand met een groep tot gevolg zal hebben dat leden van die groep direct via Cwtch verbinding met je maken om het bestand te downloaden.",
"descriptionExperimentsGroups": "Het groepsexperiment staat Cwtch toe verbinding te maken met onvertrouwde serverinfrastructuur om communicatie met meer dan één contact te vergemakkelijken.",
"notificationPolicyDefaultAll": "Standaard Alle",
"conversationNotificationPolicyOptIn": "Opt-In",
"settingAndroidPowerExemption": "Android negeer batterij-optimalisaties",
"experimentQRCodeDescription": "Ondersteuning voor QR-codes maakt het delen van gegevens (zoals profielidentiteit) via QR-codes mogelijk",
"tooltipSelectACustomProfileImage": "Selecteer een zelf ingestelde profielafbeelding",
"settingsAndroidPowerReenablePopup": "Batterijoptimalisatie kan niet opnieuw worden ingeschakeld vanuit Cwtch. Ga naar Android \/ Instellingen \/ Apps \/ Cwtch \/ Batterij en stel Gebruik in op 'Geoptimaliseerd'",
"settingAndroidPowerExemptionDescription": "Optioneel: Vraag Android om geen geoptimaliseerd energiebeheer te gebruiken voor Cwtch. Dit zal resulteren in een betere stabiliteit ten koste van meer batterijgebruik.",
"descriptionExperiments": "Cwtch-experimenten zijn optionele, Opt-In functies die extra functionaliteit toevoegen aan Cwtch die andere privacyoverwegingen kunnen hebben dan traditionele 1: 1 metadata-resistente chat, bijvoorbeeld groepschat, botintegratie enz.",
"plainProfileDescription": "We raden aan je Cwtch-profielen te beveiligen met een wachtwoord. Als je geen wachtwoord instelt op dit profiel heeft iedereen die toegang heeft tot dit apparaat mogelijk toegang tot informatie over dit profiel, inclusief gevoelige cryptografische sleutels.",
"plainServerDescription": "We raden aan je Cwtch-servers te beveiligen met een wachtwoord. Als je geen wachtwoord instelt op deze server heeft iedereen die toegang heeft tot dit apparaat mogelijk toegang tot informatie over deze server, inclusief gevoelige cryptografische sleutels.",
"descriptionStreamerMode": "Wanneer ingeschakeld, maakt deze optie de app visueel meer privé voor streaming of presentatie door bijvoorbeeld profiel- en contactadressen te verbergen",
"encryptedProfileDescription": "Het versleutelen van een profiel met een wachtwoord beschermt deze tegen andere mensen die dit apparaat kunnen gebruiken. Versleutelde profielen kunnen niet worden ontsleuteld, weergegeven of geopend totdat het juiste wachtwoord is ingevoerd om ze te ontgrendelen.",
"groupInviteSettingsWarning": "Je bent uitgenodigd om lid te worden van een groep! Schakel het Groepschat-experiment in Instellingen in om deze uitnodiging te bekijken.",
"descriptionBlockUnknownConnections": "Wanneer ingeschakeld, zal deze optie automatisch verbindingen sluiten van Cwtch gebruikers die niet aan je contactlijst zijn toegevoegd.",
"chatHistoryDefault": "Dit gesprek wordt verwijderd wanneer Cwtch wordt gesloten! Berichtgeschiedenis kan per gesprek worden ingeschakeld via het menu Instellingen rechtsboven.",
"encryptedServerDescription": "Het versleutelen van een server met een wachtwoord beschermt deze tegen andere mensen die dit apparaat kunnen gebruiken. Versleutelde servers kunnen niet worden ontsleuteld, weergegeven of geopend totdat het juiste wachtwoord is ingevoerd om ze te ontgrendelen.",
"settingImagePreviewsDescription": "Afbeeldingen en profielfoto's worden automatisch gedownload en voorvertongingen gemaakt. We raden u aan dit experiment niet in te schakelen als je Cwtch gebruikt met niet-vertrouwde contacten.",
"torSettingsEnabledCacheDescription": "Cache de huidige gedownloade Tor-consensus om deze de volgende keer dat Cwtch wordt geopend opnieuw te gebruiken. Hierdoor kan Tor sneller starten. Indien uitgeschakeld, zal Cwtch de gegevens in de cache opschonen bij het opstarten.",
"fileSharingSettingsDownloadFolderDescription": "Wanneer bestanden automatisch worden gedownload (bijv. afbeedingen, wanneer voorvertoningen van afbeeldingen zijn ingeschakeld), is een standaardlocatie nodig om de bestanden naar te downloaden.",
"torSettingsUseCustomTorServiceConfigurastionDescription": "Overschrijf de standaard tor-configuratie. Waarschuwing: dit kan gevaarlijk zijn. Zet dit alleen aan als je weet wat je doet.",
"torSettingsUseCustomTorServiceConfiguration": "Gebruik een zelf ingestelde Tor-serviceconfiguratie (torrc)",
"descriptionACNCircuitInfo": "Uitgebreide informatie over het pad dat het anonieme communicatienetwerk gebruikt om verbinding te maken met dit gesprek.",
"conversationNotificationPolicySettingDescription": "Meldingsgedrag voor dit gesprek beheren",
"notificationContentSimpleEvent": "Generieke melding",
"exportProfileTooltip": "Maak een back-up van dit profiel naar een versleuteld bestand. Het versleutelde bestand kan in een andere Cwtch-app worden geïmporteerd.",
"blockUnknownConnectionsEnabledDescription": "Verbindingen van onbekende contacten worden geblokkeerd. Je kunt dit wijzigen in Instellingen",
"messageEnableFileSharing": "Schakel het experiment voor het delen van bestanden in om dit bericht te bekijken.",
"serverAutostartDescription": "Bepaalt of de applicatie de server automatisch start bij het opstarten",
"serverDescriptionDescription": "Je beschrijving van de server alleen voor persoonlijk beheer, zal nooit worden gedeeld",
"membershipDescription": "Hieronder staat een lijst met gebruikers die berichten naar de groep hebben gestuurd. Deze lijst bevat mogelijk niet alle gebruikers die toegang hebben tot de groep.",
"defaultScalingText": "Standaardtekstgrootte (schaalfactor:",
"fileSharingSettingsDownloadFolderTooltip": "Bladeren om een andere standaardmap voor gedownloade bestanden te selecteren.",
"fileDownloadUnavailable": "Dit bestand lijkt niet beschikbaar om te downloaden. Het kan zijn dat de verzender downlaoden voor dit bestand heeft uitgeschakeld.",
"errorDownloadDirectoryDoesNotExist": "Bestanden delen kan niet worden ingeschakeld omdat de downloadmap niet is ingesteld of is ingesteld op een map die niet bestaat.",
"settingTheme": "Lichte thema's gebruiken",
"noPasswordWarning": "Het niet gebruiken van een wachtwoord voor dit account betekent dat alle lokaal opgeslagen gegevens niet worden versleuteld",
"savePeerHistoryDescription": "Bepaalt of geschiedenis gekoppeld aan de contactpersoon moet worden verwijderd.",
"dmTooltip": "Klik voor DM",
"debugLog": "Zet console debug logging aan",
"addContactFirst": "Voeg een contact toe of kies een contact om te beginnen met chatten.",
"experimentClickableLinksDescription": "Het klikbare links experiment maakt het mogelijk op URLs te klikken in berichten",
"enableExperimentClickableLinks": "Klikbare links inschakelen",
"groupsOnThisServerLabel": "Groepen waarin ik zit gehost op deze server",
"displayNameTooltip": "Voer een weergavenaam in",
"tooltipBackToMessageEditing": "Terug naar bericht bewerken",
"editServerTitle": "Server bewerken",
"editProfile": "Bewerk profiel",
"manageKnownServersButton": "Beheer bekende servers",
"manageKnownServersLong": "Beheer bekende servers",
"themeNameVampire": "Vampier",
"sendAnInvitation": "Je hebt een uitnodiging gestuurd voor: ",
"contactSuggestion": "Dit is een contactsuggestie voor: ",
"successfullAddedContact": "Succesvol toegevoegd ",
"saveProfileBtn": "Profiel opslaan",
"deleteProfileBtn": "Verwijder profiel",
"clickableLinksWarning": "Het openen van deze URL zal een toepassing buiten Cwtch opstarten en kan metadata onthullen of anderszins de beveiliging van Cwtch in gevaar brengen. Open alleen URL's van mensen die je vertrouwt. Weet je zeker dat je door wilt gaan?",
"clickableLinkError": "Fout opgetreden bij het openen van URL",
"thisFeatureRequiresGroupExpermientsToBeEnabled": "Voor deze functie moet het Groepen experiment zijn ingeschakeld in Instellingen",
"formattingExperiment": "Berichtopmaak",
"successfullyImportedProfile": "Profiel succesvol geïmporteerd: %profile",
"failedToImportProfile": "Fout bij importeren profiel",
"notificationContentContactInfo": "Gespreksinformatie",
"notificationPolicySettingLabel": "Beleid voor meldingen",
"conversationNotificationPolicySettingLabel": "Beleid voor gespreksmeldingen",
"notificationContentSettingDescription": "Regelt de inhoud van gespreksmeldingen",
"notificationPolicySettingDescription": "Regelt het standaard meldingsgedrag van de applicatie",
"notificationContentSettingLabel": "Inhoud van meldingen",
"notificationPolicyOptIn": "Opt In",
"torSettingsErrorSettingPort": "Poortnummer moet liggen tussen 1 en 65535",
"storageMigrationModalMessage": "Profielen migreren naar een nieuw opslagformaat. Dit kan een paar minuten duren...",
"settingImagePreviews": "Voorvertoningen van afbeeldingen en profielfoto's",
"settingUIColumnPortrait": "UI-kolommen in portret modus",
"settingUIColumnOptionSame": "Zelfde als portret modus instelling",
"settingUIColumnLandscape": "UI-kolommen in liggende modus",
"tooltipRemoveThisQuotedMessage": "Verwijder geciteerd bericht.",
"tooltipReplyToThisMessage": "Reageer op dit bericht",
"shutdownCwtchDialog": "Weet je zeker dat je Cwtch wilt afsluiten? Alle verbindingen en de applicatie worden gesloten.",
"malformedMessage": "Misvormd bericht",
"profileDeleteSuccess": "Profiel succesvol verwijderd",
"importProfileTooltip": "Gebruik een versleutelde Cwtch backup om een profiel binnen te halen dat in een andere instantie van Cwtch is aangemaakt.",
"unlockProfileTip": "Maak of ontgrendel een profiel om te beginnen!",
"unlockServerTip": "Maak of ontgrendel een server om te beginnen!",
"createProfileToBegin": "Maak of ontgrendel een profiel om te beginnen",
"addServerFirst": "Je moet een server toevoegen voordat je een groep kunt aanmaken",
"createProfileBtn": "Profiel aanmaken",
"tooltipUnlockProfiles": "Ontgrendel versleutelde profielen door hun wachtwoord in te voeren.",
"addNewItem": "Voeg een nieuw item toe aan de lijst",
"addListItem": "Een nieuw lijstitem toevoegen",
"peerOfflineMessage": "Contact is offline, berichten kunnen nu niet worden afgeleverd",
"acceptGroupInviteLabel": "Wil je de uitnodiging accepteren voor",
"profileOnionLabel": "Stuur dit adres naar contacten waarmee je in contact wilt komen",
"password2Label": "Wachtwoord opnieuw invoeren",
"nickChangeSuccess": "Profielnaam succesvol gewijzigd",
"inviteToGroup": "Je bent uitgenodigd om lid te worden van een groep:",
"messageFormattingDescription": "Rijke tekstopmaak in getoonde berichten inschakelen, bijv. **vetgedrukt** en *cursief*",
"labelACNCircuitInfo": "ACN circuitinfo",
"torSettingsCustomControlPortDescription": "Gebruik zelf ingestelde poort voor controleverbindingen naar de Tor proxy",
"torSettingsCustomControlPort": "Zelf ingestelde control port",
"torSettingsCustomSocksPortDescription": "Gebruik een zelf ingestelde poort voor dataverbindingen naar de Tor proxy",
"torSettingsCustomSocksPort": "Zelf ingesltelde SOCKS-poort",
"torSettingsEnabledAdvancedDescription": "Gebruik een bestaande Tor-service op je systeem of wijzig de parameters van de Cwtch Tor-service",
"torSettingsEnabledAdvanced": "Geavanceerde Tor-configuratie inschakelen",
"msgAddToAccept": "Voeg dit account toe aan je contacten om dit bestand te accepteren.",
"msgConfirmSend": "Weet je zeker dat je wilt verzenden",
"msgFileTooBig": "Bestanden mogen niet groter zijn dan 10 GB",
"settingDownloadFolder": "Map downloaden",
"importLocalServerSelectText": "Selecteer lokale server",
"importLocalServerLabel": "Lokaal gehoste server importeren",
"verfiyResumeButton": "Verifiëren\/hervatten",
"fileCheckingStatus": "Downloadstatus controleren",
"fileInterrupted": "Onderbroken",
"fileSavedTo": "Opgeslagen in",
"deleteServerConfirmBtn": "Server echt verwijderen",
"deleteServerSuccess": "Server succesvol verwijderd",
"enterCurrentPasswordForDeleteServer": "Voer huidige wachtwoord in om deze server te verwijderen",
"settingServersDescription": "Het servers hosten experiment maakt het mogelijk Cwtch-servers te hosten en te beheren",
"settingServers": "Servers hosten",
"enterServerPassword": "Voer wachtwoord in om server te ontgrendelen",
"serversManagerTitleLong": "Servers die je host",
"serverAutostartLabel": "Automatisch starten",
"serverEnabled": "Server ingeschakeld",
"messageFileOffered": "Contact biedt aan om je een bestand te sturen",
"contactGoto": "Ga naar gesprek met %1",
"tooltipOpenSettings": "Open het instellingenpaneel",
"titleManageProfiles": "Cwtch profielen beheren",
"passwordChangeError": "Fout bij wijzigen wachtwoord: opgegeven wachtwoord geweigerd",
"passwordErrorEmpty": "Wachtwoord mag niet leeg zijn",
"peerNotOnline": "Contact is offline. De toepassingen kunnen op dit moment niet worden gebruikt.",
"manageSharedFiles": "Gedeelde bestanden beheren",
"tooltipPreviewFormatting": "Voorbeeld van berichtopmaak bekijken",
"tooltipItalicize": "Cursief",
"okButton": "Oké",
"tooltipBoldText": "Vetgedrukt",
"shareProfileMenuTooltop": "Profiel delen via...",
"tooltipUnpinConversation": "Gesprek bovenaan 'Gesprekken' losmaken",
"tooltipPinConversation": "Gesprek bovenaan 'Gesprekken' vastprikken",
"replyingTo": "Reageren op %1",
"viewReplies": "Reacties op dit bericht bekijken",
"messageNoReplies": "Er zijn geen reacties op dit bericht.",
"stopSharingFile": "Stop delen bestand",
"restartFileShare": "Start delen bestand",
"shuttingDownApp": "Afsluiten...",
"importProfile": "Profiel importeren",
"exportProfile": "Profiel exporteren",
"localeDa": "Deens \/ Dansk",
"localeCy": "Welsh \/ Cymraeg",
"rejected": "Geweigerd!",
"tooltipRejectContactRequest": "Weiger dit contactverzoek",
"tooltipAcceptContactRequest": "Accepteer dit contactverzoek.",
"notificationNewMessageFromGroup": "Nieuw bericht in een groep!",
"notificationNewMessageFromPeer": "Nieuw bericht van een contact!",
"accepted": "Geaccepteerd!",
"reallyLeaveThisGroupPrompt": "Weet je zeker dat je dit gesprek wilt verlaten? Alle berichten en attributen worden verwijderd.",
"yesLeave": "Ja, verlaat dit gesprek",
"leaveConversation": "Verlaat dit gesprek",
"titleManageServers": "Servers beheren",
"invalidImportString": "Ongeldige import string",
"enterCurrentPasswordForDelete": "Voer huidige wachtwoord in om dit profiel te verwijderen.",
"enableGroups": "Groepschat inschakelen",
"networkStatusConnecting": "Verbinding maken met netwerk en contacten...",
"networkStatusAttemptingTor": "Proberen verbinding te maken met het Tor-netwerk",
"networkStatusDisconnected": "Verbinding met internet verbroken, controleer je verbinding",
"viewGroupMembershipTooltip": "Groepslidmaatschap weergeven",
"zoomLabel": "Interface zoom (beïnvloedt vooral de grootte van tekst en knoppen)",
"error0ProfilesLoadedForPassword": "0 profielen geladen met dat wachtwoord",
"enterProfilePassword": "Voer een wachtwoord in om je profielen te bekijken",
"addNewProfileBtn": "Nieuw profiel toevoegen",
"deleteProfileConfirmBtn": "Profiel echt verwijderen",
"deleteConfirmLabel": "Typ VERWIJDEREN om te bevestigen",
"couldNotSendMsgError": "Kan bericht niet verzenden",
"retrievingManifestMessage": "Bestandsinformatie ophalen...",
"streamerModeLabel": "Streamer-\/presentatiemodus",
"archiveConversation": "Archiveer dit gesprek",
"blockedMessageMessage": "Dit bericht is van een profiel dat je hebt geblokkeerd.",
"placeholderEnterMessage": "Type een bericht...",
"deleteProfileSuccess": "Profiel succesvol verwijderd",
"sendInvite": "Een contact- of groepsuitnodiging verzenden",
"sendMessage": "Bericht versturen",
"resetTor": "Resetten",
"tooltipAddContact": "Een nieuw contact of gesprek toevoegen",
"contactAlreadyExists": "Contact bestaat al",
"conversationSettings": "Gespreksinstellingen",
"settingFileSharing": "Bestanden delen",
"messageFileSent": "Je hebt een bestand verzonden",
"tooltipCode": "Code \/ Monospace",
"tooltipStrikethrough": "Doorhalen",
"tooltipSuperscript": "Superscript",
"tooltipSubscript": "Subscript",
"localeNl": "Nederlands \/ Dutch",
"pendingLabel": "In afwachting",
"builddate": "Gebouwd op: %2",
"versionTor": "Versie %1 met tor %2",
"blockUnknownLabel": "Blokkeer onbekende contacten",
"versionBuilddate": "Versie: %1 Gebouwd op: %2",
"defaultProfileName": "Alice",
"update": "Update",
"viewServerInfo": "Serverinfo",
"serverNotSynced": "Nieuwe berichten synchroniseren (dit kan even duren)...",
"serverConnectivityDisconnected": "Server verbinding verbroken",
"pasteAddressToAddContact": "Plak hier een cwtch adres, uitnodiging of sleutelbundel om een nieuw gesprek toe te voegen",
"todoPlaceholder": "Todo...",
"experimentsEnabled": "Experimenten inschakelen",
"settingInterfaceZoom": "Zoomniveau",
"yourDisplayName": "Jouw weergavenaam",
"profileName": "Weergavenaam",
"addProfileTitle": "Nieuw profiel toevoegen",
"editProfileTitle": "Bewerk profiel",
"copiedToClipboardNotification": "Gekopieerd naar klembord",
"puzzleGameBtn": "Puzzelspel",
"bulletinsBtn": "Bulletins",
"addListItemBtn": "Item toevoegen",
"searchList": "Zoeklijst",
"postNewBulletinLabel": "Nieuw bulletin plaatsen",
"newBulletinLabel": "Nieuw bulletin",
"joinGroupTab": "Lid worden van een groep",
"joinGroup": "Lid worden van groep",
"settingsGroupExperiments": "Experimenten",
"settingsGroupAppearance": "Uiterlijk",
"settingGroupBehaviour": "Gedrag",
"torSettingsEnableCache": "Cache Tor-consensus",
"serverTotalMessagesLabel": "Totaal aantal berichten",
"serverMetricsLabel": "Serverstatistieken",
"manageKnownServersShort": "Servers",
"newMessagesLabel": "Nieuwe berichten",
"localeRU": "Russisch \/ Русский",
"copyServerKeys": "Sleutels kopiëren",
"shutdownCwtchAction": "Cwtch afsluiten",
"shutdownCwtchTooltip": "Cwtch afsluiten",
"shutdownCwtchDialogTitle": "Cwtch afsluiten?",
"serverSynced": "Gesynchroniseerd",
"defaultGroupName": "Geweldige groep",
"shareMenuQRCode": "Toon QR-code",
@ -23,7 +261,6 @@
"themeNameMermaid": "Zeemeermin",
"themeNamePumpkin": "Pompoen",
"themeNameGhost": "Geest",
"themeNameVampire": "Vampier ",
"themeNameWitch": "Heks",
"themeNameCwtch": "Cwtch",
"serverConnectionsLabel": "Verbinding",
@ -32,7 +269,6 @@
"serverEnabledDescription": "Start of stop de server",
"serverDescriptionLabel": "Server beschrijving",
"serverAddress": "Server adres",
"editServerTitle": "Server wijzigen",
"titleManageProfilesShort": "Profielen",
"tooltipSendFile": "Verstuur bestand",
"labelFilesize": "Grootte",
@ -45,7 +281,6 @@
"localeEn": "Engels \/ English",
"unlock": "Ontgrendelen",
"radioNoPassword": "Onversleuteld (Geen wachtwoord)",
"editProfile": "Profiel wijzig",
"newProfile": "Nieuw profiel",
"inviteToGroupLabel": "Uitnodigen voor groep",
"newGroupBtn": "Nieuwe groep aanmaken",
@ -76,10 +311,7 @@
"yourServers": "Jouw servers",
"yourProfiles": "Jouw profielen",
"password": "Wachtwoord",
"deleteProfileBtn": "Verwijder ",
"passwordErrorMatch": "Wachtwoorden komen niet overeen",
"saveProfileBtn": "Profiel ",
"createProfileBtn": "Profiel maken",
"clickableLinksCopy": "Kopieer URL",
"clickableLinkOpen": "Open URL",
"addServerTooltip": "Nieuwe server toevoegen",
@ -94,11 +326,8 @@
"cwtchSettingsTitle": "Cwtch instellingen",
"conversationNotificationPolicyNever": "Nooit",
"conversationNotificationPolicyDefault": "Standaard",
"contactAlreadyExists": "Contact Already Exists",
"addContactConfirm": "Contact %1 toevoegen",
"addContact": "Contact toevoegen",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"shareProfileMenuTooltop": "Share profile via...",
"version": "Versie %1",
"themeDark": "Donker",
"themeLight": "Licht",
@ -119,7 +348,6 @@
"chatBtn": "Chat",
"inviteBtn": "Uitnodigen",
"groupNameLabel": "Groepsnaam",
"viewServerInfo": "Server info",
"serverConnectivityConnected": "Server verbonden",
"serverInfo": "Server informatie",
"titlePlaceholder": "titel...",
@ -135,228 +363,5 @@
"groupAddr": "Adres",
"server": "Server",
"invitation": "Uitnodiging",
"addPeerTab": "Contact toevoegen",
"acquiredTicketsFromServer": "Antispam Challenge Complete",
"acquiringTicketsFromServer": "Performing Antispam Challenge",
"errorDownloadDirectoryDoesNotExist": "Filesharing cannot be enabled because the Download Folder has not been set, or is set to a folder that does not exist.",
"tooltipUnpinConversation": "Unpin conversation from the top of \"Conversations\"",
"tooltipPinConversation": "Pin conversation to the top of \"Conversations\"",
"replyingTo": "Replying to %1",
"fileDownloadUnavailable": "This file appears unavailable for download. The sender may have disabled downloads for this file.",
"messageNoReplies": "There are no replies to this message.",
"viewReplies": "View replies to this message",
"restartFileShare": "Start Sharing File",
"stopSharingFile": "Stop Sharing File",
"manageSharedFiles": "Manage Shared Files",
"tooltipPreviewFormatting": "Preview Message Formatting",
"tooltipCode": "Code \/ Monospace",
"tooltipStrikethrough": "Strikethrough",
"tooltipSubscript": "Subscript",
"tooltipSuperscript": "Superscript",
"tooltipItalicize": "Italic",
"tooltipBackToMessageEditing": "Back to Message Editing",
"tooltipBoldText": "Bold",
"okButton": "OK",
"settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'",
"settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.",
"settingAndroidPowerExemption": "Android Ignore Battery Optimizations",
"thisFeatureRequiresGroupExpermientsToBeEnabled": "This feature requires the Groups Experiment to be enabled in Settings",
"messageFormattingDescription": "Enable rich text formatting in displayed messages e.g. **bold** and *italic*",
"formattingExperiment": "Message Formatting",
"clickableLinkError": "Error encountered while attempting to open URL",
"clickableLinksWarning": "Opening this URL will launch an application outside of Cwtch and may reveal metadata or otherwise compromise the security of Cwtch. Only open URLs from people you trust. Are you sure you want to continue?",
"shuttingDownApp": "Shutting down...",
"successfullyImportedProfile": "Successfully Imported Profile: %profile",
"failedToImportProfile": "Error Importing Profile",
"importProfileTooltip": "Use an encrypted Cwtch backup to bring in a profile created in another instance of Cwtch.",
"importProfile": "Import Profile",
"exportProfileTooltip": "Backup this profile to an encrypted file. The encrypted file can be imported into another Cwtch app.",
"exportProfile": "Export Profile",
"localeDa": "Danish \/ Dansk",
"localeCy": "Welsh \/ Cymraeg",
"notificationContentContactInfo": "Conversation Information",
"notificationContentSimpleEvent": "Plain Event",
"conversationNotificationPolicySettingDescription": "Control notification behaviour for this conversation",
"conversationNotificationPolicySettingLabel": "Conversation Notification Policy",
"settingsGroupExperiments": "Experiments",
"settingsGroupAppearance": "Appearance",
"settingGroupBehaviour": "Behaviour",
"notificationContentSettingDescription": "Controls the contents of conversation notifications",
"notificationPolicySettingDescription": "Controls the default application notification behaviour",
"notificationContentSettingLabel": "Notification Content",
"notificationPolicySettingLabel": "Notification Policy",
"conversationNotificationPolicyOptIn": "Opt In",
"notificationPolicyDefaultAll": "Default All",
"notificationPolicyOptIn": "Opt In",
"tooltipSelectACustomProfileImage": "Select a Custom Profile Image",
"torSettingsEnabledCacheDescription": "Cache the current downloaded Tor consensus to reuse next time Cwtch is opened. This will allow Tor to start faster. When disabled, Cwtch will purge cached data on start up.",
"torSettingsEnableCache": "Cache Tor Consensus",
"descriptionACNCircuitInfo": "In depth information about the path that the anonymous communication network is using to connect to this conversation.",
"labelACNCircuitInfo": "ACN Circuit Info",
"fileSharingSettingsDownloadFolderTooltip": "Browse to select a different default folder for downloaded files.",
"fileSharingSettingsDownloadFolderDescription": "When files are downloaded automatically (e.g. image files, when image previews are enabled) a default location to download the files to is needed.",
"torSettingsErrorSettingPort": "Port Number must be between 1 and 65535",
"torSettingsUseCustomTorServiceConfigurastionDescription": "Override the default tor configuration. Warning: This could be dangerous. Only turn this on if you know what you are doing.",
"torSettingsUseCustomTorServiceConfiguration": "Use a Custom Tor Service Configuration (torrc)",
"torSettingsCustomControlPortDescription": "Use a custom port for control connections to the Tor proxy",
"torSettingsCustomControlPort": "Custom Control Port",
"torSettingsCustomSocksPortDescription": "Use a custom port for data connections to the Tor proxy",
"torSettingsCustomSocksPort": "Custom SOCKS Port",
"torSettingsEnabledAdvancedDescription": "Use an existing Tor service on your system, or change the parameters of the Cwtch Tor Service",
"torSettingsEnabledAdvanced": "Enable Advanced Tor Configuration",
"msgAddToAccept": "Add this account to your contacts in order to accept this file.",
"msgConfirmSend": "Are you sure you want to send",
"msgFileTooBig": "File size cannot exceed 10 GB",
"storageMigrationModalMessage": "Migrating profiles to new storage format. This could take a few minutes...",
"settingDownloadFolder": "Download Folder",
"settingImagePreviewsDescription": "Images and Profile Pictures will be downloaded and previewed automatically. We recommend that you do not enable this Experiment if you use Cwtch with untrusted contacts.",
"settingImagePreviews": "Image Previews and Profile Pictures",
"experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages",
"enableExperimentClickableLinks": "Enable Clickable Links",
"serverTotalMessagesLabel": "Total Messages",
"serverMetricsLabel": "Server Metrics",
"manageKnownServersShort": "Servers",
"manageKnownServersLong": "Manage Known Servers",
"displayNameTooltip": "Please enter a display name",
"manageKnownServersButton": "Manage Known Servers",
"groupsOnThisServerLabel": "Groups I am in hosted on this server",
"importLocalServerSelectText": "Select Local Server",
"importLocalServerLabel": "Import a locally hosted server",
"newMessagesLabel": "New Messages",
"localeRU": "Russian \/ Русский",
"copyServerKeys": "Copy keys",
"verfiyResumeButton": "Verify\/resume",
"fileCheckingStatus": "Checking download status",
"fileInterrupted": "Interrupted",
"fileSavedTo": "Saved to",
"encryptedServerDescription": "Encrypting a server with a password protects it from other people who may also use this device. Encrypted servers cannot be decrypted, displayed or accessed until the correct password is entered to unlock them.",
"plainServerDescription": "We recommend that you protect your Cwtch servers with a password. If you do not set a password on this server then anyone who has access to this device may be able to access information about this server, including sensitive cryptographic keys.",
"deleteServerConfirmBtn": "Really delete server",
"deleteServerSuccess": "Successfully deleted server",
"enterCurrentPasswordForDeleteServer": "Please enter current password to delete this server",
"settingServersDescription": "The hosting servers experiment enables hosting and managing Cwtch servers",
"settingServers": "Hosting Servers",
"enterServerPassword": "Enter password to unlock server",
"unlockProfileTip": "Please create or unlock a profile to begin!",
"unlockServerTip": "Please create or unlock a server to begin!",
"serversManagerTitleLong": "Servers You Host",
"serverAutostartDescription": "Controls if the application will automatically launch the server on start",
"serverAutostartLabel": "Autostart",
"serverEnabled": "Server Enabled",
"serverDescriptionDescription": "Your description of the server for personal management use only, will never be shared",
"descriptionFileSharing": "The file sharing experiment allows you to send and receive files from Cwtch contacts and groups. Note that sharing a file with a group will result in members of that group connecting with you directly over Cwtch to download it.",
"settingFileSharing": "File Sharing",
"messageFileOffered": "Contact is offering to send you a file",
"messageFileSent": "You sent a file",
"messageEnableFileSharing": "Enable the file sharing experiment to view this message.",
"retrievingManifestMessage": "Retrieving file information...",
"descriptionStreamerMode": "If turned on, this option makes the app more visually private for streaming or presenting with, for example, hiding profile and contact addresses",
"streamerModeLabel": "Streamer\/Presentation Mode",
"archiveConversation": "Archive this Conversation",
"blockUnknownConnectionsEnabledDescription": "Connections from unknown contacts are blocked. You can change this in Settings",
"blockedMessageMessage": "This message is from a profile you have blocked.",
"placeholderEnterMessage": "Type a message...",
"plainProfileDescription": "We recommend that you protect your Cwtch profiles with a password. If you do not set a password on this profile then anyone who has access to this device may be able to access information about this profile, including contacts, messages and sensitive cryptographic keys.",
"encryptedProfileDescription": "Encrypting a profile with a password protects it from other people who may also use this device. Encrypted profiles cannot be decrypted, displayed or accessed until the correct password is entered to unlock them.",
"contactGoto": "Go to conversation with %1",
"settingUIColumnOptionSame": "Same as portrait mode setting",
"settingUIColumnLandscape": "UI Columns in Landscape Mode",
"settingUIColumnPortrait": "UI Columns in Portrait Mode",
"tooltipRemoveThisQuotedMessage": "Remove quoted message.",
"tooltipReplyToThisMessage": "Reply to this message",
"tooltipRejectContactRequest": "Reject this contact request",
"tooltipAcceptContactRequest": "Accept this contact request.",
"notificationNewMessageFromGroup": "New message in a group!",
"notificationNewMessageFromPeer": "New message from a contact!",
"groupInviteSettingsWarning": "You have been invited to join a group! Please enable the Group Chat Experiment in Settings to view this Invitation.",
"shutdownCwtchAction": "Shutdown Cwtch",
"shutdownCwtchDialog": "Are you sure you want to shutdown Cwtch? This will close all connections, and exit the application.",
"shutdownCwtchDialogTitle": "Shutdown Cwtch?",
"shutdownCwtchTooltip": "Shutdown Cwtch",
"malformedMessage": "Malformed message",
"profileDeleteSuccess": "Successfully deleted profile",
"debugLog": "Turn on console debug logging",
"addContactFirst": "Add or pick a contact to begin chatting.",
"createProfileToBegin": "Please create or unlock a profile to begin",
"nickChangeSuccess": "Profile nickname changed successfully",
"addServerFirst": "You need to add a server before you can create a group",
"deleteProfileSuccess": "Successfully deleted profile",
"sendInvite": "Send a contact or group invite",
"sendMessage": "Send Message",
"resetTor": "Reset",
"sendAnInvitation": "You sent an invitation for: ",
"contactSuggestion": "This is a contact suggestion for: ",
"rejected": "Rejected!",
"accepted": "Accepted!",
"chatHistoryDefault": "This conversation will be deleted when Cwtch is closed! Message history can be enabled per-conversation via the Settings menu in the upper right.",
"yesLeave": "Yes, Leave This Conversation",
"reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.",
"leaveConversation": "Leave This Conversation",
"inviteToGroup": "You have been invited to join a group:",
"titleManageServers": "Manage Servers",
"successfullAddedContact": "Successfully added ",
"descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.",
"descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.",
"descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.",
"titleManageProfiles": "Manage Cwtch Profiles",
"tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password.",
"tooltipAddContact": "Add a new contact or conversation",
"tooltipOpenSettings": "Open the settings pane",
"invalidImportString": "Invalid import string",
"conversationSettings": "Conversation Settings",
"enterCurrentPasswordForDelete": "Please enter current password to delete this profile.",
"enableGroups": "Enable Group Chat",
"todoPlaceholder": "Todo...",
"addNewItem": "Add a new item to the list",
"addListItem": "Add a New List Item",
"networkStatusConnecting": "Connecting to network and contacts...",
"networkStatusAttemptingTor": "Attempting to connect to Tor network",
"networkStatusDisconnected": "Disconnected from the internet, check your connection",
"viewGroupMembershipTooltip": "View Group Membership",
"defaultScalingText": "Default size text (scale factor:",
"builddate": "Built on: %2",
"versionTor": "Version %1 with tor %2",
"experimentsEnabled": "Enable Experiments",
"settingTheme": "Use Light Themes",
"settingInterfaceZoom": "Zoom level",
"blockUnknownLabel": "Block Unknown Contacts",
"zoomLabel": "Interface zoom (mostly affects text and button sizes)",
"versionBuilddate": "Version: %1 Built on: %2",
"error0ProfilesLoadedForPassword": "0 profiles loaded with that password",
"enterProfilePassword": "Enter a password to view your profiles",
"addNewProfileBtn": "Add new profile",
"deleteProfileConfirmBtn": "Really Delete Profile",
"deleteConfirmLabel": "Type DELETE to confirm",
"passwordChangeError": "Error changing password: Supplied password rejected",
"passwordErrorEmpty": "Password cannot be empty",
"password2Label": "Reenter password",
"yourDisplayName": "Your Display Name",
"profileOnionLabel": "Send this address to contacts you want to connect with",
"noPasswordWarning": "Not using a password on this account means that all data stored locally will not be encrypted",
"defaultProfileName": "Alice",
"profileName": "Display name",
"editProfileTitle": "Edit Profile",
"addProfileTitle": "Add new profile",
"savePeerHistoryDescription": "Determines whether to delete any history associated with the contact.",
"copiedToClipboardNotification": "Copied to Clipboard",
"puzzleGameBtn": "Puzzle Game",
"bulletinsBtn": "Bulletins",
"acceptGroupInviteLabel": "Do you want to accept the invitation to",
"peerOfflineMessage": "Contact is offline, messages can't be delivered right now",
"pendingLabel": "Pending",
"acknowledgedLabel": "Acknowledged",
"couldNotSendMsgError": "Could not send this message",
"dmTooltip": "Click to DM",
"membershipDescription": "Below is a list of users who have sent messages to the group. This list may not reflect all users who have access to the group.",
"addListItemBtn": "Add Item",
"peerNotOnline": "Contact is offline. Applications cannot be used right now.",
"searchList": "Search List",
"update": "Update",
"serverNotSynced": "Syncing New Messages (This can take some time)...",
"serverConnectivityDisconnected": "Server Disconnected",
"pasteAddressToAddContact": "Paste a cwtch address, invitation or key bundle here to add a new conversation",
"postNewBulletinLabel": "Post new bulletin",
"newBulletinLabel": "New Bulletin",
"joinGroup": "Join group",
"joinGroupTab": "Join a group"
"addPeerTab": "Contact toevoegen"
}

View File

@ -1,6 +1,11 @@
{
"@@locale": "no",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "pl",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "pt",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

367
lib/l10n/intl_pt_BR.arb Normal file
View File

@ -0,0 +1,367 @@
{
"@@locale": "pt_BR",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Português do Brasil \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "O suporte a QR Code permite o compartilhamento de dados (como identidade de perfil) através dos QR Codes",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Mostrar QR Code",
"shareProfileMenuTooltop": "Compartilhar perfil por...",
"acquiredTicketsFromServer": "Desafio anti-spam completo",
"acquiringTicketsFromServer": "Realizar o desafio anti-spam",
"errorDownloadDirectoryDoesNotExist": "O compartilhamento de arquivos não pode ser ativado porque a Pasta de Download não foi definida, ou está definida para uma pasta que não existe.",
"localeTr": "Turco \/ Türk",
"tooltipUnpinConversation": "Desafixar conversa a partir do topo de \"Conversations\"",
"tooltipPinConversation": "Fixar conversa para o topo de \"Conversations\"",
"replyingTo": "Responder para %1",
"fileDownloadUnavailable": "Este arquivo aparece indisponível para download. O remetente pode ter desativado os downloads para este arquivo.",
"messageNoReplies": "Não há respostas para esta mensagem.",
"headingReplies": "Respostas",
"viewReplies": "Ver respostas para esta mensagem",
"restartFileShare": "Iniciar compartilhamento de arquivo",
"stopSharingFile": "Parar compartilhamento de arquivo",
"manageSharedFiles": "Gerenciar arquivos compartilhados",
"tooltipPreviewFormatting": "Pré-visualização da formatação da mensagem",
"tooltipCode": "Code \/ Monoespaçado",
"tooltipStrikethrough": "Riscado",
"tooltipSubscript": "Sobrescrito",
"tooltipSuperscript": "Superescrito",
"tooltipItalicize": "Itálico",
"tooltipBackToMessageEditing": "Voltar a edição de mensagem",
"tooltipBoldText": "Negrito",
"okButton": "OK",
"settingsAndroidPowerReenablePopup": "Não é possível reativar a Otimização da Bateria de dentro da Cwtch. Favor ir para Android \/ Settings \/ Apps \/ Cwtch \/ Battery e definir o uso como 'Otimizado'",
"settingAndroidPowerExemptionDescription": "Opcional: Solicite ao Android que isente o Cwtch do gerenciamento otimizado de energia. Isto resultará em melhor estabilidade ao custo de maior uso da bateria.",
"settingAndroidPowerExemption": "Ignorar Otimização de Bateria do Android",
"thisFeatureRequiresGroupExpermientsToBeEnabled": "Esta característica requer que a experiência de grupo seja habilitada em Configurações",
"messageFormattingDescription": "Permitir a formatação de texto rico em mensagens exibidas, por exemplo **negrito** e *itálico*",
"formattingExperiment": "Formatação de mensagem",
"clickableLinkError": "Erro encontrado durante a tentativa de abrir a URL",
"clickableLinksCopy": "Copiar URL",
"clickableLinkOpen": "Abrir URL",
"clickableLinksWarning": "A abertura deste URL abrirá um aplicativo fora do Cwtch e poderá revelar metadados ou comprometer de outra forma a segurança do Cwtch. Abra somente URLs de pessoas em quem você confia. Você tem certeza de que quer continuar?",
"shuttingDownApp": "Desligando...",
"successfullyImportedProfile": "Perfil importado com sucesso: %profile",
"failedToImportProfile": "Erro ao importar perfil",
"importProfileTooltip": "Use um backup criptografado do Cwtch para trazer um perfil criado em outra instância do Cwtch.",
"importProfile": "Importar perfil",
"exportProfileTooltip": "Faça um backup deste perfil em um arquivo criptografado. O arquivo criptografado pode ser importado para outro aplicativo Cwtch.",
"exportProfile": "Exportar Perfil",
"localeDa": "Danish \/ Dansk",
"localeCy": "Welsh \/ Cymraeg",
"localeEl": "Greek \/ Ελληνικά",
"localeNo": "Norwegian \/ Norsk",
"localeLb": "Luxembourgish \/ Lëtzebuergesch",
"localeRo": "Romanian \/ Română",
"newMessageNotificationConversationInfo": "Nova mensagem de %1",
"newMessageNotificationSimple": "Nova Mensagem",
"notificationContentContactInfo": "Informações da Conversa",
"notificationContentSimpleEvent": "Evento Simples",
"conversationNotificationPolicySettingDescription": "controle de comportamento de notificação para esta conversa",
"conversationNotificationPolicySettingLabel": "Política de Notificação de Conversas",
"settingsGroupExperiments": "Experimentos",
"settingsGroupAppearance": "Aparência",
"settingGroupBehaviour": "Comportamento",
"notificationContentSettingDescription": "Controla o conteúdo das notificações de conversas",
"notificationPolicySettingDescription": "Controla o comportamento padrão de notificação do aplicativo",
"notificationContentSettingLabel": "Conteúdo da Notificação",
"notificationPolicySettingLabel": "Política de Notificação",
"conversationNotificationPolicyNever": "Nunca",
"conversationNotificationPolicyOptIn": "Optar por",
"conversationNotificationPolicyDefault": "Padrão",
"notificationPolicyDefaultAll": "Todos por padrão",
"notificationPolicyOptIn": "Optar por",
"notificationPolicyMute": "Silenciar",
"tooltipSelectACustomProfileImage": "Selecionar uma imagem de perfil personalizada",
"torSettingsEnabledCacheDescription": "Mantém em cache os dados atuais do Tor para reutilizar da próxima vez que o Cwtch for aberto. Isto permitirá que o Tor comece mais rápido. Quando desativado, o Cwtch irá eliminar os dados em cache ao iniciar.",
"torSettingsEnableCache": "Consenso de Cache do Tor",
"labelTorNetwork": "Rede Tor",
"descriptionACNCircuitInfo": "Informações detalhadas sobre o caminho que a rede de comunicação anônima está utilizando para se conectar a esta conversa.",
"labelACNCircuitInfo": "Informações do Circuito ACN",
"fileSharingSettingsDownloadFolderTooltip": "Navegue para selecionar uma pasta padrão diferente para arquivos baixados.",
"fileSharingSettingsDownloadFolderDescription": "Quando os arquivos são baixados automaticamente (por exemplo, prévias de imagem, quando as pré-visualizações de imagem estão habilitadas) é necessário um local padrão para o download destes arquivos.",
"torSettingsErrorSettingPort": "O número da porta deve ser entre 1 e 65535",
"torSettingsUseCustomTorServiceConfigurastionDescription": "Substituir a configuração padrão do Tor. Atenção: Isto pode ser perigoso. Só use isto se você souber o que está fazendo.",
"torSettingsUseCustomTorServiceConfiguration": "Use uma configuração personalizada de serviço do Tor (torrc)",
"torSettingsCustomControlPortDescription": "Use uma porta personalizada para conexões de controle para o proxy Tor",
"torSettingsCustomControlPort": "Porta de controle personalizada",
"torSettingsCustomSocksPortDescription": "Use uma porta personalizada para conexões de dados com o proxy Tor",
"torSettingsCustomSocksPort": "Porta SOCKS personalizada",
"torSettingsEnabledAdvancedDescription": "Use um serviço Tor existente em seu sistema, ou altere os parâmetros do serviço Cwtch Tor",
"torSettingsEnabledAdvanced": "Habilitar configuração avançada do Tor",
"msgAddToAccept": "Adicione esta conta a seus contatos para poder aceitar este arquivo.",
"btnSendFile": "Enviar arquivo",
"msgConfirmSend": "Você tem certeza de que deseja enviar",
"msgFileTooBig": "O tamanho do arquivo não pode exceder 10 GB",
"storageMigrationModalMessage": "Migração dos perfis para um novo formato de armazenamento. Isto pode levar alguns minutos...",
"loadingCwtch": "Carregando o Cwtch...",
"themeColorLabel": "Cor do tema",
"themeNameNeon2": "Neon2",
"themeNameNeon1": "Neon1",
"themeNameMidnight": "Meia-noite",
"themeNameMermaid": "Sereia",
"themeNamePumpkin": "Abóbora",
"themeNameGhost": "Fantasma",
"themeNameVampire": "Vampiro",
"themeNameWitch": "Bruxa",
"themeNameCwtch": "Cwtch",
"settingDownloadFolder": "Pasta para Download",
"settingImagePreviewsDescription": "Imagens e Fotos de Perfil serão baixadas e visualizadas automaticamente. Recomendamos que você não ative esta Experiência se usar Cwtch com contatos não confiáveis.",
"settingImagePreviews": "Pré-visualização de Imagens e Fotos de Perfil",
"experimentClickableLinksDescription": "O experimento de links clicáveis permite que você clique em URLs compartilhadas em mensagens",
"enableExperimentClickableLinks": "Habilitar links clicáveis",
"serverConnectionsLabel": "Conexão",
"serverTotalMessagesLabel": "Total de mensagens",
"serverMetricsLabel": "Métricas do servidor",
"manageKnownServersShort": "Servidores",
"manageKnownServersLong": "Gerenciar Servidores Conhecidos",
"displayNameTooltip": "Por favor, digite um nome de exibição",
"manageKnownServersButton": "Gerenciar Servidores Conhecidos",
"fieldDescriptionLabel": "Descrição",
"groupsOnThisServerLabel": "Grupos nos quais estou hospedado neste servidor",
"importLocalServerButton": "Importar %1",
"importLocalServerSelectText": "Selecione Servidor Local",
"importLocalServerLabel": "Importar um servidor hospedado localmente",
"newMessagesLabel": "Novas mensagens",
"localeRU": "Russian \/ Русский",
"copyServerKeys": "Copiar chaves",
"verfiyResumeButton": "Verify\/resume",
"fileCheckingStatus": "Verificando o status do download",
"fileInterrupted": "Interrompido",
"fileSavedTo": "Salvar em",
"encryptedServerDescription": "Criptografar um servidor com uma senha o protege de outras pessoas que também podem usar este dispositivo. Os servidores criptografados não podem ser descriptografados, exibidos ou acessados até que a senha correta seja inserida para desbloqueá-los.",
"plainServerDescription": "Recomendamos que você proteja seus servidores Cwtch com uma senha. Se você não definir uma senha neste servidor, qualquer pessoa que tenha acesso a este dispositivo poderá acessar informações sobre este servidor, incluindo chaves criptográficas sensíveis.",
"deleteServerConfirmBtn": "Realmente excluir servidor",
"deleteServerSuccess": "Servidor excluído com sucesso",
"enterCurrentPasswordForDeleteServer": "Por favor, digite a senha atual para excluir este servidor",
"copyAddress": "Copiar endereço",
"settingServersDescription": "A experiência com servidores de hospedagem permite hospedar e gerenciar servidores Cwtch",
"settingServers": "Servidores Hospedados",
"enterServerPassword": "Digite a senha para desbloquear o servidor",
"unlockProfileTip": "Por favor, crie ou desbloqueie um perfil para começar!",
"unlockServerTip": "Por favor, crie ou desbloqueie um servidor para começar!",
"addServerTooltip": "Adicionar novo servidor",
"serversManagerTitleShort": "Servidores",
"serversManagerTitleLong": "Servidor que você hospeda",
"saveServerButton": "Salvar servidor",
"serverAutostartDescription": "Controla se o aplicativo iniciará automaticamente o servidor no início",
"serverAutostartLabel": "Autoinício",
"serverEnabledDescription": "Iniciar ou parar servidor",
"serverEnabled": "Servidor ativado",
"serverDescriptionDescription": "Sua descrição do servidor é apenas para uso de gerenciamento pessoal, nunca será compartilhada",
"serverDescriptionLabel": "Descrição do servidor",
"serverAddress": "Endereço do servidor",
"editServerTitle": "Editar servidor",
"addServerTitle": "Adicionar servidor",
"titleManageProfilesShort": "Perfis",
"descriptionFileSharing": "O experimento de compartilhamento de arquivos permite enviar e receber arquivos de contatos e grupos do Cwtch. Note que compartilhar um arquivo com um grupo resultará em membros desse grupo conectando-se diretamente com você através do Cwtch para baixá-lo.",
"settingFileSharing": "Compartilhar arquivo",
"tooltipSendFile": "Mandar arquivo",
"messageFileOffered": "Contato está oferecendo mandar um arquivo para você",
"messageFileSent": "Você mandou um arquivo",
"messageEnableFileSharing": "Habilite o experimento de compartilhamento de arquivos para visualizar esta mensagem.",
"labelFilesize": "Tamanho",
"labelFilename": "Nome do arquivo",
"downloadFileButton": "Download",
"openFolderButton": "Abrir pasta",
"retrievingManifestMessage": "Obtendo informações do arquivo...",
"descriptionStreamerMode": "Se ativada, esta opção torna o aplicativo mais privado visualmente para streaming ou apresentação com, por exemplo, perfil e endereços de contato ocultos.",
"streamerModeLabel": "Streamer\/Modo de apresentação",
"archiveConversation": "Arquivar esta conversa",
"blockUnknownConnectionsEnabledDescription": "As conexões de contatos desconhecidos são bloqueadas. Você pode mudar isto em Configurações",
"showMessageButton": "Mostrar mensagem",
"blockedMessageMessage": "Esta mensagem é de um perfil que você bloqueou.",
"placeholderEnterMessage": "Digitar a mensagem...",
"plainProfileDescription": "Recomendamos que você proteja seus perfis Cwtch com uma senha. Se você não definir uma senha neste perfil, qualquer pessoa que tenha acesso a este dispositivo poderá acessar informações sobre este perfil, incluindo contatos, mensagens e chaves criptográficas sensíveis.",
"encryptedProfileDescription": "Criptografar um perfil com uma senha o protege de outras pessoas que também podem usar este dispositivo. Os perfis criptografados não podem ser descriptografados, exibidos ou acessados até que a senha correta seja inserida para desbloqueá-los.",
"addContactConfirm": "Adicionar contato %1",
"addContact": "Adicionar contato",
"contactGoto": "Vá para conversa com %1",
"settingUIColumnOptionSame": "O mesmo que a configuração do modo retrato",
"settingUIColumnDouble14Ratio": "Duplo (1:4)",
"settingUIColumnDouble12Ratio": "Duplo (1:2)",
"settingUIColumnSingle": "Único",
"settingUIColumnLandscape": "Colunas da interface em Modo Paisagem",
"settingUIColumnPortrait": "Colunas da interface em Modo Retrato",
"localePl": "Polish \/ Polski",
"tooltipRemoveThisQuotedMessage": "Remover mensagem mencionada",
"tooltipReplyToThisMessage": "Responder esta mensagem",
"tooltipRejectContactRequest": "Rejeitar pedido de contato",
"tooltipAcceptContactRequest": "Aceitar pedido de contato",
"notificationNewMessageFromGroup": "Nova mensagem de um grupo!",
"notificationNewMessageFromPeer": "Nova mensagem de um contato!",
"tooltipHidePassword": "Ocultar Senha",
"tooltipShowPassword": "Mostrar Senha",
"groupInviteSettingsWarning": "Você foi convidado a fazer parte de um grupo! Por favor, habilite a Experiência de Bate-papo em Grupo em Configurações para ver este convite.",
"shutdownCwtchAction": "Desligar Cwtch",
"shutdownCwtchDialog": "Você tem certeza que quer encerrar o Cwtch? Isto fechará todas as conexões, e sairá do aplicativo.",
"shutdownCwtchDialogTitle": "Desligar o Cwtch?",
"shutdownCwtchTooltip": "Desligar o Cwtch",
"malformedMessage": "Mensagem malformada",
"profileDeleteSuccess": "Perfil deletado com sucesso",
"debugLog": "Ative o console de depuração de logs",
"torNetworkStatus": "Status da rede Tor",
"addContactFirst": "Adicione ou escolha um contato para começar a conversar.",
"createProfileToBegin": "Por favor, crie ou desbloqueie um perfil para começar",
"nickChangeSuccess": "Nome do perfil alterado com sucesso",
"addServerFirst": "Você precisa adicionar um servidor antes de poder criar um grupo",
"deleteProfileSuccess": "Perfil deletado com sucesso!",
"sendInvite": "Mandar um contato ou convite de grupo",
"sendMessage": "Mandar mensagem",
"cancel": "Cancelar",
"resetTor": "Resetar",
"torStatus": "Tor Status",
"torVersion": "Versão do Tor",
"sendAnInvitation": "Você enviou um convite para: ",
"contactSuggestion": "Esta é uma sugestão de contato para: ",
"rejected": "Rejeitado!",
"accepted": "Aceito!",
"chatHistoryDefault": "Esta conversa será excluída quando o Cwtch for encerrado! O histórico de mensagens pode ser habilitado por conversa através do menu Configurações, no canto superior direito.",
"newPassword": "Nova senha",
"yesLeave": "Sim, deixa esta conversa",
"reallyLeaveThisGroupPrompt": "Você tem certeza que quer deixar esta conversa? Todas as mensagens e atributos serão apagados.",
"leaveConversation": "Deixar esta conversa",
"inviteToGroup": "Você foi convidado a se juntar a um grupo:",
"titleManageServers": "Gerenciar Servidores",
"successfullAddedContact": "Adicionado com sucesso ",
"descriptionBlockUnknownConnections": "Se ativada, esta opção fechará automaticamente as conexões dos usuários Cwtch que não tenham sido adicionadas à sua lista de contatos.",
"descriptionExperimentsGroups": "O experimento de grupo permite ao Cwtch conectar-se com uma infra-estrutura de servidor não confiável para facilitar a comunicação com mais de um contato.",
"descriptionExperiments": "Os experimentos Cwtch são opcionais, características opt-in que adicionam funcionalidades adicionais ao Cwtch que podem ter considerações de privacidade diferentes das tradicionais conversas resistentes a metadados 1:1, por exemplo, conversas em grupo, integração de bot, etc.",
"titleManageProfiles": "Gerencie perfis do Cwtch",
"tooltipUnlockProfiles": "Desbloqueie perfis criptografados digitando sua senha.",
"titleManageContacts": "Conversas",
"tooltipAddContact": "Adicionar novo contato a conversa",
"tooltipOpenSettings": "Abra o painel de ajustes",
"contactAlreadyExists": "Contato já existe",
"invalidImportString": "Importação de string inválido",
"conversationSettings": "Configurações da Conversa",
"enterCurrentPasswordForDelete": "Por favor entre sua senha atual para deletar este perfil.",
"enableGroups": "Ativar chat em grupo",
"localeIt": "Italian \/ Italiano",
"localeEs": "Spanish \/ Español",
"todoPlaceholder": "Afazer…",
"addNewItem": "Adicionar novo item à lista",
"addListItem": "Adicionar Item à Lista",
"newConnectionPaneTitle": "Nova Conexão",
"networkStatusOnline": "Online",
"networkStatusConnecting": "Conectando à rede e contatos...",
"networkStatusAttemptingTor": "Tentando conectar à rede Tor",
"networkStatusDisconnected": "Desconectado da internet, confira a sua conexão",
"viewGroupMembershipTooltip": "Ver Participação em Grupo",
"loadingTor": "Carregando Tor...",
"smallTextLabel": "Pequeno",
"defaultScalingText": "Texto tamanho padrão (fator de escala: ",
"builddate": "Construído em: %2",
"version": "Versão %1",
"versionTor": "Versão %1 com Tor %2",
"experimentsEnabled": "Ativar experimentos",
"themeDark": "Escuro",
"themeLight": "Claro",
"settingTheme": "Use temas claros",
"largeTextLabel": "Grande",
"settingInterfaceZoom": "Nível de zoom",
"localeDe": "Alemao \/ Deutsch",
"localePt": "Portuguese \/ Portuguesa",
"localeFr": "French \/ Français",
"localeEn": "English \/ English",
"settingLanguage": "Linguagem",
"blockUnknownLabel": "Bloquear Contatos Desconhecidos",
"zoomLabel": "Zoom da interface (afeta principalmente tamanho de texto e botões)",
"versionBuilddate": "Versão: %1 Construído em: %2",
"cwtchSettingsTitle": "Configurações do Cwtch",
"unlock": "Desbloquear",
"yourServers": "Seus servidores",
"yourProfiles": "Seus perfis",
"error0ProfilesLoadedForPassword": "0 perfis carregados com esta senha",
"password": "Senha",
"enterProfilePassword": "Coloque uma senha para ver seus perfis",
"addNewProfileBtn": "Adicionar novo perfil",
"deleteConfirmText": "DELETE",
"deleteProfileConfirmBtn": "Realmente deletar o perfil",
"deleteConfirmLabel": "digite DELETE para confirmar",
"deleteProfileBtn": "Deletar Perfil",
"passwordChangeError": "Erro ao mudar a senha: senha fornecida rejeitada",
"passwordErrorMatch": "Senhas não são iguais",
"saveProfileBtn": "Salvar Perfil",
"createProfileBtn": "Criar Perfil",
"passwordErrorEmpty": "Senha não pode ser vazia",
"password2Label": "Recoloque a senha",
"password1Label": "Senha",
"currentPasswordLabel": "Senha Atual",
"yourDisplayName": "Seu nome de exibição",
"profileOnionLabel": "Send this address to contacts you want to connect with",
"noPasswordWarning": "Não usar uma senha nesta conta significa que todos os dados armazenados localmente não serão criptografados",
"radioNoPassword": "Descriptografado (Sem senha)",
"radioUsePassword": "Senha",
"editProfile": "Editar Perfil",
"newProfile": "Novo Perfil",
"defaultProfileName": "Alice",
"profileName": "Nome de exibição",
"editProfileTitle": "Editar perfil",
"addProfileTitle": "Adicionar novo perfil",
"deleteBtn": "Delete",
"unblockBtn": "Desbloquear Contato",
"dontSavePeerHistory": "Deletar histórico",
"savePeerHistoryDescription": "Determina se deve excluir algum histórico associado com o contato.",
"savePeerHistory": "Salvar histórico",
"blockBtn": "Bloquear Contato",
"saveBtn": "Save",
"displayNameLabel": "Nome de Exibição",
"copiedToClipboardNotification": "Copiado",
"addressLabel": "Endereço",
"puzzleGameBtn": "Jogo de Adivinhação",
"bulletinsBtn": "Boletins",
"listsBtn": "Listas",
"chatBtn": "Chat",
"rejectGroupBtn": "Recusar",
"acceptGroupBtn": "Aceitar",
"acceptGroupInviteLabel": "Você quer aceitar o convite para",
"newGroupBtn": "Criar novo grupo",
"copyBtn": "Copiar",
"peerOfflineMessage": "Contato está off-line, mensagens não podem ser entregues agora.",
"peerBlockedMessage": "Contato está bloquado",
"pendingLabel": "Pendente",
"acknowledgedLabel": "Confirmada",
"couldNotSendMsgError": "Não deu para enviar esta mensagem",
"dmTooltip": "Clique para DM",
"membershipDescription": "A lista abaixo é de usuários que enviaram mensagens ao grupo. Essa lista pode não refletir todos os usuários que têm acesso ao grupo.",
"addListItemBtn": "Adicionar Item",
"peerNotOnline": "Contato está off-line. Não pode receber mensagens agora.",
"searchList": "Lista de Pesquisa",
"update": "Atualizar",
"inviteBtn": "Convidar",
"inviteToGroupLabel": "Convidar ao grupo",
"groupNameLabel": "Nome do Grupo",
"viewServerInfo": "Server Info",
"serverNotSynced": "Sincronizando novas mensagens (Isto pode levar um tempo)...",
"serverSynced": "Sincronizado",
"serverConnectivityDisconnected": "Servidor Desconectado",
"serverConnectivityConnected": "Servidor Conectado",
"serverInfo": "Informação do Servidor",
"invitationLabel": "Convite",
"serverLabel": "Server",
"search": "Pesquisar...",
"blocked": "Bloqueado",
"pasteAddressToAddContact": "… cole um endereço aqui para adicionar um contato…",
"titlePlaceholder": "título…",
"postNewBulletinLabel": "Postar novo boletim",
"newBulletinLabel": "Novo Boletim",
"joinGroup": "Entrar no grupo",
"createGroup": "Criar grupo",
"addPeer": "Adicionar Contato",
"groupAddr": "Endereços",
"invitation": "Convite",
"server": "Servidor",
"peerName": "Nome",
"peerAddress": "Endereço",
"joinGroupTab": "Juntar-se a um grupo",
"createGroupTab": "Criar um grupo",
"addPeerTab": "Adicionar um contato",
"createGroupBtn": "Criar",
"defaultGroupName": "Grupo incrível",
"createGroupTitle": "Criar Grupo"
}

View File

@ -1,6 +1,11 @@
{
"@@locale": "ro",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

View File

@ -1,6 +1,11 @@
{
"@@locale": "ru",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",

366
lib/l10n/intl_sk.arb Normal file
View File

@ -0,0 +1,366 @@
{
"@@locale": "sk",
"@@last_modified": "2023-05-0T21:06:07+01:00",
"profileEnabledDescription": "Spustiť alebo zastaviť profil",
"profileAutostartDescription": "Ovláda či bude profil automaticky spustený pri štarte",
"profileEnabled": "Povoliť",
"profileAutostartLabel": "Spúšťať spoločne zo systémom",
"localePtBr": "Brazílska Portugalčina \/ Português do Brasil",
"localeNl": "Holandsky \/ Dutch",
"experimentQRCodeDescription": "QR Kód podpora povoluje zdielanie dát (ako na príklad identitu profilu) pomocou QR Kódou",
"enableExperimentQRCode": "QR Kódy",
"shareMenuQRCode": "Ukázať QR Kód",
"shareProfileMenuTooltop": "Zdielať profil skrz...",
"acquiredTicketsFromServer": "Antispam Challenge Dokončená",
"acquiringTicketsFromServer": "Vykonávam Antispam Challenge",
"errorDownloadDirectoryDoesNotExist": "Zdielanie súborov nemôže byť povolené pretože zložka Stiahnuté nebola vybraná, alebo ukazuje na neexistujúcu zložku.",
"localeIt": "Taliansky \/ Italiano",
"localeTr": "Turecky \/ Türk",
"tooltipUnpinConversation": "Unpinnúť konverzáciu z vrchu \"Konverzácií\"",
"tooltipPinConversation": "Pinnúť konverzáciu na vrchol\"Konverzácií\"",
"replyingTo": "Odpovedá %1",
"fileDownloadUnavailable": "Zdá sa že súbor je nedostupný. Odosielateľ mohol vypnúť sťahovanie pre tento súbor.",
"messageNoReplies": "Pre túto správu sa nenašli žiadne odpovede.",
"headingReplies": "Odpovede",
"viewReplies": "Zobraziť odpovede pre túto správu",
"restartFileShare": "Začať Zdielať Súbor",
"stopSharingFile": "Zastaviť Zdielanie Súboru",
"manageSharedFiles": "Spravovať Zdielané Súbory",
"localeDe": "Nemecky \/ Deutsch",
"localeEn": "Anglicky \/ English",
"localeLb": "Luxembursky \/ Lëtzebuergesch",
"localeNo": "Nórsky \/ Norsk",
"localeEl": "Grécky\/ Ελληνικά",
"localePl": "Polsky \/ Polski",
"localeRo": "Rumunsky \/ Română",
"localeRU": "Rusky \/ Русский",
"localeEs": "Španielsky \/ Español",
"localeDa": "Dánsky \/ Dansk",
"localePt": "Portugalsky \/ Portuguesa",
"localeFr": "Francúzsky \/ Français",
"localeCy": "Velšsky \/ Cymraeg",
"settingImagePreviewsDescription": "Obrázky a profilovky budú sťahované a zobrazované automaticky. Odporúčame aby ste tento experiment nezapínali v prípade že používate Cwtch s kontaktmi ktorým nedôverujete.",
"tooltipPreviewFormatting": "Zobrazovať Formátovanie Správy v Reálnom Čase",
"tooltipCode": "Kód \/ Monospace",
"tooltipStrikethrough": "Prečiarknuté",
"tooltipSubscript": "Index",
"tooltipSuperscript": "Horný index",
"tooltipItalicize": "Naklonené písmo",
"tooltipBackToMessageEditing": "Späť k Editovaniu Správy",
"tooltipBoldText": "Hrubé písmo",
"okButton": "OK",
"settingsAndroidPowerReenablePopup": "Nedokážem vrátiť Optimalizáciu Batérie do pôvodného stavu skrz Cwtch. Prosím choďte do Android \/ Nastavenia \/ Aplikácie\/ Cwtch \/ Batéria a nastavte Využitie na 'Optimalizovať'",
"settingAndroidPowerExemptionDescription": "Dobrovoľné: Požiadať Android o neoptimalizovanie energie pre Cwtch. Bude to mať za následok vyššiu spotrebu batérie.",
"settingAndroidPowerExemption": "Ignorovanie Optimalizácie Batérie pre Android"
"thisFeatureRequiresGroupExpermientsToBeEnabled": "Táto funkcia vyžaduje aby Experiment Skupiny bol povolený v Nastaveniach",
"messageFormattingDescription": "Povoliť rozšírené formátovanie textu v zobrazovaných správach. Na príklad: **hrubé** a *naklonené písmo*",
"formattingExperiment": "Formátovanie Správy",
"clickableLinkError": "Chyba pri otváraní linku" ,
"clickableLinksWarning": "Otvorením tohoto linku sa spustí aplikácia mimo Cwtch, ktorá môže odhaliť metadáta alebo iným spôsobom ohroziť bezpečnosť Cwtch. Otvárajte linky iba od ľudí ktorým veríte. Ste si istý že chcete pokračovať?",
"clickableLinksCopy": "Kopírovať link",
"clickableLinkOpen": "Otvoriť link",
"shuttingDownApp": "Vypínam...",
"successfullyImportedProfile": "Úspešne Importovaný Profil: %profile",
"failedToImportProfile": "Chyba Pri Importovaní Profilu",
"importProfileTooltip": "Použiť šifrovanú Cwtch zálohu pre importovanie profilu vytvoreného na inej instancii Cwtch.",
"importProfile": "Importovať Profil",
"exportProfileTooltip": "Zálohovať tento profil do šifrovaného súboru. Tento šifrovaný profil môže byť importovaný do inej Cwtch instancie.",
"exportProfile": "Exportovať Profil",
"conversationNotificationPolicySettingDescription": "Ovládať správanie notifikácií pre túto konverzáciu",
"newMessageNotificationConversationInfo": "Nová Správa Od %1",
"newMessageNotificationSimple": "Nová Správa",
"notificationContentContactInfo": "Informácie o Konverzácii",
"notificationContentSimpleEvent": "Obyčajná Udalosť",
"conversationNotificationPolicySettingLabel": "Pravidlá pre notifikácie konverzácií",
"settingsGroupExperiments": "Experimenty",
"settingsGroupAppearance": "Vzhľad",
"settingGroupBehaviour": "Správanie",
"notificationContentSettingDescription": "Ovláda obsah notifikácií konverzácie",
"notificationPolicySettingDescription": "Ovláda predvolené správanie notifikácií aplikácie",
"notificationContentSettingLabel": "Obsah notifikácií",
"notificationPolicySettingLabel": "Pravidlá pre notifikácie",
"conversationNotificationPolicyNever": "Nikdy",
"conversationNotificationPolicyOptIn": "Opt In",
"conversationNotificationPolicyDefault": "Predvolené",
"notificationPolicyDefaultAll": "Vrátiť Všetko na Predvolené",
"notificationPolicyOptIn": "Opt In",
"notificationPolicyMute": "Stlmiť konverzáciu",
"tooltipSelectACustomProfileImage": "Vybrať Vlastnú Profilovú Fotku",
"editProfile": "Upraviť Profil",
"torSettingsEnabledCacheDescription": "Ukladať aktuálny Tor consensus pre opätovné využitie pri ďalšom otvorení Cwtch. Toto umožní Toru spúštať sa rýchlejšie. Ak je toto nastavenie vypnuté, Cwtch sa zbaví uložených dát pri každom štarte.",
"torSettingsEnableCache": "Ukladať Tor Consensus",
"labelTorNetwork": "Sieť Tor",
"descriptionACNCircuitInfo": "Detailné informácie o ceste ktorú využíva anonymná komunikačná sieť cez ktorú ste pripojený k tejto konverzácii.",
"labelACNCircuitInfo": "Informácie o ACN Circuit",
"fileSharingSettingsDownloadFolderTooltip": "Vybrať inú predvolenú zložku pre stiahnuté súbory.",
"fileSharingSettingsDownloadFolderDescription": "Keď sú súbory sťahované automaticky (Na príklad: obrázky, ktorých náhľady sú povolené), je potrebná predvolená zložka pre ich Stiahnutie.",
"torSettingsErrorSettingPort": "Číslo Portu musí byť medzi 1 a 65535",
"settingTheme": "Použiť Svetlý Režim", "torSettingsUseCustomTorServiceConfiguration": "Použiť vlastnú Konfiguráciu Služby Tor (torrc)",
"torSettingsUseCustomTorServiceConfigurastionDescription": "Prepísať predvolenú tor konfiguráciu. Pozor: Tento úkon môže byť nebezpečný. Zapnite toto nastavenie iba ak viete čo robíte.",
"torSettingsCustomControlPortDescription": "Použiť vlastný port pre ovládanie pripojení k Tor proxy",
"torSettingsCustomControlPort": "Iný Control Port",
"torSettingsCustomSocksPortDescription": "Použiť iný port pre dátové pripojenia k Tor proxy",
"torSettingsCustomSocksPort": "Vlastný SOCKS Port",
"torSettingsEnabledAdvancedDescription": "Použiť Tor službu na vašom systéme, alebo zmeniť parametre Cwtch Tor Služby",
"torSettingsEnabledAdvanced": "Povoliť Rozšírenú Konfiguráciu Tor",
"msgAddToAccept": "Pridajte užívatela do kontaktov aby ste mohli prijať tento súbor.",
"btnSendFile": "Odoslať Súbor",
"msgConfirmSend": "Ste si istý že chcete poslať",
"msgFileTooBig": "Veľkosť súboru nemôže presiahnuť 10 GB",
"storageMigrationModalMessage": "Prenášam profily do nového formátu. Môže to potrvať niekoľko minút...",
"loadingCwtch": "Načítavam Cwtch...",
"themeColorLabel": "Farebný Motív",
"themeNameNeon2": "Neón2",
"themeNameNeon1": "Neón1",
"themeNameMidnight": "Polnoc",
"themeNameMermaid": "Morská víla",
"themeNamePumpkin": "Tekvica",
"themeNameGhost": "Duch",
"themeNameVampire": "Upír",
"themeNameWitch": "Čarodejnica",
"themeNameCwtch": "Cwtch",
"settingDownloadFolder": "Zložka Stiahnuté",
"settingImagePreviews": "Náhľady Obrázkou a Profilové Obrázky",
"experimentClickableLinksDescription": "Experiment kliknutie na linky vám dovoluje kliknúť na link zdielaný v správach",
"enableExperimentClickableLinks": "Povoliť Kliknutie na Linky",
"serverConnectionsLabel": "Spojenie",
"serverTotalMessagesLabel": "Všetky Správy",
"serverMetricsLabel": "Štatistiky Serveru",
"manageKnownServersShort": "Servery",
"manageKnownServersLong": "Spravovať Známe Servery",
"displayNameTooltip": "Prosím zadajte zobrazované meno",
"manageKnownServersButton": "Spravovať Známe Servery",
"fieldDescriptionLabel": "Popis",
"groupsOnThisServerLabel": "Skupiny ktorých som členom a sú hostované na tomto servery",
"importLocalServerButton": "Importovať %1",
"importLocalServerSelectText": "Zvoliť Lokálny Server",
"importLocalServerLabel": "Importovať lokálne hostovaný server",
"savePeerHistoryDescription": "Určuje či vymazať všetku históriu spojenú s kontaktom",
"newMessagesLabel": "Nové správy",
"copyServerKeys": "Kopírovať klúče",
"verfiyResumeButton": "Overiť\/Pokračovať",
"fileCheckingStatus": "Kontrolujem stav sťahovania",
"fileInterrupted": "Prerušené",
"fileSavedTo": "Uložené do",
"plainServerDescription": "Odporúčame aby ste si ochránili Cwtch servery heslom. Ak si na servery nenastavíte heslo, každý s prístupom k tomuto zariadeniu bude schopný vidieť informácie o danom servry, vrátane citlivých kryptografických klúčov.",
"encryptedServerDescription": "Šifrovanie serveru heslom ho chráni pred ostatnými ľuďmi ktorý by mohli toto zariadenie využívať taktiež. Šifrované servery sa nedajú odšifrovať, zobraziť alebo sprístupniť pokiaľ nie je zadané správne heslo.",
"deleteServerConfirmBtn": "Vážne vymazať server?",
"deleteServerSuccess": "Server bol úspešne vymazaný",
"enterCurrentPasswordForDeleteServer": "Prosím zadajte aktuálne heslo pre zmazanie tohoto serveru",
"copyAddress": "Kopírovať Adresu",
"settingServersDescription": "Experiment hostovanie serverov povoluje hostovanie a správu Cwtch serverov",
"settingServers": "Hostujúce Servery",
"enterServerPassword": "Zadajte heslo pre odomknutie serveru",
"unlockProfileTip": "Na začiatok si prosím vytvorte alebo odomknite profil!",
"unlockServerTip": "Prosím vytvorte alebo odomknite server pre začatie!",
"addServerTooltip": "Pridať nový server",
"serversManagerTitleShort": "Servery",
"serversManagerTitleLong": "Servery Ktoré Hostujete",
"saveServerButton": "Uložiť Server",
"serverAutostartDescription": "Ovláda či aplikácia automaticky spustí server pri štarte",
"serverAutostartLabel": "Automaticky spúštať",
"serverEnabledDescription": "Spustiť alebo zastaviť server",
"serverEnabled": "Server Povolený",
"serverDescriptionDescription": "Váš lokálny popis tohoto servera. Nebude nikde zdielaný.",
"serverDescriptionLabel": "Popis Servera",
"serverAddress": "Adresa Servera",
"editServerTitle": "Upraviť Server",
"addServerTitle": "Pridať Server",
"titleManageProfilesShort": "Profily",
"descriptionStreamerMode": "Po zapnutí toto nastavenie urobí aplikáciu vizuálne súkromejšou. Na príklad: zakrije niektoré položky, ako profil a adresy kontaktov ",
"descriptionFileSharing": "Experiment zdielanie súborov vám umožňuje odosielať a príjmať súbory od Cwtch kontaktov a skupín. Majte na pamäti že zdielanie súboru zo skupinou znamená priame spojenie s členmy skupiny, aby súbor mohli stiahnuť.",
"settingFileSharing": "Zdielanie Súborov",
"tooltipSendFile": "Poslať Súbor",
"messageFileOffered": "Kontakt vám chce poslať súbor",
"messageFileSent": "Poslali ste súbor",
"messageEnableFileSharing": "Povolte experiment zdielanie súborov pre zobrazenie tejto správy.",
"labelFilesize": "Veľkosť",
"labelFilename": "Meno súboru",
"downloadFileButton": "Stiahnuť",
"openFolderButton": "Otvoriť Zložku",
"retrievingManifestMessage": "Získavam informácie o súbore...",
"streamerModeLabel": "Streamer\/Prezentačný Mód",
"archiveConversation": "Archivovať túto konverzáciu",
"profileOnionLabel": "Poslať túto adresu ľuďom s ktorými sa chcete spojiť",
"addPeerTab": "Pridať kontakt",
"addPeer": "Pridať Kontakt",
"peerNotOnline": "Kontakt je offline. Aplikácie nemôžu byť momentálne použité.",
"peerBlockedMessage": "Kontakt je zablokovaný",
"peerOfflineMessage": "Kontakt je offline. Správý nemôžu byť doručené",
"blockBtn": "Zablokovať Kontakt",
"savePeerHistory": "Uložiť Históriu",
"dontSavePeerHistory": "Vymazať Históriu",
"unblockBtn": "Odblokovať Kontakt",
"blockUnknownLabel": "Zablokovať Neznáme Kontakty",
"blockUnknownConnectionsEnabledDescription": "Spojenia od neznámich kontaktov sú zablokované. Môžete to zmeniť v nastaveniach",
"networkStatusConnecting": "Pripájam sa k sieti a kontaktom...",
"showMessageButton": "Ukázať Správu",
"blockedMessageMessage": "Táto správa je od profilu ktorý ste zablokovali.",
"placeholderEnterMessage": "Napísať správu...",
"plainProfileDescription": "Odporúčame aby ste si ochránili Cwtch profily heslom. Ak si na profile nenastavíte heslo, každý s prístupom k tomuto zariadeniu bude schopný vidieť informácie o danom profile, jeho kontakty, odoslané správy a citlivé kryptografické klúče.",
"encryptedProfileDescription": "Šifrovanie profilu heslom ho chráni pred ostatnými ľuďmi ktorí by mohli taktiež používať toto zariadenie. Šifrované profily nemôžu byť dešífrované, zobrazené alebo sprístupnené pokiaľ nie je zadané správne heslo.",
"addContactConfirm": "Pridať kontakt %1",
"addContact": "Pridať kontakt",
"contactGoto": "Prejsť ku konverzácii s %1",
"settingUIColumnOptionSame": "Rovnaké ako nastavenie portrétového režimu",
"settingUIColumnDouble14Ratio": "Dvojité (1:4)",
"settingUIColumnDouble12Ratio": "Dvojité(1:2)",
"settingUIColumnSingle": "Jeden",
"settingUIColumnLandscape": "UI Stĺpiky v Móde na Šírku",
"settingUIColumnPortrait": "UI Stĺpiky v Režime na Výšku",
"tooltipRemoveThisQuotedMessage": "Odstrániť citovanú správu",
"tooltipReplyToThisMessage": "Odpovedať na túto správu",
"tooltipRejectContactRequest": "Odmietnuť túto žiadosť o kontakt",
"tooltipAcceptContactRequest": "Príjmuť túto žiadosť o kontakt.",
"notificationNewMessageFromGroup": "Nová správa v skupine!",
"notificationNewMessageFromPeer": "Nová správa od kontaktu!",
"tooltipHidePassword": "Skryť Heslo",
"tooltipShowPassword": "Zobraziť Heslo",
"serverNotSynced": "Synchronizujem nové správy (Môže to chvíľu trvať)...",
"groupInviteSettingsWarning": "Boli ste pozvaný do skupiny! Prosím povolte Experiment Skupinový Chat v Nastaveniach pre zobrazenie tejto Pozvánky.",
"shutdownCwtchAction": "Vypnúť Cwtch",
"shutdownCwtchDialog": "Ste si istý že chcete vypnúť Cwtch? Všetky spojenia budú ukončené a aplikácia sa zatvory.",
"shutdownCwtchDialogTitle": "Vypnúť Cwtch?",
"shutdownCwtchTooltip": "Vypnúť Cwtch",
"malformedMessage": "Poškodená správa",
"profileDeleteSuccess": "Profil bol úspešne vymazaný",
"debugLog": "Zapnúť console debug logging",
"torNetworkStatus": "Status siete Tor",
"addContactFirst": "Pridaje alebo vyberte kontakt pre začatie chatu.",
"createProfileToBegin": "Prosím vytvorte alebo odomknite profil",
"nickChangeSuccess": "Meno profilu úspešne zmenené",
"addServerFirst": "Musíte pridať server pred tým ako môžete vytvoriť skupinu",
"deleteProfileSuccess": "Profil úspešne vymazaný",
"sendInvite": "Poslať kontakt alebo skupinovú pozvánku",
"sendMessage": "Poslať Správu",
"cancel": "Zrušiť",
"resetTor": "Resetovať",
"torStatus": "Tor Status",
"torVersion": "Tor Verzia",
"sendAnInvitation": "Poslali ste pozvánku k: ",
"contactSuggestion": "Toto je návrh kontantu pre:",
"rejected": "Zamietnuté!",
"accepted": "Akceptované!",
"chatHistoryDefault": "Táto konverzácia bude vymazaná po zavretí Cwtch! História správ môže byť povolená pre každý kontakt zvlášť v menu Nastavení v pravom hornom rohu.",
"newPassword": "Nové Heslo",
"yesLeave": "Áno, Opustiť Túto Konverzáciu",
"reallyLeaveThisGroupPrompt": "Ste si istý že chcete opustiť túto konverzáciu? Všetky správy a atribúty budú vymazané.",
"leaveConversation": "Opustiť Túto Konverzáciu",
"inviteToGroup": "Boli ste pozvaný do skupiny:",
"pasteAddressToAddContact": "Paste a cwtch address, invitation or key bundle here to add a new conversation Vložte cwtch adresu, pozvánku alebo key bundle pre pridanie novej konverzácie",
"tooltipAddContact": "Pridať nový kontakt alebo konverzáciu",
"titleManageContacts": "Konverzácie",
"titleManageServers": "Spravovať Servery",
"successfullAddedContact": "Úspešne pridané",
"descriptionBlockUnknownConnections": "Ak zapnuté, toto nastavenie automaticky zavrie spojenia od Cwtch užívateľov ktorých ste nepridali do listu kontaktov.",
"descriptionExperimentsGroups": "Experiment skupiny umožnuje Cwtch spojenie s nedôveryhodnou severovou infraštruktúrou aby mohol naviazať spojenie s viac ako jedným kontaktom.",
"descriptionExperiments": "Cwtch experimenty sú dobrovoľné, opt-in funkcie ktoré pridávajú Cwtch funkcionalitu pri ktorej nie je súkromie na prvom mieste, tak ako u 1:1 metadátam odolných chatou. Na príklad: skupinový chat, integrácia botou, atď.",
"titleManageProfiles": "Spravovať Cwtch Profily",
"tooltipUnlockProfiles": "Otvoriť šifrované profily zadaním ich hesla",
"tooltipOpenSettings": "Otvoriť panel nastavení",
"invalidImportString": "Nesprávna adresa",
"contactAlreadyExists": "Kontakt Už Existuje",
"conversationSettings": " Nastavenia Konverzácie",
"enterCurrentPasswordForDelete": "Prosím zadajte heslo pre vymazanie profilu.",
"enableGroups": "Povoliť Skupinový Chat",
"experimentsEnabled": "Povoliť Experimenty",
"addListItem": "Pridať novú položku",
"addNewItem": "Pridať novú položku do zoznamu",
"todoPlaceholder": "Urobiť neskôr...",
"newConnectionPaneTitle": "Nové Spojenie",
"networkStatusOnline": "Online",
"networkStatusAttemptingTor": "Pokúšam sa spojiť s Tor sieťou",
"networkStatusDisconnected": "Žiadny prístup na internet, skontrolujte vaše spojenie.",
"viewGroupMembershipTooltip": "Zobraziť Členstvo v Skupine",
"loadingTor": "Načítavam tor...",
"smallTextLabel": "Malé",
"defaultScalingText": "Predvolená veľkosť textu (mierka):",
"builddate": "Vyrobené: %2",
"version": "Verzia %1",
"versionTor": "Verzia %1 s tor %2",
"themeDark": "Tmavá",
"themeLight": "Svetlá",
"largeTextLabel": "Veľké",
"settingInterfaceZoom": " Úroveň priblíženia",
"settingLanguage": "Jazyk",
"zoomLabel": "Priblíženie užívateľského prostredia (ovplyvňuje hlavne veľkosť textu a tlačidiel)",
"versionBuilddate": "Verzia: %1 Vyrobené: %2",
"cwtchSettingsTitle": "Cwtch Nastavenia",
"unlock": "Odomknúť",
"yourServers": "Vaše Servery",
"yourProfiles": "Vaše Profily",
"error0ProfilesLoadedForPassword": "0 načítaných profilov s tým heslom",
"password": "Heslo",
"enterProfilePassword": "Zadajte heslo k zobrazeniu vašich profilov",
"addNewProfileBtn": "Pridať nový profil",
"deleteConfirmText": "VYMAZAT",
"deleteProfileConfirmBtn": "Skutočne Vymazať Profil",
"deleteConfirmLabel": "Napíšte VYMAZAT pre potvrdenie",
"deleteProfileBtn": "Vymazať Profil",
"passwordChangeError": "Chyba pri zmene hesla: Vložené heslo bolo odmietnuté",
"passwordErrorMatch": "Heslá sa nezhodujú",
"saveProfileBtn": "Uložiť Profil",
"createProfileBtn": "Vytvoriť Profil",
"passwordErrorEmpty": "Heslo nemôže byť prázdne",
"password2Label": "Znovu zadajte heslo",
"password1Label": "Heslo",
"currentPasswordLabel": "Aktuálne Heslo",
"yourDisplayName": "Vaše Zobrazované Meno",
"noPasswordWarning": "Nepoužitie hesla na tomto účte znamená, že všetky dáta uložené lokálne nebudú šifrované",
"radioNoPassword": "Nešifrované (Žiadne heslo)",
"radioUsePassword": "Heslo",
"newProfile": "Nový Profil",
"defaultProfileName": "Alice",
"profileName": "Zobrazované Meno",
"editProfileTitle": "Upraviť Profil",
"addProfileTitle": "Pridať nový profil",
"deleteBtn": " Vymazať",
"saveBtn": "Uložiť",
"displayNameLabel": "Zobrazované Meno",
"copiedToClipboardNotification": "Skopírované do Schránky",
"addressLabel": "Adresa",
"puzzleGameBtn": "Puzzle Hra",
"bulletinsBtn": "Bulletiny",
"listsBtn": "Zoznamy",
"chatBtn": "Chat",
"rejectGroupBtn": "Odmietnuť",
"acceptGroupBtn": "Prijať",
"acceptGroupInviteLabel": "Chcete prijať pozvánku do",
"newGroupBtn": "Vytvoriť novú skupinu",
"copyBtn": "Kopírovať",
"pendingLabel": "Čaká sa",
"acknowledgedLabel": "Potvrdené",
"couldNotSendMsgError": "Správa nemohla byť odoslaná",
"dmTooltip": "Klikni pre poslanie priamej správy",
"membershipDescription": "Dole je list užívateľov ktorý do skupiny poslali správy. List nemusí zobrazovať všetkých užívateľov ktorý majú ku skupine prístup.",
"addListItemBtn": "Pridať Položku",
"searchList": "Hľadať v Zozname",
"update": "Aktualizovať",
"inviteBtn": "Pozvať",
"inviteToGroupLabel": "Pozvať do skupiny",
"groupNameLabel": "Meno skupiny",
"viewServerInfo": "Informácie o Servery",
"serverSynced": "Synchronizované",
"serverConnectivityDisconnected": "Server Odpojený",
"serverConnectivityConnected": "Server Pripojený",
"serverInfo": "Informácie o Servery",
"invitationLabel": "Pozvánka",
"serverLabel": "Server",
"search": "Vyhľadať...",
"blocked": "Zablokované",
"titlePlaceholder": "názov...",
"postNewBulletinLabel": "Poslať nový bulletin",
"newBulletinLabel": "Nový Bulletin",
"joinGroup": "Pripojiť sa k skupine",
"createGroup": "Vytvoriť skupinu",
"groupAddr": "Adresa",
"invitation": "Pozvánka",
"server": "Server",
"peerName": "Meno",
"peerAddress": "Adresa",
"joinGroupTab": "Pripojiť sa k skupine",
"createGroupTab": "Vytvoriť skupinu",
"createGroupBtn": " Vytvoriť",
"defaultGroupName": "Úžasná Skupina",
"createGroupTitle": "Vytvoriť Skupinu"
}

View File

@ -1,13 +1,18 @@
{
"@@locale": "tr",
"@@last_modified": "2022-09-10T17:07:27+02:00",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Show QR Code",
"shareProfileMenuTooltop": "Share profile via...",
"acquiredTicketsFromServer": "Antispam Challenge Complete",
"acquiringTicketsFromServer": "Performing Antispam Challenge",
"@@last_modified": "2022-12-05T21:06:07+01:00",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brezilya Portekizcesi \/ Português do Brasil",
"experimentQRCodeDescription": "QR Kod desteği profil kimliği gibi verilerin QR Kodla paylaşılmasına olanak tanır",
"acquiringTicketsFromServer": "Spame Karşı Sınama",
"acquiredTicketsFromServer": "Spame Karşı Sınama Tamamlandı",
"shareProfileMenuTooltop": "Profili paylaş...",
"shareMenuQRCode": "QR Kodunu Göster",
"enableExperimentQRCode": "QR Kodları",
"localeNl": "Flemenkçe \/ Dutch",
"errorDownloadDirectoryDoesNotExist": "İndirilenler Klasörü ayarlanmadığı veya mevcut olmayan bir klasöre ayarlandığı için dosya paylaşımı etkinleştirilemiyor.",
"radioNoPassword": "Şifrelenmemiş (Parola yok)",
"msgAddToAccept": "Dosyayı kabul etmek için bu hesabı kişilerinize ekleyin.",

View File

@ -43,7 +43,7 @@ Future<void> main() async {
LicenseRegistry.addLicense(() => licenses());
WidgetsFlutterBinding.ensureInitialized();
print("runApp()");
runApp(Flwtch());
return runApp(Flwtch());
}
class Flwtch extends StatefulWidget {
@ -64,13 +64,20 @@ class FlwtchState extends State<Flwtch> with WindowListener {
final GlobalKey<NavigatorState> navKey = GlobalKey<NavigatorState>();
Future<dynamic> shutdownDirect(MethodCall call) async {
print(call);
EnvironmentConfig.debugLog("$call");
await cwtch.Shutdown();
return Future.value({});
}
@override
initState() {
globalSettings = Settings(Locale("en", ''), CwtchDark());
globalErrorHandler = ErrorHandler();
globalTorStatus = TorStatus();
globalAppState = AppState();
globalServersList = ServerListState();
print("initState: running...");
windowManager.addListener(this);
super.initState();
@ -123,6 +130,7 @@ class FlwtchState extends State<Flwtch> with WindowListener {
key: Key('app'),
navigatorKey: navKey,
locale: settings.locale,
showPerformanceOverlay: false,
localizationsDelegates: <LocalizationsDelegate<dynamic>>[
AppLocalizations.delegate,
MaterialLocalizationDelegate(),
@ -186,16 +194,17 @@ class FlwtchState extends State<Flwtch> with WindowListener {
Future<void> shutdown() async {
globalAppState.SetModalState(ModalState.shutdown);
EnvironmentConfig.debugLog("shutting down");
await cwtch.Shutdown();
// Wait a few seconds as shutting down things takes a little time..
Future.delayed(Duration(seconds: 1)).then((value) {
{
if (Platform.isAndroid) {
SystemNavigator.pop();
} else if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) {
print("Exiting...");
exit(0);
}
});
};
}
// Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt
@ -241,6 +250,9 @@ class FlwtchState extends State<Flwtch> with WindowListener {
transitionDuration: Duration(milliseconds: 200),
),
);
// On Gnome follows up a clicked notification with a "Cwtch is ready" notification that takes you to the app. AFAICT just because Gnome is bad
// https://askubuntu.com/questions/1286206/how-to-skip-the-is-ready-notification-and-directly-open-apps-in-ubuntu-20-4
windowManager.focus();
}
// using windowManager flutter plugin until proper lifecycle management lands in desktop
@ -256,9 +268,9 @@ class FlwtchState extends State<Flwtch> with WindowListener {
}
@override
void dispose() async {
void dispose() {
globalAppState.SetModalState(ModalState.shutdown);
await cwtch.Shutdown();
cwtch.Shutdown();
windowManager.removeListener(this);
cwtch.dispose();
super.dispose();

View File

@ -1,8 +1,11 @@
import 'package:cwtch/themes/cwtch.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:cwtch/errorHandler.dart';
import 'package:cwtch/settings.dart';
import 'package:glob/list_local_fs.dart';
import 'config.dart';
import 'licenses.dart';
import 'main.dart';
import 'themes/opaque.dart';
@ -10,16 +13,20 @@ import 'themes/opaque.dart';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import "package:flutter_driver/driver_extension.dart";
import 'package:flutter_test/flutter_test.dart';
import 'package:glob/glob.dart';
var globalSettings = Settings(Locale("en", ''), CwtchDark());
var globalErrorHandler = ErrorHandler();
void main() {
Future<void> main() async {
enableFlutterDriverExtension();
print("Cwtch version: ${EnvironmentConfig.BUILD_VER} built on: ${EnvironmentConfig.BUILD_DATE}");
WidgetsFlutterBinding.ensureInitialized();
print("runApp()");
LicenseRegistry.addLicense(() => licenses());
DiskAssetBundle.loadGlob(['profiles/*.png']).then((assetBundle) {
return DiskAssetBundle.loadGlob(['profiles/*.png']).then((assetBundle) {
runApp(DefaultAssetBundle(
bundle: assetBundle,
child: Flwtch(),

View File

@ -22,27 +22,31 @@ class FileMessage extends Message {
return ChangeNotifierProvider.value(
value: this.metadata,
builder: (bcontext, child) {
dynamic shareObj = jsonDecode(this.content);
if (shareObj == null) {
return MessageRow(MalformedBubble(), index);
}
String nameSuggestion = shareObj['f'] as String;
String rootHash = shareObj['h'] as String;
String nonce = shareObj['n'] as String;
int fileSize = shareObj['s'] as int;
String fileKey = rootHash + "." + nonce;
if (metadata.attributes["file-downloaded"] == "true") {
if (!Provider.of<ProfileInfoState>(context).downloadKnown(fileKey)) {
Provider.of<FlwtchState>(context, listen: false).cwtch.CheckDownloadStatus(Provider.of<ProfileInfoState>(context, listen: false).onion, fileKey);
try {
dynamic shareObj = jsonDecode(this.content);
if (shareObj == null) {
return MessageRow(MalformedBubble(), index);
}
}
String nameSuggestion = shareObj['f'] as String;
String rootHash = shareObj['h'] as String;
String nonce = shareObj['n'] as String;
int fileSize = shareObj['s'] as int;
String fileKey = rootHash + "." + nonce;
if (!validHash(rootHash, nonce)) {
if (metadata.attributes["file-downloaded"] == "true") {
if (!Provider.of<ProfileInfoState>(context).downloadKnown(fileKey)) {
Provider.of<FlwtchState>(context, listen: false).cwtch.CheckDownloadStatus(Provider.of<ProfileInfoState>(context, listen: false).onion, fileKey);
}
}
if (!validHash(rootHash, nonce)) {
return MessageRow(MalformedBubble(), index);
}
return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto), index, key: key);
} catch (e) {
return MessageRow(MalformedBubble(), index);
}
return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto), index, key: key);
});
}
@ -55,7 +59,7 @@ class FileMessage extends Message {
if (shareObj == null) {
return MessageRow(MalformedBubble(), 0);
}
String nameSuggestion = shareObj['n'] as String;
String nameSuggestion = shareObj['f'] as String;
String rootHash = shareObj['h'] as String;
String nonce = shareObj['n'] as String;
int fileSize = shareObj['s'] as int;
@ -64,8 +68,7 @@ class FileMessage extends Message {
}
return Container(
alignment: Alignment.center,
width: 50,
height: 50,
height: 100,
child: FileBubble(
nameSuggestion,
rootHash,

View File

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:cwtch/config.dart';
import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/messages/malformedmessage.dart';
import 'package:cwtch/widgets/malformedbubble.dart';
@ -8,6 +9,9 @@ import 'package:cwtch/widgets/quotedmessage.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
class QuotedMessageStructure {
final String quotedHash;
final String body;
@ -34,9 +38,16 @@ class QuotedMessage extends Message {
this.content,
);
var content = message["body"];
return Text(
content,
);
var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment);
return SelectableLinkify(
text: content + '\u202F',
options: LinkifyOptions(messageFormatting: formatMessages, parseLinks: false, looseUrl: true, defaultToHttps: true),
linkifiers: [UrlLinkifier()],
onOpen: null,
textAlign: TextAlign.left,
style: TextStyle(overflow: TextOverflow.ellipsis),
codeStyle: TextStyle(overflow: TextOverflow.ellipsis),
textWidthBasis: TextWidthBasis.longestLine);
} catch (e) {
return MalformedBubble();
}

View File

@ -10,6 +10,9 @@ import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
class TextMessage extends Message {
final MessageMetadata metadata;
final String content;
@ -21,9 +24,16 @@ class TextMessage extends Message {
return ChangeNotifierProvider.value(
value: this.metadata,
builder: (bcontext, child) {
return Text(
this.content,
overflow: TextOverflow.ellipsis,
var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment);
return SelectableLinkify(
text: content + '\u202F',
options: LinkifyOptions(messageFormatting: formatMessages, parseLinks: false, looseUrl: true, defaultToHttps: true),
linkifiers: [UrlLinkifier()],
onOpen: null,
textAlign: TextAlign.left,
style: TextStyle(overflow: TextOverflow.fade),
codeStyle: TextStyle(overflow: TextOverflow.ellipsis),
textWidthBasis: TextWidthBasis.parent,
);
});
}

View File

@ -26,6 +26,9 @@ class ProfileInfoState extends ChangeNotifier {
// in the constructor if the profile is encrypted with the defacto password.
bool _encrypted = true;
bool _autostart = true;
bool _enabled = false;
ProfileInfoState({
required this.onion,
nickname = "",
@ -35,6 +38,7 @@ class ProfileInfoState extends ChangeNotifier {
contactsJson = "",
serversJson = "",
online = false,
autostart = true,
encrypted = true,
String,
}) {
@ -43,6 +47,11 @@ class ProfileInfoState extends ChangeNotifier {
this._defaultImagePath = defaultImagePath;
this._unreadMessages = unreadMessages;
this._online = online;
this._enabled = _enabled;
this._autostart = autostart;
if (autostart) {
this._enabled = true;
}
this._encrypted = encrypted;
_contacts.connectServers(this._servers);
@ -115,6 +124,10 @@ class ProfileInfoState extends ChangeNotifier {
// Check encrypted status for profile info screen
bool get isEncrypted => this._encrypted;
set isEncrypted(bool newValue) {
this._encrypted = newValue;
notifyListeners();
}
String get nickname => this._nickname;
@ -130,6 +143,20 @@ class ProfileInfoState extends ChangeNotifier {
notifyListeners();
}
bool get enabled => this._enabled;
set enabled(bool newVal) {
this._enabled = newVal;
notifyListeners();
}
bool get autostart => this._autostart;
set autostart(bool newVal) {
this._autostart = newVal;
notifyListeners();
}
String get defaultImagePath => this._defaultImagePath;
set defaultImagePath(String newVal) {

View File

@ -1,3 +1,5 @@
import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';
@ -7,11 +9,19 @@ class ProfileListState extends ChangeNotifier {
List<ProfileInfoState> _profiles = [];
int get num => _profiles.length;
void add(String onion, String name, String picture, String defaultPicture, String contactsJson, String serverJson, bool online, bool encrypted) {
void add(String onion, String name, String picture, String defaultPicture, String contactsJson, String serverJson, bool online, bool autostart, bool encrypted) {
var idx = _profiles.indexWhere((element) => element.onion == onion);
if (idx == -1) {
_profiles.add(ProfileInfoState(
onion: onion, nickname: name, imagePath: picture, defaultImagePath: defaultPicture, contactsJson: contactsJson, serversJson: serverJson, online: online, encrypted: encrypted));
onion: onion,
nickname: name,
imagePath: picture,
defaultImagePath: defaultPicture,
contactsJson: contactsJson,
serversJson: serverJson,
online: online,
autostart: autostart,
encrypted: encrypted));
} else {
_profiles[idx].updateFrom(onion, name, picture, contactsJson, serverJson, online);
}

View File

@ -75,7 +75,8 @@ class NotificationPayload {
};
}
// FlutterLocalNotificationsPlugin based NotificationManager that handles MacOS and Linux
// FlutterLocalNotificationsPlugin based NotificationManager that handles MacOS <s>and Linux</s>
// TODO: Upgrade from 9.6 to 12.x but there are breaking changes (including for mac)
// TODO: Windows support is being worked on, check back and migrate to that too when it lands
class NixNotificationManager implements NotificationsManager {
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
@ -153,6 +154,12 @@ class NixNotificationManager implements NotificationsManager {
}
NotificationsManager newDesktopNotificationsManager(Future<void> Function(String profileOnion, int convoId) notificationSelectConvo) {
// We don't want notifications in Dev Mode
if (EnvironmentConfig.TEST_MODE) {
return NullNotificationsManager();
}
if (Platform.isLinux && !Platform.isAndroid) {
try {
return NixNotificationManager(notificationSelectConvo);

View File

@ -95,10 +95,16 @@ class Settings extends ChangeNotifier {
}
}
// If message formatting has not explicitly been turned off, then
// turn it on by default.
// allow message formatting to be turned off even when experiments are
// disabled...
if (experiment == FormattingExperiment) {
return true;
if (this.experiments.containsKey(FormattingExperiment)) {
// If message formatting has not explicitly been turned off, then
// turn it on by default (even when experiments are disabled)
return this.experiments[experiment]! == true;
} else {
return true; // enable by default
}
}
return false;
@ -111,7 +117,7 @@ class Settings extends ChangeNotifier {
this.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark);
// Set Locale and notify listeners
switchLocale(Locale(settings["Locale"]));
switchLocaleByCode(settings["Locale"]);
blockUnknownConnections = settings["BlockUnknownConnections"] ?? false;
streamerMode = settings["StreamerMode"] ?? false;
@ -153,6 +159,16 @@ class Settings extends ChangeNotifier {
});
}
/// Switch the Locale of the App by Language Code
switchLocaleByCode(String languageCode) {
var code = languageCode.split("_");
if (code.length == 1) {
this.switchLocale(Locale(languageCode));
} else {
this.switchLocale(Locale(code[0], code[1]));
}
}
/// Switch the Locale of the App
switchLocale(Locale newLocale) {
locale = newLocale;
@ -397,7 +413,7 @@ class Settings extends ChangeNotifier {
/// event bus.
dynamic asJson() {
return {
"Locale": this.locale.languageCode,
"Locale": this.locale.toString(),
"Theme": theme.theme,
"ThemeMode": theme.mode,
"PreviousPid": -1,

View File

@ -45,37 +45,37 @@ class CwtchDark extends OpaqueThemeType {
get theme => cwtch_theme;
get mode => mode_dark;
get backgroundHilightElementColor => deepPurple;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get backgroundHilightElementColor => deepPurple;
get mainTextColor => font; //whiteishPurple;
get sendHintTextColor => mauvePurple;
get hilightElementColor => purple;
get defaultButtonColor => accent; //hotPink;
get defaultButtonTextColor => whiteishPurple;
get defaultButtonDisabledColor => lightGrey;
get defaultButtonDisabledTextColor => darkGreyPurple;
get textfieldBackgroundColor => deepPurple;
get textfieldBorderColor => deepPurple;
get textfieldHintColor => mainTextColor; //TODO pick
get textfieldErrorColor => hotPink;
get scrollbarDefaultColor => purple;
get portraitBackgroundColor => deepPurple;
get portraitOnlineBorderColor => whiteishPurple;
get portraitOfflineBorderColor => purple;
get portraitBlockedBorderColor => lightGrey;
get portraitBlockedTextColor => lightGrey;
get portraitContactBadgeColor => hotPink;
get portraitContactBadgeTextColor => whiteishPurple;
get portraitProfileBadgeColor => hotPink;
get portraitProfileBadgeTextColor => whiteishPurple;
get defaultButtonTextColor => whiteishPurple;
get dropShadowColor => mauvePurple;
get toolbarIconColor => settings; //whiteishPurple;
get hilightElementColor => purple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get portraitBackgroundColor => deepPurple;
get portraitBlockedBorderColor => lightGrey;
get portraitBlockedTextColor => lightGrey;
get portraitContactBadgeColor => hotPink;
get portraitContactBadgeTextColor => whiteishPurple;
get portraitOfflineBorderColor => purple;
get portraitOnlineBorderColor => whiteishPurple;
get portraitProfileBadgeColor => hotPink;
get portraitProfileBadgeTextColor => whiteishPurple;
get scrollbarDefaultColor => purple;
get sendHintTextColor => mauvePurple;
get textfieldBackgroundColor => deepPurple;
get textfieldBorderColor => deepPurple;
get textfieldErrorColor => hotPink;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class CwtchLight extends OpaqueThemeType {
@ -90,34 +90,34 @@ class CwtchLight extends OpaqueThemeType {
get theme => cwtch_theme;
get mode => mode_light;
get backgroundHilightElementColor => softPurple;
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get backgroundHilightElementColor => softPurple;
get mainTextColor => settings;
get sendHintTextColor => purple;
get hilightElementColor => purple; //darkPurple; // todo shouldn't be this, too dark, makes font unreadable
get defaultButtonColor => accent; // hotPink;
get defaultButtonTextColor => whitePurple; // ?
get defaultButtonDisabledColor => softGrey;
get textfieldBackgroundColor => purple;
get textfieldBorderColor => purple;
get textfieldHintColor => font; //TODO pick
get textfieldErrorColor => hotPink;
get scrollbarDefaultColor => accent;
get portraitBackgroundColor => softPurple;
get portraitOnlineBorderColor => greyPurple;
get portraitOfflineBorderColor => greyPurple;
get portraitBlockedBorderColor => softGrey;
get portraitBlockedTextColor => softGrey;
get portraitContactBadgeColor => accent;
get portraitContactBadgeTextColor => whitePurple;
get portraitProfileBadgeColor => accent;
get portraitProfileBadgeTextColor => whitePurple;
get defaultButtonTextColor => whitePurple; // ?
get dropShadowColor => purple;
get toolbarIconColor => settings; //darkPurple;
get hilightElementColor => purple;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitBackgroundColor => softPurple;
get portraitBlockedBorderColor => softGrey;
get portraitBlockedTextColor => softGrey;
get portraitContactBadgeColor => accent;
get portraitContactBadgeTextColor => whitePurple;
get portraitOfflineBorderColor => greyPurple;
get portraitOnlineBorderColor => greyPurple;
get portraitProfileBadgeColor => accent;
get portraitProfileBadgeTextColor => whitePurple;
get scrollbarDefaultColor => accent;
get sendHintTextColor => purple;
get textfieldBackgroundColor => purple;
get textfieldBorderColor => purple;
get textfieldErrorColor => hotPink;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -17,53 +17,73 @@ OpaqueThemeType GetGhostTheme(String mode) {
}
class GhostDark extends CwtchDark {
static final Color darkBlue = Color(0xFF000051);
static final Color lightBlue = Color(0xFF1A237E);
static final Color background = Color(0xFF0D0D1F);
static final Color header = Color(0xFF0D0D1F);
static final Color userBubble = Color(0xFF1A237E);
static final Color peerBubble = Color(0xFF000051);
static final Color font = Color(0xFFFFFFFF);
static final Color userBubble = lightBlue;
static final Color peerBubble = darkBlue;
static final Color font = Colors.white;
static final Color settings = Color(0xFFFDFFFD);
static final Color accent = Color(0xFFD20070);
static final Color accent = lightBlue; //Color(0xFFD20070);
get theme => ghost_theme;
get mode => mode_dark;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get backgroundHilightElementColor => darkBlue;
get backgroundMainColor => background;
get backgroundPaneColor => header;
get defaultButtonColor => accent;
get dropShadowColor => GhostLight.darkBlue;
get mainTextColor => font;
get messageFromMeBackgroundColor => userBubble;
get messageFromMeTextColor => font;
get messageFromOtherBackgroundColor => peerBubble;
get messageFromOtherTextColor => font;
get scrollbarDefaultColor => lightBlue;
get sendHintTextColor => GhostLight.darkBlue;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings;
get topbarColor => header;
}
class GhostLight extends CwtchLight {
static final Color darkBlue = Color(0xFFAAB6FE);
static final Color lighterDarkBlue = Color(0xFFc3ccfe);
static final Color lightBlue = Color(0xFFE8EAF6);
static final Color background = Color(0xFFFDFDFF);
static final Color header = Color(0xFFAAB6FE);
static final Color userBubble = Color(0xFFAAB6FE);
static final Color peerBubble = Color(0xFFE8EAF6);
static final Color header = darkBlue;
static final Color userBubble = darkBlue;
static final Color peerBubble = lightBlue;
static final Color font = Color(0xFF0D0D1F);
static final Color settings = Color(0xFF0D0D1F);
static final Color accent = Color(0xFFD20070);
static final Color accent = darkBlue;
get theme => ghost_theme;
get mode => mode_light;
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background;
get backgroundPaneColor => background;
get defaultButtonColor => accent;
get defaultButtonActiveColor => lighterDarkBlue;
get defaultButtonDisabledColor => peerBubble;
get dropShadowColor => darkBlue;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get messageFromMeBackgroundColor => userBubble;
get messageFromMeTextColor => font;
get messageFromOtherBackgroundColor => peerBubble;
get messageFromOtherTextColor => font;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get scrollbarDefaultColor => accent;
get sendHintTextColor => lightBlue;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings;
get topbarColor => header;
}

63
lib/themes/juniper.dart Normal file
View File

@ -0,0 +1,63 @@
/// A theme dedicated to Juniper
import 'dart:ui';
import 'dart:core';
import 'package:cwtch/themes/cwtch.dart';
import 'package:flutter/material.dart';
import 'opaque.dart';
const juniper_theme = "juniper";
OpaqueThemeType GetJuniperTheme(String mode) {
// there is only one juniper theme
return Juniper();
}
class Juniper extends CwtchDark {
static final Color background = Color(0xFF1B1B1B);
static final Color backgroundAlt = Color(0xFF494949);
static final Color header = Color(0xFF1B1B1B);
static final Color userBubble = Color(0xFF373737);
static final Color peerBubble = Color(0xFF494949);
static final Color font = Color(0xFFFFFFFF);
static final Color settings = Color(0xFFFFFDFF);
static final Color accent = Color(0xFF9E6A56);
static final Color accentAlt = Color(0xFF845A48);
get theme => juniper_theme;
get mode => mode_dark;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get backgroundHilightElementColor => accent;
get sendHintTextColor => accentAlt;
get hilightElementColor => accentAlt;
get defaultButtonTextColor => mainTextColor;
get defaultButtonDisabledColor => peerBubble;
get defaultButtonDisabledTextColor => peerBubble;
get textfieldErrorColor => accent;
get scrollbarDefaultColor => accent;
get portraitBackgroundColor => header;
get portraitOnlineBorderColor => font;
get portraitOfflineBorderColor => peerBubble;
get portraitBlockedBorderColor => peerBubble;
get portraitBlockedTextColor => peerBubble;
get portraitContactBadgeColor => accent;
get portraitContactBadgeTextColor => mainTextColor;
get portraitProfileBadgeColor => accent;
get portraitProfileBadgeTextColor => mainTextColor;
get dropShadowColor => accentAlt;
}

View File

@ -17,28 +17,34 @@ OpaqueThemeType GetMermaidTheme(String mode) {
}
class MermaidDark extends CwtchDark {
static final Color lavender = Color(0xFFB194C1);
static final Color background = Color(0xFF102426);
static final Color header = Color(0xFF102426);
static final Color userBubble = Color(0xFF00838F);
static final Color peerBubble = Color(0xFF00363A);
static final Color font = Color(0xFFFFFFFF);
static final Color font = Colors.white;
static final Color settings = Color(0xFFF7FCFD);
static final Color accent = Color(0xFF8E64A5);
get theme => mermaid_theme;
get mode => mode_dark;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get dropShadowColor => lavender;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class MermaidLight extends CwtchLight {
@ -53,17 +59,21 @@ class MermaidLight extends CwtchLight {
get theme => mermaid_theme;
get mode => mode_light;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get dropShadowColor => peerBubble;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -17,6 +17,7 @@ OpaqueThemeType GetMidnightTheme(String mode) {
}
class MidnightDark extends CwtchDark {
static final Color accentGray = Color(0xFFE0E0E0);
static final Color background = Color(0xFF1B1B1B);
static final Color backgroundAlt = Color(0xFF494949);
static final Color header = Color(0xFF1B1B1B);
@ -29,24 +30,26 @@ class MidnightDark extends CwtchDark {
get theme => midnight_theme;
get mode => mode_dark;
get backgroundHilightElementColor => backgroundAlt;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get dropShadowColor => accentGray;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get scrollbarDefaultColor => accentGray;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get backgroundHilightElementColor => backgroundAlt;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class MidnightLight extends CwtchLight {
static final Color background = Color(0xFFFFFDFF);
static final Color background = Color(0xFFFBFBFB); //Color(0xFFFFFDFF);
static final Color header = Color(0xFFE0E0E0);
static final Color userBubble = Color(0xFFE0E0E0);
static final Color peerBubble = Color(0xFFBABDBE);
@ -57,18 +60,21 @@ class MidnightLight extends CwtchLight {
get theme => midnight_theme;
get mode => mode_light;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get portraitOfflineBorderColor => peerBubble;
get portraitOnlineBorderColor => font;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -30,15 +30,16 @@ class Neon1Dark extends CwtchDark {
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get scrollbarDefaultColor => accent;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class Neon1Light extends CwtchLight {
@ -55,15 +56,20 @@ class Neon1Light extends CwtchLight {
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get dropShadowColor => userBubble;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get portraitOfflineBorderColor => peerBubble;
get portraitOnlineBorderColor => font;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple
}

View File

@ -30,18 +30,21 @@ class Neon2Dark extends CwtchDark {
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get scrollbarDefaultColor => accent;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class Neon2Light extends CwtchLight {
static final Color paleGreen = Color(0xFFE7F6F6);
static final Color background = Color(0xFFFFFDFF);
static final Color header = Color(0xFFD8C7E1);
static final Color userBubble = Color(0xFFD8C7E1);
@ -55,15 +58,20 @@ class Neon2Light extends CwtchLight {
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get dropShadowColor => userBubble;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get portraitOfflineBorderColor => peerBubble;
get portraitOnlineBorderColor => font;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => paleGreen;
get textfieldBorderColor => peerBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -2,6 +2,7 @@ import 'dart:ui';
import 'dart:core';
import 'package:cwtch/themes/cwtch.dart';
import 'package:cwtch/themes/juniper.dart';
import 'package:cwtch/themes/mermaid.dart';
import 'package:cwtch/themes/neon1.dart';
import 'package:cwtch/themes/pumpkin.dart';
@ -21,13 +22,14 @@ const mode_dark = "dark";
final themes = {
cwtch_theme: {mode_light: CwtchLight(), mode_dark: CwtchDark()},
ghost_theme: {mode_light: GhostLight(), mode_dark: GhostDark()},
juniper_theme: {mode_light: Juniper(), mode_dark: Juniper()},
mermaid_theme: {mode_light: MermaidLight(), mode_dark: MermaidDark()},
midnight_theme: {mode_light: MidnightLight(), mode_dark: MidnightDark()},
neon1_theme: {mode_light: Neon1Light(), mode_dark: Neon1Dark()},
neon2_theme: {mode_light: Neon2Light(), mode_dark: Neon2Dark()},
pumpkin_theme: {mode_light: PumpkinLight(), mode_dark: PumpkinDark()},
witch_theme: {mode_light: WitchLight(), mode_dark: WitchDark()},
vampire_theme: {mode_light: VampireLight(), mode_dark: VampireDark()},
witch_theme: {mode_light: WitchLight(), mode_dark: WitchDark()},
};
OpaqueThemeType getTheme(String themeId, String mode) {
@ -123,6 +125,7 @@ abstract class OpaqueThemeType {
ThemeData mkThemeData(Settings opaque) {
return ThemeData(
hoverColor: opaque.current().backgroundHilightElementColor.withOpacity(0.5),
visualDensity: VisualDensity.adaptivePlatformDensity,
primarySwatch: Colors.red,
primaryIconTheme: IconThemeData(

View File

@ -30,15 +30,15 @@ class PumpkinDark extends CwtchDark {
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class PumpkinLight extends CwtchLight {
@ -55,15 +55,16 @@ class PumpkinLight extends CwtchLight {
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get dropShadowColor => peerBubble;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get scrollbarDefaultColor => accent;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -30,15 +30,16 @@ class VampireDark extends CwtchDark {
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get scrollbarDefaultColor => accent;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class VampireLight extends CwtchLight {
@ -55,15 +56,18 @@ class VampireLight extends CwtchLight {
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get dropShadowColor => userBubble;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -28,17 +28,21 @@ class WitchDark extends CwtchDark {
get theme => witch_theme;
get mode => mode_dark;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background; // darkGreyPurple;
get backgroundPaneColor => header; //darkGreyPurple;
get topbarColor => header; //darkGreyPurple;
get mainTextColor => font; //whiteishPurple;
get defaultButtonColor => accent; //hotPink;
get textfieldHintColor => mainTextColor; //TODO pick
get toolbarIconColor => settings; //whiteishPurple;
get mainTextColor => font; //whiteishPurple;
get messageFromMeBackgroundColor => userBubble; // mauvePurple;
get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => mainTextColor;
get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple;
}
class WitchLight extends CwtchLight {
@ -53,17 +57,20 @@ class WitchLight extends CwtchLight {
get theme => witch_theme;
get mode => mode_light;
get backgroundHilightElementColor => peerBubble;
get backgroundMainColor => background; //whitePurple;
get backgroundPaneColor => background; //whitePurple;
get topbarColor => header; //softPurple;
get mainTextColor => settings;
get defaultButtonColor => accent; // hotPink;
get textfieldHintColor => font; //TODO pick
get scrollbarDefaultColor => accent;
get portraitContactBadgeColor => accent;
get toolbarIconColor => settings; //darkPurple;
get mainTextColor => settings;
get messageFromMeBackgroundColor => userBubble; //brightPurple;
get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple;
get portraitContactBadgeColor => accent;
get scrollbarDefaultColor => accent;
get textfieldBackgroundColor => peerBubble;
get textfieldBorderColor => userBubble;
get textfieldHintColor => font;
get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple;
}

View File

@ -122,12 +122,15 @@ class Linkify extends StatelessWidget {
linkifiers: linkifiers,
);
return Text.rich(
buildTextSpan(
return SelectionArea(
child: RichText(
selectionRegistrar: SelectionContainer.maybeOf(context),
text: buildTextSpan(
elements,
style: Theme.of(context).textTheme.bodyText2?.merge(style),
onOpen: onOpen,
useMouseRegion: true,
context: context,
linkStyle: Theme.of(context)
.textTheme
.bodyText2
@ -148,7 +151,7 @@ class Linkify extends StatelessWidget {
locale: locale,
textWidthBasis: textWidthBasis,
textHeightBehavior: textHeightBehavior,
);
));
}
}
@ -297,6 +300,7 @@ class SelectableLinkify extends StatelessWidget {
style: Theme.of(context).textTheme.bodyText2?.merge(style),
codeStyle: Theme.of(context).textTheme.bodyText2?.merge(codeStyle),
onOpen: onOpen,
context: context,
linkStyle: Theme.of(context)
.textTheme
.bodyText2
@ -329,6 +333,7 @@ class SelectableLinkify extends StatelessWidget {
cursorHeight: cursorHeight,
selectionControls: selectionControls,
onSelectionChanged: onSelectionChanged,
style: style,
);
}
}
@ -337,11 +342,13 @@ class LinkableSpan extends WidgetSpan {
LinkableSpan({
required MouseCursor mouseCursor,
required InlineSpan inlineSpan,
required BuildContext context,
}) : super(
child: MouseRegion(
cursor: mouseCursor,
child: Text.rich(
inlineSpan,
child: RichText(
text: inlineSpan,
selectionRegistrar: SelectionContainer.maybeOf(context),
),
),
);
@ -354,6 +361,7 @@ TextSpan buildTextSpan(
TextStyle? linkStyle,
TextStyle? codeStyle,
LinkCallback? onOpen,
required BuildContext context,
bool useMouseRegion = false,
}) {
return TextSpan(
@ -361,20 +369,18 @@ TextSpan buildTextSpan(
(element) {
if (element is LinkableElement) {
if (useMouseRegion) {
return TooltipSpan(
message: element.url,
inlineSpan: LinkableSpan(
mouseCursor: SystemMouseCursors.click,
inlineSpan: TextSpan(text: element.text, style: linkStyle, recognizer: onOpen != null ? (TapGestureRecognizer()..onTap = () => onOpen(element)) : null, semanticsLabel: element.text),
));
return TextSpan(
text: element.text,
style: linkStyle,
mouseCursor: SystemMouseCursors.click,
recognizer: onOpen != null ? (TapGestureRecognizer()..onTap = () => onOpen(element)) : null,
semanticsLabel: element.text);
} else {
return TooltipSpan(
message: element.url,
inlineSpan: TextSpan(
text: element.text,
style: linkStyle,
recognizer: onOpen != null ? (TapGestureRecognizer()..onTap = () => onOpen(element)) : null,
));
return TextSpan(
text: element.text,
style: linkStyle,
recognizer: onOpen != null ? (TapGestureRecognizer()..onTap = () => onOpen(element)) : null,
);
}
} else if (element is BoldElement) {
return TextSpan(text: element.text.replaceAll("*", ""), style: style?.copyWith(fontWeight: FontWeight.bold), semanticsLabel: element.text);
@ -428,11 +434,13 @@ class TooltipSpan extends WidgetSpan {
TooltipSpan({
required String message,
required InlineSpan inlineSpan,
required BuildContext context,
}) : super(
child: Tooltip(
message: message,
child: Text.rich(
inlineSpan,
child: RichText(
text: inlineSpan,
selectionRegistrar: SelectionContainer.maybeOf(context),
),
),
);

View File

@ -114,9 +114,12 @@ class _AddContactViewState extends State<AddContactView> {
/// The Add Peer Tab allows a peer to add a specific non-group peer to their contact lists
/// We also provide a convenient way to copy their onion.
Widget addPeerTab(bcontext) {
ScrollController controller = ScrollController();
return Scrollbar(
controller: controller,
child: SingleChildScrollView(
clipBehavior: Clip.antiAlias,
controller: controller,
child: Container(
margin: EdgeInsets.all(30),
padding: EdgeInsets.all(20),
@ -133,7 +136,7 @@ class _AddContactViewState extends State<AddContactView> {
onPressed: _copyOnion,
readonly: true,
icon: Icon(
CwtchIcons.address_copy_2,
CwtchIcons.address_copy,
size: 32,
),
tooltip: AppLocalizations.of(context)!.copyBtn,
@ -187,10 +190,12 @@ class _AddContactViewState extends State<AddContactView> {
if (Provider.of<ProfileInfoState>(bcontext).serverList.servers.isEmpty) {
return Text(AppLocalizations.of(bcontext)!.addServerFirst);
}
ScrollController controller = ScrollController();
return Scrollbar(
controller: controller,
child: SingleChildScrollView(
clipBehavior: Clip.antiAlias,
controller: controller,
child: Container(
margin: EdgeInsets.all(30),
padding: EdgeInsets.all(20),

View File

@ -38,6 +38,7 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
final ctrlrPass = TextEditingController(text: "");
final ctrlrPass2 = TextEditingController(text: "");
final ctrlrOnion = TextEditingController(text: "");
ScrollController controller = ScrollController();
late bool usePassword;
late bool deleted;
@ -75,8 +76,10 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
return Consumer<Settings>(builder: (context, theme, child) {
return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) {
return Scrollbar(
isAlwaysShown: true,
trackVisibility: true,
controller: controller,
child: SingleChildScrollView(
controller: controller,
clipBehavior: Clip.antiAlias,
child: ConstrainedBox(
constraints: BoxConstraints(
@ -162,13 +165,53 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
onPressed: _copyOnion,
readonly: true,
icon: Icon(
CwtchIcons.address_copy_2,
CwtchIcons.address_copy,
size: 32,
),
tooltip: AppLocalizations.of(context)!.copyBtn,
)
])),
// We only allow setting password types on profile creation
// Enabled
Visibility(
visible: Provider.of<ProfileInfoState>(context).onion.isNotEmpty && !Provider.of<ProfileInfoState>(context).enabled,
child: SwitchListTile(
title: Text(AppLocalizations.of(context)!.profileEnabled, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor)),
subtitle: Text(AppLocalizations.of(context)!.profileEnabledDescription),
value: Provider.of<ProfileInfoState>(context).enabled,
onChanged: (bool value) {
Provider.of<ProfileInfoState>(context).enabled = value;
if (value) {
Provider.of<FlwtchState>(context, listen: false).cwtch.ActivatePeerEngine(Provider.of<ProfileInfoState>(context).onion);
} else {
Provider.of<FlwtchState>(context, listen: false).cwtch.DeactivatePeerEngine(Provider.of<ProfileInfoState>(context).onion);
}
},
activeTrackColor: Provider.of<Settings>(context).theme.defaultButtonColor,
inactiveTrackColor: Provider.of<Settings>(context).theme.defaultButtonDisabledColor,
secondary: Icon(CwtchIcons.negative_heart_24px, color: Provider.of<Settings>(context).current().mainTextColor),
)),
// Auto start
SwitchListTile(
title: Text(AppLocalizations.of(context)!.profileAutostartLabel, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor)),
subtitle: Text(AppLocalizations.of(context)!.profileAutostartDescription),
value: Provider.of<ProfileInfoState>(context).autostart,
onChanged: (bool value) {
Provider.of<ProfileInfoState>(context).autostart = value;
if (!Provider.of<ProfileInfoState>(context).onion.isEmpty) {
Provider.of<FlwtchState>(context, listen: false)
.cwtch
.SetProfileAttribute(Provider.of<ProfileInfoState>(context).onion, "profile.autostart", value ? "true" : "false");
}
},
activeTrackColor: Provider.of<Settings>(context).theme.defaultButtonColor,
inactiveTrackColor: Provider.of<Settings>(context).theme.defaultButtonDisabledColor,
secondary: Icon(CwtchIcons.favorite_24dp, color: Provider.of<Settings>(context).current().mainTextColor),
),
Visibility(
visible: Provider.of<ProfileInfoState>(context).onion.isEmpty,
child: SizedBox(
@ -339,7 +382,7 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
showAlertDialog(context);
},
icon: Icon(Icons.delete_forever),
label: Text(AppLocalizations.of(context)!.deleteBtn),
label: Text(AppLocalizations.of(context)!.deleteBtn, style: TextStyle(color: Provider.of<Settings>(context).theme.defaultButtonActiveColor)),
)))
]))))));
});
@ -359,10 +402,10 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
if (_formKey.currentState!.validate()) {
if (Provider.of<ProfileInfoState>(context, listen: false).onion.isEmpty) {
if (usePassword == true) {
Provider.of<FlwtchState>(context, listen: false).cwtch.CreateProfile(ctrlrNick.value.text, ctrlrPass.value.text);
Provider.of<FlwtchState>(context, listen: false).cwtch.CreateProfile(ctrlrNick.value.text, ctrlrPass.value.text, Provider.of<ProfileInfoState>(context, listen: false).autostart);
Navigator.of(context).pop();
} else {
Provider.of<FlwtchState>(context, listen: false).cwtch.CreateProfile(ctrlrNick.value.text, DefaultPassword);
Provider.of<FlwtchState>(context, listen: false).cwtch.CreateProfile(ctrlrNick.value.text, DefaultPassword, Provider.of<ProfileInfoState>(context, listen: false).autostart);
Navigator.of(context).pop();
}
} else {
@ -378,7 +421,9 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
var profile = Provider.of<ProfileInfoState>(context, listen: false).onion;
Provider.of<ProfileInfoState>(context, listen: false).nickname = ctrlrNick.value.text;
Provider.of<FlwtchState>(context, listen: false).cwtch.SetProfileAttribute(profile, "profile.name", ctrlrNick.value.text);
Provider.of<FlwtchState>(context, listen: false).cwtch.ChangePassword(profile, ctrlrOldPass.text, ctrlrPass.text, ctrlrPass2.text);
// Use default password if the profile is unencrypted
var password = Provider.of<ProfileInfoState>(context, listen: false).isEncrypted ? ctrlrOldPass.text : DefaultPassword;
Provider.of<FlwtchState>(context, listen: false).cwtch.ChangePassword(profile, password, ctrlrPass.text, ctrlrPass2.text);
EnvironmentConfig.debugLog("waiting for change password response");
Future.delayed(const Duration(milliseconds: 500), () {
@ -394,6 +439,8 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
}
}).whenComplete(() {
if (globalErrorHandler.explicitChangePasswordSuccess) {
// we need to set the local encrypted status to display correct password forms on this run...
Provider.of<ProfileInfoState>(context, listen: false).isEncrypted = true;
final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.newPassword));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
Navigator.pop(context);

View File

@ -67,11 +67,14 @@ class _AddEditServerViewState extends State<AddEditServerView> {
}
Widget _buildSettingsList() {
ScrollController controller = ScrollController();
return Consumer2<ServerInfoState, Settings>(builder: (context, serverInfoState, settings, child) {
return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) {
return Scrollbar(
isAlwaysShown: true,
trackVisibility: true,
controller: controller,
child: SingleChildScrollView(
controller: controller,
clipBehavior: Clip.antiAlias,
child: ConstrainedBox(
constraints: BoxConstraints(

View File

@ -85,6 +85,7 @@ void _pushMessageView(BuildContext context, int handle) {
class _ContactsViewState extends State<ContactsView> {
late TextEditingController ctrlrFilter;
bool showSearchBar = false;
final scaffoldKey = GlobalKey<ScaffoldMessengerState>();
@override
void initState() {
@ -94,70 +95,73 @@ class _ContactsViewState extends State<ContactsView> {
@override
Widget build(BuildContext context) {
return Scaffold(
endDrawerEnableOpenDragGesture: false,
drawerEnableOpenDragGesture: false,
appBar: AppBar(
leading: Stack(children: [
Align(
alignment: Alignment.center,
child: IconButton(
icon: Icon(Icons.arrow_back),
tooltip: MaterialLocalizations.of(context).backButtonTooltip,
onPressed: () {
Provider.of<ProfileInfoState>(context, listen: false).recountUnread();
Provider.of<AppState>(context, listen: false).selectedProfile = "";
Navigator.of(context).pop();
},
)),
Positioned(
bottom: 5.0,
right: 5.0,
child: StreamBuilder<bool>(
stream: Provider.of<AppState>(context).getUnreadProfileNotifyStream(),
builder: (BuildContext context, AsyncSnapshot<bool> unreadCountSnapshot) {
int unreadCount = Provider.of<ProfileListState>(context).generateUnreadCount(Provider.of<AppState>(context).selectedProfile ?? "");
return ScaffoldMessenger(
key: scaffoldKey,
child: Scaffold(
endDrawerEnableOpenDragGesture: false,
drawerEnableOpenDragGesture: false,
appBar: AppBar(
leading: Stack(children: [
Align(
alignment: Alignment.center,
child: IconButton(
icon: Icon(Icons.arrow_back),
tooltip: MaterialLocalizations.of(context).backButtonTooltip,
onPressed: () {
Provider.of<ProfileInfoState>(context, listen: false).recountUnread();
Provider.of<AppState>(context, listen: false).selectedProfile = "";
Navigator.of(context).pop();
},
)),
Positioned(
bottom: 5.0,
right: 5.0,
child: StreamBuilder<bool>(
stream: Provider.of<AppState>(context).getUnreadProfileNotifyStream(),
builder: (BuildContext context, AsyncSnapshot<bool> unreadCountSnapshot) {
int unreadCount = Provider.of<ProfileListState>(context).generateUnreadCount(Provider.of<AppState>(context).selectedProfile ?? "");
return Visibility(
visible: unreadCount > 0,
child: CircleAvatar(
radius: 10.0,
backgroundColor: Provider.of<Settings>(context).theme.portraitProfileBadgeColor,
child: Text(unreadCount > 99 ? "99+" : unreadCount.toString(), style: TextStyle(color: Provider.of<Settings>(context).theme.portraitProfileBadgeTextColor, fontSize: 8.0)),
));
}),
)
]),
title: Row(children: [
ProfileImage(
imagePath: Provider.of<Settings>(context).isExperimentEnabled(ImagePreviewsExperiment)
? Provider.of<ProfileInfoState>(context).imagePath
: Provider.of<ProfileInfoState>(context).defaultImagePath,
diameter: 42,
border: Provider.of<ProfileInfoState>(context).isOnline
? Provider.of<Settings>(context).current().portraitOnlineBorderColor
: Provider.of<Settings>(context).current().portraitOfflineBorderColor,
badgeTextColor: Colors.red,
badgeColor: Colors.red,
return Visibility(
visible: unreadCount > 0,
child: CircleAvatar(
radius: 10.0,
backgroundColor: Provider.of<Settings>(context).theme.portraitProfileBadgeColor,
child:
Text(unreadCount > 99 ? "99+" : unreadCount.toString(), style: TextStyle(color: Provider.of<Settings>(context).theme.portraitProfileBadgeTextColor, fontSize: 8.0)),
));
}),
)
]),
title: Row(children: [
ProfileImage(
imagePath: Provider.of<Settings>(context).isExperimentEnabled(ImagePreviewsExperiment)
? Provider.of<ProfileInfoState>(context).imagePath
: Provider.of<ProfileInfoState>(context).defaultImagePath,
diameter: 42,
border: Provider.of<ProfileInfoState>(context).isOnline
? Provider.of<Settings>(context).current().portraitOnlineBorderColor
: Provider.of<Settings>(context).current().portraitOfflineBorderColor,
badgeTextColor: Colors.red,
badgeColor: Colors.red,
),
SizedBox(
width: 10,
),
Expanded(
child: Text("%1 » %2".replaceAll("%1", Provider.of<ProfileInfoState>(context).nickname).replaceAll("%2", AppLocalizations.of(context)!.titleManageContacts),
overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor))),
]),
actions: getActions(context),
),
SizedBox(
width: 10,
floatingActionButton: FloatingActionButton(
onPressed: _modalAddImportChoice,
tooltip: AppLocalizations.of(context)!.tooltipAddContact,
child: Icon(
CwtchIcons.person_add_alt_1_24px,
color: Provider.of<Settings>(context).theme.defaultButtonTextColor,
),
),
Expanded(
child: Text("%1 » %2".replaceAll("%1", Provider.of<ProfileInfoState>(context).nickname).replaceAll("%2", AppLocalizations.of(context)!.titleManageContacts),
overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor))),
]),
actions: getActions(context),
),
floatingActionButton: FloatingActionButton(
onPressed: _modalAddImportChoice,
tooltip: AppLocalizations.of(context)!.tooltipAddContact,
child: Icon(
CwtchIcons.person_add_alt_1_24px,
color: Provider.of<Settings>(context).theme.defaultButtonTextColor,
),
),
body: showSearchBar || Provider.of<ContactListState>(context).isFiltered ? _buildFilterable() : _buildContactList());
body: showSearchBar || Provider.of<ContactListState>(context).isFiltered ? _buildFilterable() : _buildContactList()));
}
List<Widget> getActions(context) {
@ -168,7 +172,7 @@ class _ContactsViewState extends State<ContactsView> {
if (Provider.of<Settings>(context, listen: false).isExperimentEnabled(QRCodeExperiment)) {
actions.add(PopupMenuButton<ShareMenu>(
icon: Icon(CwtchIcons.address_copy_2),
icon: Icon(CwtchIcons.address_copy),
tooltip: AppLocalizations.of(context)!.shareProfileMenuTooltop,
splashRadius: Material.defaultSplashRadius / 2,
onSelected: (ShareMenu item) {
@ -177,7 +181,7 @@ class _ContactsViewState extends State<ContactsView> {
{
Clipboard.setData(new ClipboardData(text: Provider.of<ProfileInfoState>(context, listen: false).onion));
final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.copiedToClipboardNotification));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
scaffoldKey.currentState?.showSnackBar(snackBar);
}
break;
case ShareMenu.qrcode:
@ -200,13 +204,13 @@ class _ContactsViewState extends State<ContactsView> {
));
} else {
actions.add(IconButton(
icon: Icon(CwtchIcons.address_copy_2),
icon: Icon(CwtchIcons.address_copy),
tooltip: AppLocalizations.of(context)!.copyAddress,
splashRadius: Material.defaultSplashRadius / 2,
onPressed: () {
Clipboard.setData(new ClipboardData(text: Provider.of<ProfileInfoState>(context, listen: false).onion));
final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.copiedToClipboardNotification));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
scaffoldKey.currentState?.showSnackBar(snackBar);
}));
}

Some files were not shown because too many files have changed in this diff Show More