rename and update icon
101
README.md
|
|
@ -1,11 +1,6 @@
|
||||||
# Connect
|
# twonly
|
||||||
|
|
||||||
> Connect a zecure open-source instant-image sharing, full-featured AI app based on 5 blockchains.
|
Don't be lonely, get twonly! Send pictures to a friend in real time and be sure you are the only two people who can see them.
|
||||||
|
|
||||||
Actually there is no AI or Blockchain or any other dump hyped stuff included into this app. The
|
|
||||||
purpose of this app is first off all to create a usable, good looking and important of all
|
|
||||||
end-to-end encrypted alternative to S[redacted]chat. As I love to schare images with friends but not
|
|
||||||
a strange company.
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
|
@ -17,95 +12,7 @@ This app was started because of the three main features I missed out by popular
|
||||||
2. Privacy by design: The server only knows your username and public key.
|
2. Privacy by design: The server only knows your username and public key.
|
||||||
3. User-friendliness: Decide for your own :)
|
3. User-friendliness: Decide for your own :)
|
||||||
|
|
||||||
> "It's the combination that makes the difference. Only a combination of privacy, security and user-friendliness can make a application good. Focusing on just one of these three areas can mean that everyone loses out in the end." ~ Myself
|
|
||||||
|
|
||||||
### But there is even more!
|
|
||||||
|
|
||||||
4. Decentralized: Everyone can host an server. The usernames are like your email USERNAME@YOURSERVER
|
|
||||||
5. Simple to use: What is a Public key? If you don't know this it is okay you don't have to to use Connect!
|
|
||||||
|
|
||||||
> "Its like when S[redacted]chat, Signal and email had an baby" ~ Myself
|
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
|
|
||||||
The development of this App has the following stages:
|
|
||||||
|
|
||||||
1. **Working POC**: As this is my first App ever the first step is to learn App development. During
|
|
||||||
this step I try everything I can do as a non experienced App developer to make working POC App which
|
|
||||||
is by design secure meaning while I learn new things I always try to think how this could be
|
|
||||||
attacked and how I could protect it. But as I have no experience at all I depend on libraries who
|
|
||||||
look secure. This step include:
|
|
||||||
|
|
||||||
1. Create a working POC and an private invitation code
|
|
||||||
2. Test the POC with friends
|
|
||||||
3. Improve and fix bugs
|
|
||||||
4. Repeat steps 2. and 3. until I have a usable App
|
|
||||||
|
|
||||||
2. **Bug Bounty**: This is probably the most fun part. The GitHub Repository will become open-source
|
|
||||||
and I make public releases so others can [install](https://github.com/ImranR98/Obtainium) and test
|
|
||||||
the app as well. After I published the App the following steps will happen.
|
|
||||||
1. I try to hack my own App using the free Android Hacking Course from
|
|
||||||
[heytree.io](https://app.hextree.io/map/android/android-continent). And if I find something will
|
|
||||||
create a nice write-up.
|
|
||||||
2. Add the new invitation code "BUGBOUNTY" so reale smart people (not
|
|
||||||
like me) can try to hack the app. And if they find something and create a small POC there is a
|
|
||||||
small Bug Bounty of 50€.
|
|
||||||
|
|
||||||
3. **Pre-Releasing and Scaling**: If I ever come to this point the App will be first released on
|
|
||||||
[droidy-fy](https://droidify.eu.org/) to test on a larger scale.
|
|
||||||
|
|
||||||
4. **Release**: This will probably never happen, but if it will, I will release the App on Google
|
|
||||||
Play and maybe Apple App Store for a couple of €€ as this requires a paid developer account :/. The
|
|
||||||
version on droid-fy will be free for ever to encourage people to switch to open source apps which.
|
|
||||||
|
|
||||||
5. **Becoming Rich**: I will add an ChatBot into the App. Then I rename the App into ConnectAI add
|
|
||||||
misleading advertisement on the website that the app is smart as it has an AI and then sell the app
|
|
||||||
for $7 trillion to become rich.
|
|
||||||
|
|
||||||
## Decentralized
|
|
||||||
|
|
||||||
The idea behind this idea is that the server does not know anything about the user. As the server
|
|
||||||
is not able to read the messages but only see the receiver of it the only purpose is to forward
|
|
||||||
the message. So like for emails the user can specify in his username to which server he belongs to.
|
|
||||||
|
|
||||||
|
|
||||||
The username is then build up with the following informations:
|
|
||||||
|
|
||||||
`username@fqdn:port`
|
|
||||||
|
|
||||||
The username is unique for the corresponding server. The second part contains the fully qualified
|
|
||||||
domain name where the server is reachable. It is also possible to specify a custom port. The
|
|
||||||
default port are the HTTP and TLS ports.
|
|
||||||
|
|
||||||
|
|
||||||
### Thoughts
|
|
||||||
When the user is adding another user they could exchange the servers public key which the user then
|
|
||||||
reports to their own home sever. The home server then can authenticate the other server. But what
|
|
||||||
is the thread here, the server are not able to see the messages nor change it as the client does an
|
|
||||||
integrity check. An attacker could drop a messages and send an ACK as this is unauthenticated.
|
|
||||||
|
|
||||||
|
|
||||||
## Self-hosting
|
|
||||||
|
|
||||||
It is possible to host the server yourself and then modify the server in your app. But be aware it
|
|
||||||
is not planned to sync the different servers so you can only add people when their are on the same
|
|
||||||
server! As in my understanding this is not supported by the Signal protocol, but please proof me
|
|
||||||
wrong and at a PR :)
|
|
||||||
|
|
||||||
A possible idea could be to add multiple servers in app but this would then require multiple
|
|
||||||
parallel open websocket connection to check for new messages. As before if you want that feature
|
|
||||||
create a PR :)
|
|
||||||
|
|
||||||
|
|
||||||
## Bug-Bounty
|
## Bug-Bounty
|
||||||
|
|
||||||
This app offers a Bug Bounty as I really love the Idea of others hacking my app. Depending on the
|
twonly offers a Bug Bounty. Depending on the criticality the bounty can go up to 50€ (more later,
|
||||||
criticality the bounty can go up to 50€ (more later when there are donation or I actually make some
|
this is out of my own pocket :/).
|
||||||
money which I probably never will do :/).
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
As this is my first Android app, I used different examples where I copied the code design decisions.
|
|
||||||
To give them credits and maybe help others they are listed below:
|
|
||||||
|
|
||||||
- [Database handling (model, provider and usage)](https://github.com/alextekartik/flutter_app_example/blob/master/notepad_sqflite/)
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ android {
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId = "eu.tsmr.connect"
|
applicationId = "eu.twonly"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
minSdk = flutter.minSdkVersion
|
minSdk = flutter.minSdkVersion
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<application
|
<application
|
||||||
android:label="Connect"
|
android:label="twonly"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/launcher_icon">
|
android:icon="@mipmap/ic_launcher">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 4 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground>
|
||||||
|
<inset
|
||||||
|
android:drawable="@drawable/ic_launcher_foreground"
|
||||||
|
android:inset="16%" />
|
||||||
|
</foreground>
|
||||||
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
4
android/app/src/main/res/values/colors.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#FF57CC99</color>
|
||||||
|
</resources>
|
||||||
|
Before Width: | Height: | Size: 619 B |
|
Before Width: | Height: | Size: 810 B |
|
Before Width: | Height: | Size: 419 B |
1
assets/images/link-solid.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1,021 B |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@mipmap/ic_launcher_background"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 9 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 661 B |
|
Before Width: | Height: | Size: 900 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 900 B |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
|
@ -1,134 +0,0 @@
|
||||||
{
|
|
||||||
"images": [
|
|
||||||
{
|
|
||||||
"filename": "AppIcon@2x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon@3x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "3x",
|
|
||||||
"size": "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon@2x~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-83.5@2x~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "83.5x83.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-40@2x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-40@3x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "3x",
|
|
||||||
"size": "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-40~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-40@2x~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-20@2x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-20@3x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "3x",
|
|
||||||
"size": "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-20~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-20@2x~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-29.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-29@2x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-29@3x.png",
|
|
||||||
"idiom": "iphone",
|
|
||||||
"scale": "3x",
|
|
||||||
"size": "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-29~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-29@2x~ipad.png",
|
|
||||||
"idiom": "ipad",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-60@2x~car.png",
|
|
||||||
"idiom": "car",
|
|
||||||
"scale": "2x",
|
|
||||||
"size": "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon-60@3x~car.png",
|
|
||||||
"idiom": "car",
|
|
||||||
"scale": "3x",
|
|
||||||
"size": "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "AppIcon~ios-marketing.png",
|
|
||||||
"idiom": "ios-marketing",
|
|
||||||
"scale": "1x",
|
|
||||||
"size": "1024x1024"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info": {
|
|
||||||
"author": "iconkitchen",
|
|
||||||
"version": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 14 KiB |
|
|
@ -1,18 +0,0 @@
|
||||||
Add this to your HTML <head>:
|
|
||||||
|
|
||||||
<link rel="icon" href="/favicon.ico" sizes="any">
|
|
||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
|
||||||
|
|
||||||
Add this to your app's manifest.json:
|
|
||||||
|
|
||||||
...
|
|
||||||
{
|
|
||||||
"icons": [
|
|
||||||
{ "src": "/favicon.ico", "type": "image/x-icon", "sizes": "16x16 32x32" },
|
|
||||||
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
|
|
||||||
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" },
|
|
||||||
{ "src": "/icon-192-maskable.png", "type": "image/png", "sizes": "192x192", "purpose": "maskable" },
|
|
||||||
{ "src": "/icon-512-maskable.png", "type": "image/png", "sizes": "512x512", "purpose": "maskable" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
...
|
|
||||||
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#57CC99" d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 454 B |
37
generate_proto.sh
Executable file
|
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Set the source directory
|
||||||
|
|
||||||
|
SRC_DIR="../twonly-server/twonly/src/"
|
||||||
|
|
||||||
|
DST_DIR="$(pwd)/lib/src/proto/"
|
||||||
|
|
||||||
|
mkdir $DST_DIR
|
||||||
|
|
||||||
|
ORIGINAL_DIR=$(pwd)
|
||||||
|
|
||||||
|
cd "$SRC_DIR" || {
|
||||||
|
echo "Failed to change directory to $SRC_DIR"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Iterate over all .proto files in the source directory
|
||||||
|
for proto_file in "api/"*.proto; do
|
||||||
|
# Check if the file exists to avoid errors if no .proto files are found
|
||||||
|
|
||||||
|
if [[ -f "$proto_file" ]]; then
|
||||||
|
# Run the protoc command
|
||||||
|
protoc --proto_path="." --dart_out="$DST_DIR" "$proto_file"
|
||||||
|
echo "Processed: $proto_file"
|
||||||
|
else
|
||||||
|
echo "No .proto files found in $SRC_DIR"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Change back to the original directory
|
||||||
|
cd "$ORIGINAL_DIR" || {
|
||||||
|
echo "Failed to change back to the original directory"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Finished processing .proto files."
|
||||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 751 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 9.1 KiB |