lesson 16 and most of 18 (#67)

* Adding content

* Update en.json

* Update README.md

* Update TRANSLATIONS.md

* Adding lesson tempolates

* Fixing code files with each others code in

* Update README.md

* Adding lesson 16

* Adding virtual camera

* Adding Wio Terminal camera capture

* Adding wio terminal code

* Adding SBC classification to lesson 16

* Adding challenge, review and assignment

* Adding images and using new Azure icons

* Update README.md

* Update iot-reference-architecture.png

* Adding structure for JulyOT links

* Removing icons

* Sketchnotes!

* Create lesson-1.png

* Starting on lesson 18

* Updated sketch

* Adding virtual distance sensor

* Adding Wio Terminal image classification
pull/69/head
Jim Bennett 4 years ago committed by GitHub
parent 8cf84b34e2
commit eff54133b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,8 +1,8 @@
# Introduction to IoT # Introduction to IoT
Add a sketchnote if possible/appropriate ![A sketchnote overview of this lesson](../../../sketchnotes/lesson-1.png)
![Embed a video here if available](video-url) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
## Pre-lecture quiz ## Pre-lecture quiz

@ -24,7 +24,7 @@ Install the Arduino JSON library.
The next step is to create a JSON document with telemetry and send it to the MQTT broker. The next step is to create a JSON document with telemetry and send it to the MQTT broker.
### Task ### Task - publish telemetry
Publish telemetry to the MQTT broker. Publish telemetry to the MQTT broker.

@ -14,7 +14,7 @@ This is an analog sensor, so uses a simulated 10-bit ADC to report a value from
To use a virtual soil moisture sensor, you need to add it to the CounterFit app To use a virtual soil moisture sensor, you need to add it to the CounterFit app
#### Task #### Task - dd the soil moisture sensor to CounterFit
Add the soil moisture sensor to the CounterFit app. Add the soil moisture sensor to the CounterFit app.
@ -44,7 +44,7 @@ Add the soil moisture sensor to the CounterFit app.
The soil moisture sensor app can now be programmed using the CounterFit sensors. The soil moisture sensor app can now be programmed using the CounterFit sensors.
### Task ### Task - program the soil moisture sensor app
Program the soil moisture sensor app. Program the soil moisture sensor app.

@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

@ -0,0 +1,39 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the usual convention is to give header files names that end with `.h'.
It is most portable to use only letters, digits, dashes, and underscores in
header file names, and at most one dot.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

@ -0,0 +1,46 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into executable file.
The source code of each library should be placed in a an own separate directory
("lib/your_library_name/[here are source files]").
For example, see a structure of the following two libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
and a contents of `src/main.c`:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
PlatformIO Library Dependency Finder will find automatically dependent
libraries scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

@ -0,0 +1,26 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
lib_deps =
seeed-studio/Seeed Arduino rpcWiFi
seeed-studio/Seeed Arduino FS
seeed-studio/Seeed Arduino SFUD
seeed-studio/Seeed Arduino rpcUnified
seeed-studio/Seeed_Arduino_mbedtls
seeed-studio/Seeed Arduino RTC
bblanchon/ArduinoJson @ 6.17.3
build_flags =
-w
-DARDUCAM_SHIELD_V2
-DOV2640_CAM

@ -0,0 +1,160 @@
#pragma once
#include <ArduCAM.h>
#include <Wire.h>
class Camera
{
public:
Camera(int format, int image_size) : _arducam(OV2640, PIN_SPI_SS)
{
_format = format;
_image_size = image_size;
}
bool init()
{
// Reset the CPLD
_arducam.write_reg(0x07, 0x80);
delay(100);
_arducam.write_reg(0x07, 0x00);
delay(100);
// Check if the ArduCAM SPI bus is OK
_arducam.write_reg(ARDUCHIP_TEST1, 0x55);
if (_arducam.read_reg(ARDUCHIP_TEST1) != 0x55)
{
return false;
}
// Change MCU mode
_arducam.set_mode(MCU2LCD_MODE);
uint8_t vid, pid;
// Check if the camera module type is OV2640
_arducam.wrSensorReg8_8(0xff, 0x01);
_arducam.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
_arducam.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
if ((vid != 0x26) && ((pid != 0x41) || (pid != 0x42)))
{
return false;
}
_arducam.set_format(_format);
_arducam.InitCAM();
_arducam.OV2640_set_JPEG_size(_image_size);
_arducam.OV2640_set_Light_Mode(Auto);
_arducam.OV2640_set_Special_effects(Normal);
delay(1000);
return true;
}
void startCapture()
{
_arducam.flush_fifo();
_arducam.clear_fifo_flag();
_arducam.start_capture();
}
bool captureReady()
{
return _arducam.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK);
}
bool readImageToBuffer(byte **buffer, uint32_t &buffer_length)
{
if (!captureReady()) return false;
// Get the image file length
uint32_t length = _arducam.read_fifo_length();
buffer_length = length;
if (length >= MAX_FIFO_SIZE)
{
return false;
}
if (length == 0)
{
return false;
}
// create the buffer
byte *buf = new byte[length];
uint8_t temp = 0, temp_last = 0;
int i = 0;
uint32_t buffer_pos = 0;
bool is_header = false;
_arducam.CS_LOW();
_arducam.set_fifo_burst();
while (length--)
{
temp_last = temp;
temp = SPI.transfer(0x00);
//Read JPEG data from FIFO
if ((temp == 0xD9) && (temp_last == 0xFF)) //If find the end ,break while,
{
buf[buffer_pos] = temp;
buffer_pos++;
i++;
_arducam.CS_HIGH();
}
if (is_header == true)
{
//Write image data to buffer if not full
if (i < 256)
{
buf[buffer_pos] = temp;
buffer_pos++;
i++;
}
else
{
_arducam.CS_HIGH();
i = 0;
buf[buffer_pos] = temp;
buffer_pos++;
i++;
_arducam.CS_LOW();
_arducam.set_fifo_burst();
}
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
buf[buffer_pos] = temp_last;
buffer_pos++;
i++;
buf[buffer_pos] = temp;
buffer_pos++;
i++;
}
}
_arducam.clear_fifo_flag();
_arducam.set_format(_format);
_arducam.InitCAM();
_arducam.OV2640_set_JPEG_size(_image_size);
// return the buffer
*buffer = buf;
}
private:
ArduCAM _arducam;
int _format;
int _image_size;
};

@ -0,0 +1,49 @@
#pragma once
#include <string>
using namespace std;
// WiFi credentials
const char *SSID = "<SSID>";
const char *PASSWORD = "<PASSWORD>";
const char *PREDICTION_URL = "<PREDICTION_URL>";
const char *PREDICTION_KEY = "<PREDICTION_KEY>";
// Microsoft Azure DigiCert Global Root G2 global certificate
const char *CERTIFICATE =
"-----BEGIN CERTIFICATE-----\r\n"
"MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n"
"MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n"
"MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n"
"c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n"
"ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n"
"wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n"
"iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n"
"ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n"
"aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n"
"0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n"
"gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n"
"sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n"
"lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n"
"N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n"
"Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n"
"AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n"
"BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n"
"JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n"
"CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n"
"Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n"
"aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n"
"cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n"
"MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n"
"cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n"
"AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n"
"+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n"
"cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n"
"kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n"
"trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n"
"8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n"
"-----END CERTIFICATE-----\r\n";

@ -0,0 +1,125 @@
#include <Arduino.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <rpcWiFi.h>
#include "SD/Seeed_SD.h"
#include <Seeed_FS.h>
#include <SPI.h>
#include <WiFiClientSecure.h>
#include "config.h"
#include "camera.h"
Camera camera = Camera(JPEG, OV2640_640x480);
WiFiClientSecure client;
void setupCamera()
{
pinMode(PIN_SPI_SS, OUTPUT);
digitalWrite(PIN_SPI_SS, HIGH);
Wire.begin();
SPI.begin();
if (!camera.init())
{
Serial.println("Error setting up the camera!");
}
}
void connectWiFi()
{
while (WiFi.status() != WL_CONNECTED)
{
Serial.println("Connecting to WiFi..");
WiFi.begin(SSID, PASSWORD);
delay(500);
}
client.setCACert(CERTIFICATE);
Serial.println("Connected!");
}
void setup()
{
Serial.begin(9600);
while (!Serial)
; // Wait for Serial to be ready
delay(1000);
connectWiFi();
setupCamera();
pinMode(WIO_KEY_C, INPUT_PULLUP);
}
void classifyImage(byte *buffer, uint32_t length)
{
HTTPClient httpClient;
httpClient.begin(client, PREDICTION_URL);
httpClient.addHeader("Content-Type", "application/octet-stream");
httpClient.addHeader("Prediction-Key", PREDICTION_KEY);
int httpResponseCode = httpClient.POST(buffer, length);
if (httpResponseCode == 200)
{
String result = httpClient.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, result.c_str());
JsonObject obj = doc.as<JsonObject>();
JsonArray predictions = obj["predictions"].as<JsonArray>();
for(JsonVariant prediction : predictions)
{
String tag = prediction["tagName"].as<String>();
float probability = prediction["probability"].as<float>();
char buff[32];
sprintf(buff, "%s:\t%.2f%%", tag.c_str(), probability * 100.0);
Serial.println(buff);
}
}
httpClient.end();
}
void buttonPressed()
{
camera.startCapture();
while (!camera.captureReady())
delay(100);
Serial.println("Image captured");
byte *buffer;
uint32_t length;
if (camera.readImageToBuffer(&buffer, length))
{
Serial.print("Image read to buffer with length ");
Serial.println(length);
classifyImage(buffer, length);
delete (buffer);
}
}
void loop()
{
if (digitalRead(WIO_KEY_C) == LOW)
{
buttonPressed();
delay(2000);
}
delay(200);
}

@ -0,0 +1,11 @@
This directory is intended for PlatformIO Unit Testing and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/page/plus/unit-testing.html

@ -88,4 +88,4 @@ The Custom Vision service has a Python SDK you can use to classify images.
> 💁 You can find this code in the [code-classify/pi](code-classify/pi) or [code-classify/virtual-device](code-classify/virtual-device) folder. > 💁 You can find this code in the [code-classify/pi](code-classify/pi) or [code-classify/virtual-device](code-classify/virtual-device) folder.
😀 Your camera program was a success! 😀 Your fruit quality classifier program was a success!

@ -286,7 +286,9 @@ The Wio Terminal can now be programmed to capture an image when a button is pres
### Task - capture an image ### Task - capture an image
1. Microcontrollers run your code continuously, so it's not easy to trigger something like taking a photo without reacting to a sensor. The Wio Terminal has buttons, so the camera can be set up to be triggered by one of the buttons. Add the following code to the end of the `setup` function to configure the C button (one of the three buttons on the top, the one closest to the power switch): 1. Microcontrollers run your code continuously, so it's not easy to trigger something like taking a photo without reacting to a sensor. The Wio Terminal has buttons, so the camera can be set up to be triggered by one of the buttons. Add the following code to the end of the `setup` function to configure the C button (one of the three buttons on the top, the one closest to the power switch).
![The C button on the top closest to the power switch](../../../images/wio-terminal-c-button.png)
```cpp ```cpp
pinMode(WIO_KEY_C, INPUT_PULLUP); pinMode(WIO_KEY_C, INPUT_PULLUP);
@ -339,6 +341,7 @@ The Wio Terminal can now be programmed to capture an image when a button is pres
{ {
Serial.print("Image read to buffer with length "); Serial.print("Image read to buffer with length ");
Serial.println(length); Serial.println(length);
delete(buffer); delete(buffer);
} }
``` ```
@ -455,4 +458,4 @@ The Wio Terminal only supports microSD cards of up to 16GB in size. If you have
![A picture of a banana captured using the ArduCam](../../../images/banana-arducam.jpg) ![A picture of a banana captured using the ArduCam](../../../images/banana-arducam.jpg)
> 💁 It may take a few images for the white balance of the camera to adjust itself. You will notice this based on the color of the images captured, the first few may look off color. You can always work around this by changing the code to capture a few images that are ignored during the setup. > 💁 It may take a few images for the white balance of the camera to adjust itself. You will notice this based on the color of the images captured, the first few may look off color. You can always work around this by changing the code to capture a few images that are ignored in the `setup` function.

@ -1,3 +1,215 @@
# Classify an image - Wio Terminal # Classify an image - Wio Terminal
Coming soon! In this part of the lesson, you will add send the image captured by the camera to the Custom Vision service to classify it.
## Classify an image
The Custom Vision service has a REST API you can call from the Wio Terminal use to classify images. THis REST API is accessed over an HTTPS connection - a secure HTTP connection.
When interacting with HTTPS endpoints, the client code needs to request the public key certificate from the server being accessed, and use that to encrypt the traffic it sends. Your web browser does this automatically, but microcontrollers do not. You will need to request this certificate manually and use it to create a secure connection to the REST API. These certificates don't change, so once you have a certificate, it can be hard coded in your application.
These certificates contain public keys, and don't need to be kept secure. You can use them in your source code and share them in public on places like GitHub.
### Task - set up a SSL client
1. Open the `fruit-quality-detector` app project if it's not already open
1. Open the `config.h` header file, and add the following:
```cpp
const char *CERTIFICATE =
"-----BEGIN CERTIFICATE-----\r\n"
"MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n"
"MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n"
"MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n"
"c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n"
"ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n"
"wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n"
"iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n"
"ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n"
"aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n"
"0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n"
"gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n"
"sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n"
"lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n"
"N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n"
"Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n"
"AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n"
"BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n"
"JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n"
"CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n"
"Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n"
"aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n"
"cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n"
"MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n"
"cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n"
"AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n"
"+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n"
"cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n"
"kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n"
"trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n"
"8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n"
"-----END CERTIFICATE-----\r\n";
```
This is the *Microsoft Azure DigiCert Global Root G2 certificate* - it's one of the certificates used by many Azure services globally.
> 💁 To see that this is the certificate to use, run the following command on macOS or Linux. If you are using Windows, you can run this command using the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/windows/wsl/?WT.mc_id=academic-17441-jabenn):
>
> ```sh
> openssl s_client -showcerts -verify 5 -connect api.cognitive.microsoft.com:443
> ```
>
> The output will list the DigiCert Global Root G2 certificate.
1. Open `main.cpp` and add the following include directive:
```cpp
#include <WiFiClientSecure.h>
```
1. Below the include directives, declare an instance of `WifiClientSecure`:
```cpp
WiFiClientSecure client;
```
This class contains code to communicate with web endpoints over HTTPS.
1. In the `connectWiFi` method, set the WiFiClientSecure to use the DigiCert Global Root G2 certificate:
```cpp
client.setCACert(CERTIFICATE);
```
### Task - classify an image
1. Add the following as an additional line to the `lib_deps` list in the `platformio.ini` file:
```ini
bblanchon/ArduinoJson @ 6.17.3
```
This imports [ArduinoJson](https://arduinojson.org), an Arduino JSON library, and will be used to decode the JSON response from the REST API.
1. In `config.h`, add constants for the prediction URL and Key from the Custom Vision service:
```cpp
const char *PREDICTION_URL = "<PREDICTION_URL>";
const char *PREDICTION_KEY = "<PREDICTION_KEY>";
```
Replace `<PREDICTION_URL>` with the prediction URL from Custom Vision. Replace `<PREDICTION_KEY>` with the prediction key.
1. In `main.cpp`, add an include directive for the ArduinoJson library:
```cpp
#include <ArduinoJSON.h>
```
1. Add the following function to `main.cpp`, above the `buttonPressed` function.
```cpp
void classifyImage(byte *buffer, uint32_t length)
{
HTTPClient httpClient;
httpClient.begin(client, PREDICTION_URL);
httpClient.addHeader("Content-Type", "application/octet-stream");
httpClient.addHeader("Prediction-Key", PREDICTION_KEY);
int httpResponseCode = httpClient.POST(buffer, length);
if (httpResponseCode == 200)
{
String result = httpClient.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, result.c_str());
JsonObject obj = doc.as<JsonObject>();
JsonArray predictions = obj["predictions"].as<JsonArray>();
for(JsonVariant prediction : predictions)
{
String tag = prediction["tagName"].as<String>();
float probability = prediction["probability"].as<float>();
char buff[32];
sprintf(buff, "%s:\t%.2f%%", tag.c_str(), probability * 100.0);
Serial.println(buff);
}
}
httpClient.end();
}
```
This code starts by declaring an `HTTPClient` - a class that contains methods to interact with REST APIs. It then connects the client to the prediction URL using the `WiFiClientSecure` instance that was set up with the Azure public key.
Once connected, it sends headers - information about the upcoming request that will be made against the REST API. The `Content-Type` header indicates the API call will send raw binary data, the `Prediction-Key` header passes the Custom Vision prediction key.
Next a POST request is made to the HTTP client, uploading a byte array. This will contain the JPEG image captured from the camera when this function is called.
> 💁 POST request are meant for sending data, and getting a response. There are other request types such as GET requests that retrieve data. GET requests are used by your web browser to load web pages.
The POST request returns a response status code. These are well-defined values, with 200 meaning **OK** - the POST request was successful.
> 💁 You can see all the response status codes in the [List of HTTP status codes page on Wikipedia](https://wikipedia.org/wiki/List_of_HTTP_status_codes)
If a 200 is returned, the result is read from the HTTP client. This is a text response from the REST API with the results of the prediction as a JSON document. The JSON is in the following format:
```jSON
{
"id":"45d614d3-7d6f-47e9-8fa2-04f237366a16",
"project":"135607e5-efac-4855-8afb-c93af3380531",
"iteration":"04f1c1fa-11ec-4e59-bb23-4c7aca353665",
"created":"2021-06-10T17:58:58.959Z",
"predictions":[
{
"probability":0.5582016,
"tagId":"05a432ea-9718-4098-b14f-5f0688149d64",
"tagName":"ripe"
},
{
"probability":0.44179836,
"tagId":"bb091037-16e5-418e-a9ea-31c6a2920f17",
"tagName":"unripe"
}
]
}
```
The important part here is the `predictions` array. This contains the predictions, with one entry for each tag containing the tag name and the probability. The probabilities returned are floating point numbers from 0-1, with 0 being a 0% chance of matching the tag, and 1 being a 100% chance.
> 💁 Image classifiers will return the percentages for all tags that have been used. Each tag will have a probability that the image matches that tag.
This JSON is decoded, and the probabilities for each tag are sent to the serial monitor.
1. In the `buttonPressed` function, either replace the code that saves to the SD card with a call to `classifyImage`, or add it after the image is written, but **before** the buffer is deleted:
```cpp
classifyImage(buffer, length);
```
> 💁 If you replace the code that saves to the SD card you can clean up your code removing the `setupSDCard` and `saveToSDCard` functions.
1. Upload and run your code. Point the camera at some fruit and press the C button. You will see the output in the serial monitor:
```output
Connecting to WiFi..
Connected!
Image captured
Image read to buffer with length 8200
ripe: 56.84%
unripe: 43.16%
```
You will be able to see the image that was taken, and these values in the **Predictions** tab in Custom Vision.
![A banana in custom vision predicted ripe at 56.8% and unripe at 43.1%](../../../images/custom-vision-banana-prediction.png)
> 💁 You can find this code in the [code-classify/wio-terminal](code-classify/wio-terminal) folder.
😀 Your fruit quality classifier program was a success!

@ -12,46 +12,215 @@ Add a sketchnote if possible/appropriate
An IoT application is not just a single device capturing data and sending it to the cloud, it is more often that not multiple devices all working together to capture data from the physical world using sensors, make decisions based off that data, and interacting back with the physical world via actuators or visualizations. An IoT application is not just a single device capturing data and sending it to the cloud, it is more often that not multiple devices all working together to capture data from the physical world using sensors, make decisions based off that data, and interacting back with the physical world via actuators or visualizations.
In this lesson you will learn more about architecting complex IoT applications, incorporating multiple sensors, multiple cloud services to analyze and store data, and showing a response via an actuator. You will piece together a more advanced fruit quality tracking system. In this lesson you will learn more about architecting complex IoT applications, incorporating multiple sensors, multiple cloud services to analyze and store data, and showing a response via an actuator. You will learn how to architect a fruit quality control system prototype, including about using proximity sensors to trigger the IoT application, and what the architecture of this prototype would be.
In this lesson we'll cover: In this lesson we'll cover:
* [Architect complex IoT applications](#architect-complex-iot-applications) * [Architect complex IoT applications](#architect-complex-iot-applications)
* [Design a fruit quality control system](#design-a-fruit-quality-control-system) * [Design a fruit quality control system](#design-a-fruit-quality-control-system)
* [Trigger fruit quality checking from a sensor](#trigger-fruit-quality-checking-from-a-sensor) * [Trigger fruit quality checking from a sensor](#trigger-fruit-quality-checking-from-a-sensor)
* [Store fruit quality data](#store-fruit-quality-data) * [Data used for a fruit quality detector](#data-used-for-a-fruit-quality-detector)
* [Control feedback via an actuator](#control-feedback-via-an-actuator) * [Using developer devices to simulate multiple IoT devices](#using-developer-devices-to-simulate-multiple-iot-devices)
* [Moving to production](#moving-to-production)
## Architect complex IoT applications ## Architect complex IoT applications
IoT applications are made up of many components. This includes a variety of things, and a variety of internet services.
IoT applications can be described as *things* (devices) sending data that generates *insights*. These *insights* generate *actions* to improve a business or process. An example is an engine (the thing) sending temperature data. This data is used to evaluate whether the engine is performing as expected (the insight). The insight is used to proactively prioritize the maintenance schedule for the engine (the action).
* Different things gather different pieces of data.
* IoT services give insights over that data, sometimes augmenting it with data from additional sources.
* These insights drive actions, including controlling actuators in devices, or visualizing data.
### Reference IoT architecture
![A reference iot architecture](../../../images/iot-reference-architecture.png) ![A reference iot architecture](../../../images/iot-reference-architecture.png)
***A reference iot architecture. LED by abderraouf omara / Microcontroller by Template - all from the [Noun Project](https://thenounproject.com)*** ***A reference iot architecture. Microcontroller by Template / IoT by Adrien Coquet / Brain by Icon Market - all from the [Noun Project](https://thenounproject.com)***
The diagram above shows a reference IoT architecture.
> 🎓 A *reference architecture* is an example architecture you can use as a reference when designing new systems. In this case, if you were building a new IoT system you can follow the reference architecture, substituting your own devices and services where appropriate.
* **Things** are devices that gather data from sensors, maybe interacting with edge services to interpret that data, such as image classifiers to interpret image data. The data from the devices is sent to an IoT service.
* **Insights** come from serverless applications, or from analytics run on stored data.
* **Actions** can be commands sent to devices, or visualization of data allowing humans to make decisions.
![A reference iot architecture](../../../images/iot-reference-architecture-azure.png)
***A reference iot architecture. Microcontroller by Template - all from the [Noun Project](https://thenounproject.com)***
The diagram above shows some of the components and services covered so far in these lessons and how the link together in a reference IoT architecture.
* **Things** - you've written device code to capture data from sensors, and analyse images using Custom Vision running both in the cloud and on an edge device. This data was sent to IoT Hub.
* **Insights** - you've used Azure Functions to respond to messages sent to an IoT Hub, and stored data for later analysis in Azure Storage.
* **Actions** - you've controlled actuators based on decisions made in the cloud and commands sent to the devices, and you've visualized data using Azure Maps.
✅ Think about other IoT devices you have used, such as smart home appliances. What are the things, insights and actions involved in that device and it's software?
This pattern can be scaled out as large or small as you need, adding more devices and more services.
### Data and security
As you define the architecture of your system, you need to constantly consider data and security.
* What data does your device send and receive?
* How should that data be secured and protected?
* How should access to the device and cloud service be controlled?
✅ Think about the data security of any IoT devices you own. How much of that data is personal and should be kept private, both in transit or when stored? What data should not be stored?
## Design a fruit quality control system ## Design a fruit quality control system
Lets now take this idea of things, insights, and actions and apply it to our fruit quality detector to design a larger end-to-end application.
Imagine you have been given the task of building a fruit quality detector to be used in a processing plant. Fruit travels on a conveyer belt system where currently employees spend time checking the fruit by hand and removing any unripe fruit as it arrives. To reduce costs, the plant owner wants an automated system.
✅ One of the trends with the rise of IoT (and technology in general) is that manual jobs are being replaced by machines. Do some research: How many jobs are estimated to be lost to IoT? How many new jobs will be created building IoT devices?
You need to build a system where fruit is detected as it arrives on the conveyer belt, it is then photographed and checked using an AI model running on the edge. The results are then sent to the cloud to be stored, and if the fruit is unripe a notification is given so the unripe fruit can be removed.
| | |
| - | - |
| **Things** | Detector for fruit arriving on the conveyor belt<br>Camera to photograph and classify the fruit<br>Edge device running the classifier<br>Device to notify of unripe fruit |
| **Insights** | Decide to check the ripeness of the fruit<br>Store the results of the ripeness classification<br>Determine if there is a need to alert about unripe fruit |
| **Actions** | Send a command to a device to photograph the fruit and check it with an image classifier<br>Send a command to a device to alert that the fruit is unripe |
### Prototyping your application
![A reference iot architecture for fruit quality checking](../../../images/iot-reference-architecture-fruit-quality.png) ![A reference iot architecture for fruit quality checking](../../../images/iot-reference-architecture-fruit-quality.png)
***A reference iot architecture for fruit quality checking. LED by abderraouf omara / Microcontroller by Template - all from the [Noun Project](https://thenounproject.com)*** ***A reference iot architecture for fruit quality checking. LED by abderraouf omara / Microcontroller by Template - all from the [Noun Project](https://thenounproject.com)***
The diagram above shows a reference architecture for this prototype application.
* An IoT device with a proximity sensor detects the arrival of fruit. This sends a message to the cloud to say fruit has been detected.
* A serverless application in the cloud sends a command to another device to take a photograph and classify the image.
* An IoT device with a camera takes a picture and sends it to an image classifier running on the edge. The results are then sent to the cloud.
* A serverless application in the cloud stores this information to be analyzed later to see what percentage of fruit is unripe. If the fruit is unripe it sends a command to another iot device to alert factory workers there is unripe fruit via an LED.
> 💁 This entire IoT application could be implemented as a single device, with all the logic to start the image classification and control the LED built in. It could use an IoT Hub just to track the number of unripe fruits detected and configure the device. In this lesson it is expanded to demonstrate the concepts for large scale IoT applications.
For the prototype, you will implement all of this on a single device. If you are using a microcontroller then you will use a separate edge device to run the image classifier. You have already learned most of the things you will need to be able to build this.
## Trigger fruit quality checking from a sensor ## Trigger fruit quality checking from a sensor
The IoT device needs some kind of trigger to indicate when fruit is ready to be classified. One trigger for this would be to measure when the fruit is at the right location on the conveyor belt my measuring the distance to a sensor.
![Proximity sensors send laser beams to objects like bananas and time how long till the beam is bounced back](../../../images/proximity-sensor.png)
***Proximity sensors send laser beams to objects like bananas and time how long till the beam is bounced back. Bananas by abderraouf omara / Microcontroller by Template - all from the [Noun Project](https://thenounproject.com)***
Proximity sensors can be used to measure the distance from the sensor to an object. They usually transmit a beam of electromagnetic radiation such as a laser beam or infra-red light, then detect the radiation bouncing off an object. The time between the laser beam being sent and the signal bouncing back can be used to calculate the distance to the sensor.
> 💁 You have probably used proximity sensors without even knowing about it. Most smartphone will turn the screen off when you hold them to your ear to stop you accidentally ending a call with your earlobe, and this works using a proximity sensor, detecting an object close to the screen during a call and disabling the touch capabilities until the phone is a certain distance away.
### Task - trigger fruit quality detection from a distance sensor ### Task - trigger fruit quality detection from a distance sensor
## Store fruit quality data Work through the relevant guide to use a proximity sensor to detect an object using your IoT device:
## Control feedback via an actuator * [Arduino - Wio Terminal](wio-terminal-proximity.md)
* [Single-board computer - Raspberry Pi](pi-proximity.md)
* [Single-board computer - Virtual device](virtual-device-proximity.md)
## Data used for a fruit quality detector
The prototype fruit detector has multiple components communicating with each other.
![The components communicating with each other](../../../images/fruit-quality-detector-message-flow.png)
* A proximity sensor measuring the distance to a piece of fruit and sending this to IoT Hub
* The command to control the camera coming from IoT Hub to the camera device
* The results of the image classification being sent to IoT Hub
* The command to control an LED to alert when the fruit is unripe being sent from IoT Hub to the device with the LED
It is good to define the structure of these messages up front, before you build out the application.
> 💁 Pretty much every experienced developer has at some point in their career spent hours, days or even weeks chasing down bugs caused by differences in the data being sent compared to what is expected.
For example - if you are sending temperature information, how would you define the JSON? You could have a field called `temperature`, or you could use the common abbreviation `temp`.
```json
{
"temperature": 20.7
}
```
compared to:
```json
{
"temp": 20.7
}
```
You also have to consider units - is the temperature in °C or °F? If you are measuring temperature using a consumer device and they change the display units, you need to make sure the units sent to the cloud remain consistent.
✅ Do some research: How did unit problems cause the $125 million Mars Climate Orbiter to crash?
Think about the data being sent for the fruit quality detector. How would you define each message? Where would you analyze the data and make decisions about what data to send?
For example - triggering the image classification using the proximity sensor. The IoT device measures the distance, but where is the decision made? Does the device decide that the fruit is close enough and sends a message to tell the IoT Hub to trigger the classification? Or does it send proximity measurements and let the IoT Hub decide?
The answer to questions like this is - it depends. Each use case is different, which is why as an IoT developer you need to understand the system you are building, how it is used, and the data being detected.
* If the decision is made by the IoT Hub, you need to send multiple distance measurements.
* If you send too many messages, it increases the cost of the IoT Hub, and the amount of bandwidth needed by your IoT devices (especially in a factory with millions of devices). It can also slow down your device.
* If you make the decision on the device, you will need to provide a way to configure the device to fine tune the machine.
## Using developer devices to simulate multiple IoT devices
To build your prototype, you will need your IoT dev kit to act like multiple devices, sending telemetry and responding to commands.
### Simulating multiple IoT devices on a Raspberry Pi or virtual IoT hardware
When using a single board computer like a Raspberry Pi, you are able to run multiple applications at once. This means you can simulate multiple IoT devices by creating multiple applications, one per 'IoT device'. For example, you can implement each device as a separate Python file and run them in different terminal sessions.
> 💁 Be aware that some hardware won't work when being accessed by multiple applications running simultaneously.
### Simulating multiple devices on a microcontroller
Microcontrollers are more complicated to simulate multiple devices. Unlike single board computers you cannot run multiple applications at once, you have to include all the logic for all the separate IoT devices in a single application.
Some suggestions to make this process easier are:
* Create one or more classes per IoT device - for example classes called `DistanceSensor`, `ClassifierCamera`, `LEDController`. Each one can have it's own `setup` and `loop` methods called by the main `setup` and `loop` functions.
* Handle commands in a single place, and direct them to the relevant device class as required.
* In the main `loop` function, you will need to consider the timing for each different device. For example, if you have one device class that needs to process every 10 seconds, and another that needs to process every 1 second, then in your main `loop` function use a 1 second delay. Every `loop` call triggers the relevant code for the device that needs to process every second, and use a counter to count each loop, processing the other device when the counter reaches 10 (resetting the counter afterwards).
## Moving to production
The prototype will form the basis of a final production system. Some of the differences when you move to production would be:
* Ruggedized components - using hardware designed to withstand the noise, heat, vibration and stress of a factory.
* Using internal communications - some of the components would communicate directly avoiding the hop to the cloud, only sending data to the cloud to be stored. How this is done depends on the factory setup, with either direct communications, or by running part of the IoT service on the edge using a gateway device.
* Configuration options - each factory and use case is different, so the hardware would need to be configurable. For example, the proximity sensor may need to detect different fruit at different distances. Rather than hard code the distance to trigger the classification, you would want this to be configurable via the could, for example using a device twin
* Automated fruit removal - instead of an LED to alert that fruit is unripe, automated devices would remove it.
✅ Do some research: In what other ways would production devices differ from developer kits?
--- ---
## 🚀 Challenge ## 🚀 Challenge
In this lesson you have learned some of the concepts you need to know to architect an IoT system. Think back to the previous projects. How would do they fit into the reference architecture shown above?
Pick one of the projects so far and think of the design of a more complicated solution bringing together multiple capabilities beyond what was covered in the projects. Draw the architecture and think of all the devices and services you would need.
For example - a vehicle tracking device that combines GPS with sensors to monitor things like temperatures in a refrigerated truck, the engine on and off times, and the identity of the driver. What are the devices involved, the services involved, the data being transmitted and the security and privacy considerations?
## Post-lecture quiz ## Post-lecture quiz
[Post-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/36) [Post-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/36)
## Review & Self Study ## Review & Self Study
* Read more about IoT architecture on the [Azure IoT reference architecture documentation on Microsoft docs](https://docs.microsoft.com/azure/architecture/reference-architectures/iot?WT.mc_id=academic-17441-jabenn)
* Read more about device twins in the [Understand and use device twins in IoT Hub documentation on Microsoft docs](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-device-twins?WT.mc_id=academic-17441-jabenn)
* Read about OPC-UA, a machine to machine communication protocol used in industrial automation on the [OPC-UA page on Wikipedia](https://wikipedia.org/wiki/OPC_Unified_Architecture)
## Assignment ## Assignment
[](assignment.md) [Build a fruit quality detector](assignment.md)

@ -1,9 +1,18 @@
# # Build a fruit quality detector
## Instructions ## Instructions
Build the fruit quality detector!
Take everything you have learned so far and build the prototype fruit quality detector. Trigger image classification based off proximity using an AI model running on the edge, store the results of the classification in storage, and control an LED based off the ripeness of the fruit.
You should be able to piece this together using code you have previously written in all the lessons so far.
## Rubric ## Rubric
| Criteria | Exemplary | Adequate | Needs Improvement | | Criteria | Exemplary | Adequate | Needs Improvement |
| -------- | --------- | -------- | ----------------- | | -------- | --------- | -------- | ----------------- |
| | | | | | Configure all the services | Was able to set up an IoT Hub, Azure functions application and Azure storage | Was able to set up the IoT Hub, but not either the Azure functions app or Azure storage | Was unable to set up any internet IoT services |
| Monitor proximity and send the data to IoT Hub if an object is closer than a pre-defined distance and trigger the camera via a command | Was able to measure distance and send a message to an IoT Hub when an object is close enough, and have a command send to trigger the camera | Was able to measure proximity and send to IoT Hub, but unable to get a command sent to the camera | Was unable to measure distance and send a message to IoT Hub, or trigger a command |
| Capture an image, classify it and send the results to IoT Hub | Was able to capture an image, classify it using an edge device and send the results to IoT Hub | Was able to classify the image but not using an edge device, or was unable to send the results to IoT Hub | Was unable to classify an image |
| Turn the LED on or off depending on the results of the classification using a command sent to a device | Was able to turn an LED on via a command if the fruit was unripe | Was able to send the command to the device but not control the LED | Was unable to send a command to control the LED |

@ -0,0 +1,11 @@
import time
from grove.i2c import Bus
from rpi_vl53l0x.vl53l0x import VL53L0X
distance_sensor = VL53L0X(bus = Bus().bus)
distance_sensor.begin()
while True:
distance_sensor.wait_ready()
print(f'Distance = {distance_sensor.get_distance()} mm')
time.sleep(1)

@ -0,0 +1,14 @@
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
import time
from counterfit_shims_rpi_vl53l0x.vl53l0x import VL53L0X
distance_sensor = VL53L0X()
distance_sensor.begin()
while True:
distance_sensor.wait_ready()
print(f'Distance = {distance_sensor.get_distance()} mm')
time.sleep(1)

@ -0,0 +1,98 @@
# Detect proximity - Raspberry Pi
In this part of the lesson, you will add a proximity sensor to your Raspberry Pi, and read distance from it.
## Hardware
The Raspberry Pi needs a proximity sensor.
The sensor you'll use is a [Grove Time of Flight distance sensor](https://www.seeedstudio.com/Grove-Time-of-Flight-Distance-Sensor-VL53L0X.html). This sensor uses a laser ranging module to detect distance. This sensor has a range of 10mm to 2000mm (1cm - 2m), and will report values in that range pretty accurately, with distances above 1000mm reported as 8109mm.
The laser rangefinder is on the back of the sensor, the opposite side to the Grove socket.
This is an I<sup>2</sup>C sensor.
### Connect the time of flight sensor
The Grove time of flight sensor can be connected to the Raspberry Pi.
#### Task - connect the time of flight sensor
Connect the time of flight sensor.
![A grove time of flight sensor](../../../images/grove-time-of-flight-sensor.png)
1. Insert one end of a Grove cable into the socket on the time of flight sensor. It will only go in one way round.
1. With the Raspberry Pi powered off, connect the other end of the Grove cable to one of the I<sup>2</sup>C sockets marked **I<sup>2</sup>C** on the Grove Base hat attached to the Pi. These sockets are on the bottom row, the opposite end to the GPI pins and next to the camera cable slot.
![The grove time of flight sensor connected to the I squared C socket](../../../images/pi-time-of-flight-sensor.png)
## Program the time of flight sensor
The Raspberry Pi can now be programmed to use the attached time of flight sensor.
### Task - program the time of flight sensor
Program the device.
1. Power up the Pi and wait for it to boot.
1. Open the `fruit-quality-detector` code in VS Code, either directly on the Pi, or connect via the Remote SSH extension.
1. Create a new file in this project called `distance-sensor.py`.
> 💁 An easy way to simulate multiple IoT devices is to do each in a different Python file, then run them at the same time.
1. Add the following code to this file:
```python
import time
from grove.i2c import Bus
from rpi_vl53l0x.vl53l0x import VL53L0X
```
This imports the Grove I<sup>2</sup>C bus library, and a sensor library for the core sensor hardware built into the Grove time of flight sensor.
1. Below this, add the following code to access the sensor:
```python
distance_sensor = VL53L0X(bus = Bus().bus)
distance_sensor.begin()
```
This code declares a distance sensor using the Grove I<sup>2</sup>C bus, then starts the sensor.
1. Finally, add an infinite loop to read distances:
```python
while True:
distance_sensor.wait_ready()
print(f'Distance = {distance_sensor.get_distance()} mm')
time.sleep(1)
```
This code waits for a value to be ready to read from the sensor, then prints it to the console.
1. Run this code.
> 💁 Don't forget this file is called `distance-sensor.py`! Make sure to run this via Python, not `app.py`.
1. You will see distance measurements appear in the console. Position objects near the sensor and you will see the distance measurement:
```output
pi@raspberrypi:~/fruit-quality-detector $ python3 distance_sensor.py
Distance = 29 mm
Distance = 28 mm
Distance = 30 mm
Distance = 151 mm
```
The rangefinder is on the back of the sensor, so make sure you use hte correct side when measuring distance.
![The rangefinder on the back of the time of flight sensor pointing at a banana](../../../images/time-of-flight-banana.png)
> 💁 You can find this code in the [code-proximity/pi](code-proximity/pi) folder.
😀 Your proximity sensor program was a success!

@ -0,0 +1,107 @@
# Detect proximity - Virtual IoT Hardware
In this part of the lesson, you will add a proximity sensor to your virtual IoT device, and read distance from it.
## Hardware
The virtual IoT device will use a simulated distance sensor.
In a physical IoT device you would use a sensor with a laser ranging module to detect distance.
### Add the distance sensor to CounterFit
To use a virtual distance sensor, you need to add one to the CounterFit app
#### Task - add the distance sensor to CounterFit
Add the distance sensor to the CounterFit app.
1. Open the `fruit-quality-detector` code in VS Code, and make sure the virtual environment is activated.
1. Install an additional Pip package to install a CounterFit shim that can talk to distance sensors by simulating the [rpi-vl53l0x Pip package](https://pypi.org/project/rpi-vl53l0x/), a Python package that interacts with [a VL53L0X time-of-flight distance sensor](https://wiki.seeedstudio.com/Grove-Time_of_Flight_Distance_Sensor-VL53L0X/). Make sure you are installing this from a terminal with the virtual environment activated.
```sh
pip install counterfit-shims-rpi-vl53l0x
```
1. Make sure the CounterFit web app is running
1. Create a distance sensor:
1. In the *Create sensor* box in the *Sensors* pane, drop down the *Sensor type* box and select *Distance*.
1. Leave the *Units* as `Millimeter`
1. This sensor is an I<sup>2</sup>C sensor, so set the address to `0x29`. If you used a physical VL53L0X sensor it would be hardcoded to this address.
1. Select the **Add** button to create the distance sensor
![The distance sensor settings](../../../images/counterfit-create-distance-sensor.png)
The distance sensor will be created and appear in the sensors list.
![The distance sensor created](../../../images/counterfit-distance-sensor.png)
## Program the distance sensor
The virtual IoT device can now be programmed to use the simulated distance sensor.
### Task - program the time of flight sensor
1. Create a new file in the `fruit-quality-detector` project called `distance-sensor.py`.
> 💁 An easy way to simulate multiple IoT devices is to do each in a different Python file, then run them at the same time.
1. Start a connection to CounterFit with the following code:
```python
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
```
1. Add the following code below this:
```python
import time
from counterfit_shims_rpi_vl53l0x.vl53l0x import VL53L0X
```
This imports the sensor library shim for the VL53L0X time of flight sensor.
1. Below this, add the following code to access the sensor:
```python
distance_sensor = VL53L0X()
distance_sensor.begin()
```
This code declares a distance sensor, then starts the sensor.
1. Finally, add an infinite loop to read distances:
```python
while True:
distance_sensor.wait_ready()
print(f'Distance = {distance_sensor.get_distance()} mm')
time.sleep(1)
```
This code waits for a value to be ready to read from the sensor, then prints it to the console.
1. Run this code.
> 💁 Don't forget this file is called `distance-sensor.py`! Make sure to run this via Python, not `app.py`.
1. You will see distance measurements appear in the console. Change the value in CounterFit to see this value change, or use random values.
```output
(.venv) ➜ fruit-quality-detector python distance-sensor.py
Distance = 37 mm
Distance = 42 mm
Distance = 29 mm
```
> 💁 You can find this code in the [code-proximity/virtual-iot-device](code-proximity/virtual-iot-device) folder.
😀 Your proximity sensor program was a success!

@ -0,0 +1,40 @@
# Detect proximity - Wio Terminal
In this part of the lesson, you will add a proximity sensor to your Wio Terminal, and read distance from it.
## Hardware
The Wio Terminal needs a proximity sensor.
The sensor you'll use is a [Grove Time of Flight distance sensor](https://www.seeedstudio.com/Grove-Time-of-Flight-Distance-Sensor-VL53L0X.html). This sensor uses a laser ranging module to detect distance. This sensor has a range of 10mm to 2000mm (1cm - 2m), and will report values in that range pretty accurately, with distances above 1000mm reported as 8109mm.
The laser rangefinder is on the back of the sensor, the opposite side to the Grove socket.
This is an I<sup>2</sup>C sensor.
### Connect the time of flight sensor
The Grove time of flight sensor can be connected to the Wio Terminal.
#### Task - connect the time of flight sensor
Connect the time of flight sensor.
![A grove time of flight sensor](../../../images/grove-time-of-flight-sensor.png)
1. Insert one end of a Grove cable into the socket on the time of flight sensor. It will only go in one way round.
1. With the Wio Terminal disconnected from your computer or other power supply, connect the other end of the Grove cable to the left-hand side Grove socket on the Wio Terminal as you look at the screen. This is the socket closest to from the power button. This is a combined digital and I<sup>2</sup>C socket.
![The grove time of flight sensor connected to the left hand socket](../../../images/wio-time-of-flight-sensor.png)
1. You can now connect the Wio Terminal to your computer.
## Program the time of flight sensor
The Wio Terminal can now be programmed to use the attached time of flight sensor.
### Task - program the time of flight sensor
1. Create a brand new Wio Terminal project using PlatformIO. Call this project `distance-sensor`. Add code in the `setup` function to configure the serial port.

@ -20,7 +20,7 @@ The projects cover the journey of food from farm to table. This includes farming
![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](sketchnotes/Roadmap.png) ![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](sketchnotes/Roadmap.png)
**Hearty thanks to our authors [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), and sketchnote artist [Nitya Narasimhan](https://github.com/nitya)** **Hearty thanks to our authors [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), and sketchnote artist [Nitya Narasimhan](https://github.com/nitya)**
> **Teachers**, we have [included some suggestions](for-teachers.md) on how to use this curriculum. If you would like to create your own lessons, we have also included a [lesson template](lesson-template/README.md). > **Teachers**, we have [included some suggestions](for-teachers.md) on how to use this curriculum. If you would like to create your own lessons, we have also included a [lesson template](lesson-template/README.md).

@ -46,7 +46,7 @@ These are specific to using the Raspberry Pi, and are not relevant to using the
* [Raspberry Pi Camera module](https://www.raspberrypi.org/products/camera-module-v2/) * [Raspberry Pi Camera module](https://www.raspberrypi.org/products/camera-module-v2/)
* Microphone and speaker: * Microphone and speaker:
* Any USB Microphone * Any USB Microphone
* Any USB speaker, or speaker with a 3.5mm cable * Any USB speaker, or speaker with a 3.5mm cable, or using HDMI audio if your Raspberry Pi is connected to a monitor with speakers
or or
* [USB Speakerphone](https://www.amazon.com/USB-Speakerphone-Conference-Business-Microphones/dp/B07Q3D7F8S/ref=sr_1_1?dchild=1&keywords=m0&qid=1614647389&sr=8-1) * [USB Speakerphone](https://www.amazon.com/USB-Speakerphone-Conference-Business-Microphones/dp/B07Q3D7F8S/ref=sr_1_1?dchild=1&keywords=m0&qid=1614647389&sr=8-1)
* [Grove Sunlight sensor](https://www.seeedstudio.com/Grove-Sunlight-Sensor.html) * [Grove Sunlight sensor](https://www.seeedstudio.com/Grove-Sunlight-Sensor.html)
@ -60,7 +60,7 @@ Most of the sensors and actuators needed are used by both the Arduino and Raspbe
* [Grove capacitive soil moisture sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html) * [Grove capacitive soil moisture sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html)
* [Grove relay](https://www.seeedstudio.com/Grove-Relay.html) * [Grove relay](https://www.seeedstudio.com/Grove-Relay.html)
* [Grove GPS (Air530)](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html) * [Grove GPS (Air530)](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html)
* [Grove - Ultrasonic Distance Sensor](https://www.seeedstudio.com/Grove-Ultrasonic-Distance-Sensor.html) * [Grove - Time of flight Distance Sensor](https://www.seeedstudio.com/Grove-Time-of-Flight-Distance-Sensor-VL53L0X.html)
## Optional hardware ## Optional hardware

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 125" enable-background="new 0 0 100 100" xml:space="preserve"><ellipse cx="48.788" cy="32.817" rx="25.256" ry="8.817"/><path d="M81.165,52.671c0,7.388-14.023,13.171-31.93,13.171c-17.905,0-31.929-5.783-31.929-13.171c0-2.148,1.206-4.26,3.488-6.099 v2.435c-1.13,1.192-1.695,2.42-1.695,3.664c0,6.169,13.8,11.378,30.136,11.378c16.337,0,30.137-5.209,30.137-11.378 c0-1.834-1.26-3.399-2.641-4.556v-2.242C79.632,47.887,81.165,50.236,81.165,52.671z"/><path d="M74.044,36.702c0,4.87-11.309,8.818-25.256,8.818c-13.948,0-25.256-3.948-25.256-8.818v15.244 c0,4.869,11.308,8.817,25.256,8.817c13.948,0,25.256-3.948,25.256-8.817V36.702z"/><path d="M49.834,72.629c-12.61,0-24.72-1.838-34.1-5.175C6.018,63.997,0.667,59.402,0.667,54.519c0-4.604,4.513-8.321,13.412-11.047 c0.946-0.29,1.95,0.241,2.24,1.189c0.291,0.947-0.242,1.95-1.188,2.24c-6.913,2.118-10.876,4.895-10.876,7.619 c0,5.922,17.756,14.524,45.58,14.524c27.823,0,45.58-8.603,45.58-14.524c0-2.635-3.75-5.345-10.287-7.434 c-0.942-0.302-1.464-1.311-1.162-2.254s1.312-1.463,2.254-1.162C94.7,46.379,99,50.029,99,54.519c0,4.884-5.352,9.479-15.067,12.936 C74.554,70.791,62.443,72.629,49.834,72.629z"/><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Dan Hetteix</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 80 100" style="enable-background:new 0 0 80 80;" xml:space="preserve"><g><circle cx="24" cy="24" r="2"/><circle cx="56" cy="24" r="2"/><circle cx="24" cy="56" r="2"/><circle cx="56" cy="56" r="2"/><path d="M52,27H28c-0.5522,0-1,0.4478-1,1v24c0,0.5522,0.4478,1,1,1h24c0.5522,0,1-0.4478,1-1V28C53,27.4478,52.5522,27,52,27z M51,51H29V29h22V51z"/><path d="M67,34c0.5522,0,1-0.4478,1-1s-0.4478-1-1-1h-5v-5h5c0.5522,0,1-0.4478,1-1s-0.4478-1-1-1h-5v-6c0-0.5522-0.4478-1-1-1h-6 v-5c0-0.5522-0.4478-1-1-1s-1,0.4478-1,1v5h-5v-5c0-0.5522-0.4478-1-1-1s-1,0.4478-1,1v5h-5v-5c0-0.5522-0.4478-1-1-1 s-1,0.4478-1,1v5h-5v-5c0-0.5522-0.4478-1-1-1s-1,0.4478-1,1v5h-5v-5c0-0.5522-0.4478-1-1-1s-1,0.4478-1,1v5h-6 c-0.5522,0-1,0.4478-1,1v6h-5c-0.5522,0-1,0.4478-1,1s0.4478,1,1,1h5v5h-5c-0.5522,0-1,0.4478-1,1s0.4478,1,1,1h5v5h-5 c-0.5522,0-1,0.4478-1,1s0.4478,1,1,1h5v5h-5c-0.5522,0-1,0.4478-1,1s0.4478,1,1,1h5v5h-5c-0.5522,0-1,0.4478-1,1s0.4478,1,1,1h5v6 c0,0.5522,0.4478,1,1,1h6v5c0,0.5522,0.4478,1,1,1s1-0.4478,1-1v-5h5v5c0,0.5522,0.4478,1,1,1s1-0.4478,1-1v-5h5v5 c0,0.5522,0.4478,1,1,1s1-0.4478,1-1v-5h5v5c0,0.5522,0.4478,1,1,1s1-0.4478,1-1v-5h5v5c0,0.5522,0.4478,1,1,1s1-0.4478,1-1v-5h6 c0.5522,0,1-0.4478,1-1v-6h5c0.5522,0,1-0.4478,1-1s-0.4478-1-1-1h-5v-5h5c0.5522,0,1-0.4478,1-1s-0.4478-1-1-1h-5v-5h5 c0.5522,0,1-0.4478,1-1s-0.4478-1-1-1h-5v-5H67z M60,60H20V20h40V60z"/></g><text x="0" y="95" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Icon Lauk</text><text x="0" y="100" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" version="1.1" style="shape-rendering:geometricPrecision;text-rendering:geometricPrecision;image-rendering:optimizeQuality;" viewBox="0 0 474.24 524.55" x="0px" y="0px" fill-rule="evenodd" clip-rule="evenodd"><defs><style type="text/css">
.fil0 {fill:black}
.fil1 {fill:black;fill-rule:nonzero}
</style></defs><g><path class="fil0" d="M62.04 23.99l12.92 0 0 28.58c0,14.08 11.48,25.56 25.56,25.56 14.08,0 25.56,-11.48 25.56,-25.56l0 -28.58 124.65 0 0 28.58c0,14.08 11.48,25.56 25.56,25.56 14.08,0 25.56,-11.48 25.56,-25.56l0 -28.58 12.92 0c34.12,0 62.04,27.92 62.04,62.04l0 122.62c54.51,4.2 97.43,49.75 97.43,105.34 0,58.35 -47.31,105.65 -105.66,105.65 -36.39,0 -68.49,-18.4 -87.49,-46.41l-219.05 0c-34.12,0 -62.04,-27.92 -62.04,-62.04l0 -225.16c0,-34.12 27.92,-62.04 62.04,-62.04zm292.94 185.21l0 -105.94 -333.15 0 0 207.93c0,22.12 18.09,40.21 40.21,40.21l207.71 0c-4.4,-11.63 -6.82,-24.24 -6.82,-37.41 0,-53.74 40.13,-98.11 92.05,-104.79zm13.6 20.96c-46.29,0 -83.82,37.53 -83.82,83.83 0,46.29 37.53,83.82 83.82,83.82 46.3,0 83.83,-37.53 83.83,-83.82 0,-46.3 -37.53,-83.83 -83.83,-83.83z"/><path class="fil0" d="M54.52 149.78l33.42 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.42 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M113.1 149.78l33.44 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.44 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M171.69 149.78l33.43 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.43 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M230.28 149.78l33.42 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.42 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M288.87 149.78l33.43 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.43 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M54.52 208.09l33.42 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.42 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M54.52 266.39l33.42 0c1.39,0 2.53,1.14 2.53,2.53l0 33.42c0,1.39 -1.14,2.53 -2.53,2.53l-33.42 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.42c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M113.1 208.09l33.44 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.44 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M113.1 266.39l33.44 0c1.39,0 2.53,1.14 2.53,2.53l0 33.42c0,1.39 -1.14,2.53 -2.53,2.53l-33.44 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.42c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M171.69 208.09l33.43 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.43 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M171.69 266.39l33.43 0c1.39,0 2.53,1.14 2.53,2.53l0 33.42c0,1.39 -1.14,2.53 -2.53,2.53l-33.43 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.42c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil0" d="M230.28 208.09l33.42 0c1.39,0 2.53,1.14 2.53,2.53l0 33.43c0,1.39 -1.14,2.53 -2.53,2.53l-33.42 0c-1.39,0 -2.53,-1.14 -2.53,-2.53l0 -33.43c0,-1.39 1.14,-2.53 2.53,-2.53z"/><path class="fil1" d="M359.39 266.25c0,-5.06 4.1,-9.16 9.16,-9.16 5.05,0 9.15,4.1 9.15,9.16l0.04 42.19 25.2 13.16c4.48,2.34 6.22,7.87 3.88,12.35 -2.34,4.48 -7.87,6.22 -12.35,3.88l-29.91 -15.62c-3.04,-1.49 -5.13,-4.61 -5.13,-8.22l-0.04 -47.74z"/><path class="fil0" d="M100.52 0.01c7.74,0 14.08,6.33 14.08,14.07l0 38.49c0,7.74 -6.34,14.07 -14.08,14.07 -7.74,0 -14.07,-6.33 -14.07,-14.07l0 -38.49c0,-7.74 6.33,-14.07 14.07,-14.07z"/><path class="fil0" d="M276.29 0.01c7.74,0 14.07,6.33 14.07,14.07l0 38.49c0,7.74 -6.33,14.07 -14.07,14.07 -7.74,0 -14.07,-6.33 -14.07,-14.07l0 -38.49c0,-7.74 6.33,-14.07 14.07,-14.07z"/></g><text x="0" y="434.64" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Alice-vector</text><text x="0" y="439.64" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" viewBox="0 0 101 126.25" version="1.1" xml:space="preserve" style="" x="0px" y="0px" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><path d="M7.504,77.445l-2.081,-0c-2.167,-0 -3.923,-1.756 -3.923,-3.923l-0,-55.77c-0,-2.166 1.756,-3.922 3.923,-3.922l90.154,-0c2.167,-0 3.923,1.756 3.923,3.922l0,55.77c0,2.167 -1.756,3.923 -3.923,3.923l-38.747,-0c-0.202,0.647 -0.572,1.247 -1.1,1.729c-1.334,1.217 -3.326,1.367 -4.827,0.363l-5.037,-3.372l-0.632,7.415c-0.156,1.843 -1.579,3.326 -3.414,3.559c-1.835,0.233 -3.583,-0.847 -4.195,-2.592l-2.494,-7.102l-5.928,-0l-2.493,7.102c-0.613,1.745 -2.361,2.825 -4.196,2.592c-1.835,-0.233 -3.257,-1.716 -3.414,-3.559l-0.632,-7.415l-5.037,3.372c-1.501,1.004 -3.493,0.854 -4.827,-0.363c-0.528,-0.482 -0.898,-1.082 -1.1,-1.729Zm12.863,-17.892l-9.118,16.724l10.564,-7.071l1.195,14.041l7.575,-21.576c-2.384,1.042 -5.134,1.015 -7.527,-0.138c-1.029,-0.495 -1.935,-1.171 -2.689,-1.98Zm23.6,-0c-0.753,0.809 -1.66,1.485 -2.689,1.98c-2.393,1.153 -5.143,1.18 -7.527,0.138l7.575,21.576l1.195,-14.041l10.564,7.071l-9.118,-16.724Zm12.084,13.969l39.526,-0l0,-55.77l-90.154,-0l0,55.77l2.86,-0l9.886,-18.133c-0.099,-0.439 -0.165,-0.888 -0.198,-1.345l-0.007,-0.104l-0.1,-0.031c-3.096,-0.941 -5.45,-3.469 -6.17,-6.623c-0.72,-3.155 0.304,-6.453 2.685,-8.645l0.077,-0.07l-0.039,-0.097c-1.194,-3.008 -0.686,-6.424 1.332,-8.954c2.017,-2.53 5.235,-3.785 8.433,-3.291l0.103,0.016l0.052,-0.09c1.607,-2.809 4.594,-4.542 7.83,-4.542c3.236,-0 6.224,1.733 7.83,4.542l0.052,0.09l0.103,-0.016c3.198,-0.494 6.416,0.761 8.433,3.291c2.018,2.53 2.526,5.946 1.332,8.954l-0.039,0.097l0.077,0.07c2.381,2.192 3.405,5.49 2.685,8.645c-0.72,3.154 -3.074,5.682 -6.17,6.623l-0.1,0.031l-0.007,0.104c-0.032,0.457 -0.099,0.906 -0.198,1.345l9.886,18.133Zm-25.471,-0l3.174,-0l-1.587,-4.52l-1.587,4.52Zm34.025,-11.495l-3.007,3.321c-0.727,0.803 -1.968,0.864 -2.771,0.137c-0.802,-0.726 -0.863,-1.968 -0.137,-2.77l6.001,-6.626c0.54,-0.596 1.39,-0.802 2.143,-0.52c0.754,0.283 1.258,0.998 1.272,1.802l0.573,4.508c1.361,-0.682 2.991,-1.846 2.991,-1.846c0.668,-0.453 1.546,-0.451 2.212,0.007l3.51,2.413l9.406,0.117c1.082,0.014 1.95,0.904 1.936,1.986c-0.013,1.083 -0.903,1.95 -1.985,1.937l-10.002,-0.125c-0.388,-0.005 -0.767,-0.125 -1.087,-0.345l-2.942,-2.023c-1.333,0.807 -3.488,2.027 -4.625,2.216c-1.029,0.172 -2.156,-0.263 -2.842,-1.717c-0.281,-0.596 -0.49,-1.503 -0.646,-2.472Zm-36.863,-33.924c0.908,-1.587 2.596,-2.567 4.425,-2.567c1.829,-0 3.517,0.98 4.426,2.567c0.802,1.403 1.391,2.431 1.391,2.431c-0,-0 1.171,-0.181 2.768,-0.428c1.808,-0.28 3.626,0.43 4.766,1.86c1.14,1.43 1.428,3.36 0.753,5.06c-0.597,1.502 -1.034,2.604 -1.034,2.604c-0,-0 0.872,0.803 2.061,1.897c1.346,1.239 1.925,3.103 1.518,4.886c-0.407,1.783 -1.738,3.211 -3.487,3.743c-1.547,0.471 -2.681,0.816 -2.681,0.816c-0,-0 -0.083,1.182 -0.198,2.794c-0.129,1.824 -1.226,3.439 -2.874,4.233c-1.647,0.793 -3.594,0.644 -5.1,-0.393c-1.332,-0.915 -2.309,-1.587 -2.309,-1.587c-0,-0 -0.977,0.672 -2.308,1.587c-1.507,1.037 -3.454,1.186 -5.101,0.393c-1.648,-0.794 -2.744,-2.409 -2.874,-4.233c-0.114,-1.612 -0.198,-2.794 -0.198,-2.794c-0,-0 -1.134,-0.345 -2.681,-0.816c-1.749,-0.532 -3.08,-1.96 -3.487,-3.743c-0.407,-1.783 0.172,-3.647 1.518,-4.886c1.189,-1.094 2.061,-1.897 2.061,-1.897c-0,-0 -0.437,-1.102 -1.034,-2.604c-0.675,-1.7 -0.387,-3.63 0.753,-5.06c1.14,-1.43 2.959,-2.14 4.766,-1.86c1.597,0.247 2.768,0.428 2.768,0.428c-0,-0 0.589,-1.028 1.392,-2.431Zm4.425,4.529c-5.181,-0 -9.388,4.207 -9.388,9.388c-0,5.181 4.207,9.388 9.388,9.388c5.181,-0 9.388,-4.207 9.388,-9.388c-0,-5.181 -4.207,-9.388 -9.388,-9.388Zm28.535,15.779l25.513,-0c1.083,-0 1.962,-0.879 1.962,-1.961c-0,-1.083 -0.879,-1.962 -1.962,-1.962l-25.513,-0c-1.083,-0 -1.962,0.879 -1.962,1.962c-0,1.082 0.879,1.961 1.962,1.961Zm-28.535,-11.856c3.016,-0 5.465,2.449 5.465,5.465c-0,3.016 -2.449,5.465 -5.465,5.465c-3.016,-0 -5.465,-2.449 -5.465,-5.465c-0,-3.016 2.449,-5.465 5.465,-5.465Zm28.535,2.049l25.513,-0c1.083,-0 1.962,-0.878 1.962,-1.961c-0,-1.083 -0.879,-1.961 -1.962,-1.961l-25.513,-0c-1.083,-0 -1.962,0.878 -1.962,1.961c-0,1.083 0.879,1.961 1.962,1.961Zm7.201,-9.806l11.111,-0c1.083,-0 1.962,-0.879 1.962,-1.962c-0,-1.082 -0.879,-1.961 -1.962,-1.961l-11.111,-0c-1.083,-0 -1.962,0.879 -1.962,1.961c-0,1.083 0.879,1.962 1.962,1.962Z"/><text x="0" y="116" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by alimasykurm</text><text x="0" y="121" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 40" x="0px" y="0px"><title>Artboard 26</title><g data-name="Layer 6"><path d="M23,26.5H9a7,7,0,0,1-.87-13.95,8.49,8.49,0,0,1,16.77.22A7,7,0,0,1,23,26.5Zm-6.5-19A6.51,6.51,0,0,0,10,13.57a1,1,0,0,1-1,.93,5,5,0,1,0,0,10H23a5,5,0,0,0,.82-9.93,1,1,0,0,1-.84-.93A6.49,6.49,0,0,0,16.5,7.5Z"/></g><text x="0" y="47" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Debi Alpa Nugraha</text><text x="0" y="52" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 704 B

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 80" x="0px" y="0px"><title>1</title><g><path d="M40.707,22.293a1,1,0,0,1,.2417,1.0234l-6.666,20A1,1,0,0,1,33.3564,44H33.334a1,1,0,0,1-.9336-.6406l-3.5435-9.2168L19.6411,30.6a1,1,0,0,1,.0425-1.8818l20-6.666A.9941.9941,0,0,1,40.707,22.293ZM56,32A24,24,0,1,1,32,8,24.0275,24.0275,0,0,1,56,32Zm-2,0A22,22,0,1,0,32,54,22.0249,22.0249,0,0,0,54,32Z"/></g><text x="0" y="79" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by mim studio</text><text x="0" y="84" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 756 B

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 80" x="0px" y="0px"><title>Bulb-idea-light-light bulb</title><g data-name="Layer 3"><path d="M37.79,47c0-2,3.09-7.4,5.14-11a34.75,34.75,0,0,0,2.33-4.39A15.52,15.52,0,0,0,46,27.23a14,14,0,0,0-28,0,15.52,15.52,0,0,0,.74,4.41A34.75,34.75,0,0,0,21.07,36c2.05,3.57,5.14,9,5.14,11a1,1,0,0,0,1,1h9.58A1,1,0,0,0,37.79,47Zm-1.88-1H28.09c-.51-2.5-2.7-6.46-5.28-11a41.22,41.22,0,0,1-2.18-4A13.59,13.59,0,0,1,20,27.23a12,12,0,0,1,24,0A13.59,13.59,0,0,1,43.37,31a41.22,41.22,0,0,1-2.18,4C38.61,39.54,36.42,43.5,35.91,46Z"/><path d="M35.5,59.21,34.13,60H29.87l-1.37-.79a1,1,0,1,0-1,1.74l1.6.92a1.06,1.06,0,0,0,.5.13h4.8a1.06,1.06,0,0,0,.5-.13L36.5,61a1,1,0,1,0-1-1.74Z"/><path d="M35.9,49.21l-8,.79a1,1,0,0,0,.1,2h.1l8-.8a1,1,0,0,0,.9-1.1A1,1,0,0,0,35.9,49.21Z"/><path d="M35.9,52.21l-8,.79a1,1,0,0,0,.1,2h.1l8-.8a1,1,0,0,0,.9-1.1A1,1,0,0,0,35.9,52.21Z"/><path d="M35.9,55.21l-8,.79a1,1,0,0,0,.1,2h.1l8-.8a1,1,0,0,0,.9-1.1A1,1,0,0,0,35.9,55.21Z"/><path d="M31,3v7a1,1,0,0,0,2,0V3a1,1,0,0,0-2,0Z"/><path d="M45.44,16l4.94-5A1,1,0,0,0,49,9.62l-4.95,5A1,1,0,0,0,44,16a1,1,0,0,0,.71.29A1,1,0,0,0,45.44,16Z"/><path d="M58,28a1,1,0,0,0-1-1H50a1,1,0,0,0,0,2h7A1,1,0,0,0,58,28Z"/><path d="M49,46.38a1,1,0,0,0,.71.3,1,1,0,0,0,.7-1.71L45.44,40A1,1,0,0,0,44,40a1,1,0,0,0,0,1.41Z"/><path d="M14.32,46.68a1,1,0,0,0,.71-.3l5-5A1,1,0,0,0,20,40a1,1,0,0,0-1.42,0L13.62,45a1,1,0,0,0,.7,1.71Z"/><path d="M7,29h7a1,1,0,0,0,0-2H7a1,1,0,0,0,0,2Z"/><path d="M13.62,9.62a1,1,0,0,0,0,1.41l4.94,5a1,1,0,0,0,.71.29A1,1,0,0,0,20,16a1,1,0,0,0,0-1.41l-5-5A1,1,0,0,0,13.62,9.62Z"/><path d="M37.68,29.05,32,31l-5.68-1.9A1,1,0,0,0,25,30.29l4,13A1,1,0,1,0,31,42.71L27.53,31.56,31.68,33a1,1,0,0,0,.64,0l4.15-1.39L33,42.71A1,1,0,0,0,33.71,44,.92.92,0,0,0,34,44a1,1,0,0,0,1-.71l4-13a1,1,0,0,0-1.28-1.24Z"/></g><text x="0" y="79" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Pause08</text><text x="0" y="84" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

@ -1 +0,0 @@
<svg xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 125" style="enable-background:new 0 0 100 100;" xml:space="preserve"><switch><foreignObject requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" x="0" y="0" width="1" height="1"/><g i:extraneous="self"><g><path d="M5273.1,2400.1v-2c0-2.8-5-4-9.7-4s-9.7,1.3-9.7,4v2c0,1.8,0.7,3.6,2,4.9l5,4.9c0.3,0.3,0.4,0.6,0.4,1v6.4 c0,0.4,0.2,0.7,0.6,0.8l2.9,0.9c0.5,0.1,1-0.2,1-0.8v-7.2c0-0.4,0.2-0.7,0.4-1l5.1-5C5272.4,2403.7,5273.1,2401.9,5273.1,2400.1z M5263.4,2400c-4.8,0-7.4-1.3-7.5-1.8v0c0.1-0.5,2.7-1.8,7.5-1.8c4.8,0,7.3,1.3,7.5,1.8C5270.7,2398.7,5268.2,2400,5263.4,2400z"/><path d="M5268.4,2410.3c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h4.3c0.6,0,1-0.4,1-1c0-0.6-0.4-1-1-1H5268.4z"/><path d="M5272.7,2413.7h-4.3c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h4.3c0.6,0,1-0.4,1-1C5273.7,2414.1,5273.3,2413.7,5272.7,2413.7z"/><path d="M5272.7,2417h-4.3c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h4.3c0.6,0,1-0.4,1-1C5273.7,2417.5,5273.3,2417,5272.7,2417z"/></g><g><path d="M86.9,66.4c-4.8,0-8.8,3.3-10,7.8h-4.1c-1.6,0-3-1.3-3-3V56.8h4.7c11.4,0,20.6-9.2,20.6-20.6c0-12.2-10.7-22.1-23.2-20.4 C67,7.5,58.2,2.5,48.6,2.5c-11.8,0-22,7.5-25.7,18.5C13.2,20.8,5,29,5,38.9c0,9.9,8,17.9,17.9,17.9h7.4v14.4c0,1.6-1.3,3-3,3 h-4.1c-1.2-4.5-5.2-7.8-10-7.8c-5.7,0-10.4,4.6-10.4,10.4c0,5.7,4.7,10.4,10.4,10.4c4.8,0,8.8-3.3,10-7.8h4.1 c4.5,0,8.2-3.7,8.2-8.2V56.8h12v20.4c-4.5,1.2-7.8,5.2-7.8,10c0,5.7,4.6,10.4,10.4,10.4c5.7,0,10.4-4.6,10.4-10.4 c0-4.8-3.3-8.8-7.8-10V56.8h12v14.4c0,4.5,3.7,8.2,8.2,8.2h4.1c1.2,4.5,5.2,7.8,10,7.8c5.7,0,10.4-4.6,10.4-10.4 C97.2,71.1,92.6,66.4,86.9,66.4z M13.1,82C10.3,82,8,79.6,8,76.8s2.3-5.2,5.2-5.2c2.9,0,5.2,2.3,5.2,5.2S16,82,13.1,82z M55.2,87.1c0,2.9-2.3,5.2-5.2,5.2c-2.9,0-5.2-2.3-5.2-5.2S47.1,82,50,82C52.9,82,55.2,84.3,55.2,87.1z M10.1,38.9 c0-7,5.7-12.7,12.7-12.7c0.4,0,0.8,0.1,1.6,0.2c1.3,0.1,2.5-0.7,2.8-2c2.4-9.8,11.2-16.7,21.3-16.7c8.3,0,15.8,4.6,19.6,12.1 c0.5,1.1,1.7,1.6,2.9,1.4c1.2-0.3,2.3-0.4,3.4-0.4c8.5,0,15.4,6.9,15.4,15.4s-6.9,15.4-15.4,15.4H22.8 C15.8,51.6,10.1,45.9,10.1,38.9z M86.9,82c-2.9,0-5.2-2.3-5.2-5.2s2.3-5.2,5.2-5.2c2.9,0,5.2,2.3,5.2,5.2S89.7,82,86.9,82z"/><path d="M50,20.1c-5.8,0-11.2,2.2-15.3,6.3c-1,1-1,2.7,0,3.7c1,1,2.7,1,3.7,0c6.2-6.2,17.1-6.1,23.2,0c0.5,0.5,1.2,0.8,1.8,0.8 c0.7,0,1.3-0.2,1.8-0.7c1-1,1-2.6,0-3.7C61.3,22.4,55.7,20.1,50,20.1z"/><path d="M41,32.7c-1,1-1,2.7,0,3.7c1,1,2.7,1,3.7,0c2.9-2.9,7.8-2.9,10.7,0c0.5,0.5,1.2,0.8,1.8,0.8s1.3-0.3,1.8-0.8 c1-1,1-2.7,0-3.7C54.2,27.9,45.8,27.9,41,32.7z"/><circle cx="50" cy="41.7" r="3.9"/></g></g></switch><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Adrien Coquet</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

@ -1 +0,0 @@
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 800 1000" enable-background="new 0 0 800 800" xml:space="preserve"><g><path fill="#000000" d="M576.173,404.305V218.91c0-97.135-79.038-176.173-176.181-176.173 c-97.135,0-176.173,79.039-176.173,176.173v185.395c-23.121,10.468-37.547,29.128-37.547,49.611 c0,32.693,34.846,58.289,79.337,58.289h23.08v230.479c0,8.064,6.532,14.58,14.564,14.58c8.056,0,14.58-6.516,14.58-14.58V512.205 h164.334v134.609c0,8.049,6.517,14.58,14.564,14.58s14.572-6.531,14.572-14.58V512.205h23.088 c44.483,0,79.337-25.596,79.337-58.289C613.729,433.433,599.302,414.772,576.173,404.305z M534.392,483.061H265.608 c-29.58,0-50.192-15.354-50.192-29.145c0-10.209,10.992-20.531,27.354-25.692c6.072-1.92,10.193-7.532,10.193-13.903V218.91 c0-81.071,65.958-147.037,147.029-147.037c81.078,0,147.045,65.966,147.045,147.037v195.41c0,6.371,4.12,11.983,10.177,13.903 c16.37,5.161,27.37,15.483,27.37,25.692C584.584,467.706,563.972,483.061,534.392,483.061z"/><path fill="#000000" d="M496.731,395.631H303.252c-8.032,0-14.564,6.532-14.564,14.577c0,8.048,6.532,14.563,14.564,14.563h193.479 c8.048,0,14.572-6.516,14.572-14.563C511.304,402.163,504.779,395.631,496.731,395.631z"/></g><text x="0" y="815" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by abderraouf omara</text><text x="0" y="820" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 64 80" style="enable-background:new 0 0 64 64;" xml:space="preserve"><g><path d="M60,12H4c-1.654,0-3,1.346-3,3v34c0,1.654,1.346,3,3,3h56c1.654,0,3-1.346,3-3v-2v-8V25v-8v-2C63,13.346,61.654,12,60,12z M61,46h-6v-6h2v2h2v-2h2V46z M59,38V26h2v12H59z M57,22v2h-2v-6h6v6h-2v-2H57z M60,50H4c-0.551,0-1-0.448-1-1V15 c0-0.551,0.449-1,1-1h56c0.551,0,1,0.449,1,1v1h-7c-0.552,0-1,0.448-1,1v8c0,0.552,0.448,1,1,1h3v12h-3c-0.552,0-1,0.447-1,1v8 c0,0.553,0.448,1,1,1h7v1C61,49.552,60.551,50,60,50z"/><path d="M41,24c0-0.552-0.448-1-1-1h-1v-4h-2v4h-2v-4h-2v4h-2v-4h-2v4h-2v-4h-2v4h-1c-0.552,0-1,0.448-1,1v1h-4v2h4v2h-4v2h4v2h-4 v2h4v2h-4v2h4v1c0,0.553,0.448,1,1,1h1v4h2v-4h2v4h2v-4h2v4h2v-4h2v4h2v-4h1c0.552,0,1-0.447,1-1v-1h4v-2h-4v-2h4v-2h-4v-2h4v-2h-4 v-2h4v-2h-4V24z M39,39H25V25h14V39z"/><path d="M29,29h2v-2h-3c-0.552,0-1,0.448-1,1v3h2V29z"/><path d="M37,36v-3h-2v2h-2v2h3C36.552,37,37,36.553,37,36z"/><path d="M10,16H6c-0.552,0-1,0.448-1,1v6c0,0.552,0.448,1,1,1h1v16H6c-0.552,0-1,0.447-1,1v6c0,0.553,0.448,1,1,1h4 c0.552,0,1-0.447,1-1v-6c0-0.553-0.448-1-1-1H9V24h1c0.552,0,1-0.448,1-1v-6C11,16.448,10.552,16,10,16z M9,46H7v-4h2V46z M9,22H7 v-4h2V22z"/><rect x="13" y="16" width="2" height="2"/><rect x="15" y="18" width="2" height="2"/><rect x="13" y="20" width="2" height="2"/><rect x="15" y="22" width="2" height="2"/><rect x="13" y="24" width="2" height="2"/><rect x="15" y="26" width="2" height="2"/><rect x="13" y="28" width="2" height="2"/><rect x="15" y="30" width="2" height="2"/><rect x="13" y="32" width="2" height="2"/><rect x="15" y="34" width="2" height="2"/><rect x="13" y="36" width="2" height="2"/><rect x="15" y="38" width="2" height="2"/><rect x="13" y="40" width="2" height="2"/><rect x="15" y="42" width="2" height="2"/><rect x="13" y="44" width="2" height="2"/><rect x="15" y="46" width="2" height="2"/><rect x="47" y="16" width="2" height="2"/><rect x="49" y="18" width="2" height="2"/><rect x="47" y="20" width="2" height="2"/><rect x="49" y="22" width="2" height="2"/><rect x="47" y="24" width="2" height="2"/><rect x="49" y="26" width="2" height="2"/><rect x="47" y="28" width="2" height="2"/><rect x="49" y="30" width="2" height="2"/><rect x="47" y="32" width="2" height="2"/><rect x="49" y="34" width="2" height="2"/><rect x="47" y="36" width="2" height="2"/><rect x="49" y="38" width="2" height="2"/><rect x="47" y="40" width="2" height="2"/><rect x="49" y="42" width="2" height="2"/><rect x="47" y="44" width="2" height="2"/><rect x="49" y="46" width="2" height="2"/></g><text x="0" y="79" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Template</text><text x="0" y="84" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.8 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 50 62.5" enable-background="new 0 0 50 50" xml:space="preserve"><g><path d="M20.4,48.8c6.7,1.3,12.5-3.8,12.5-10.3c0-3.4-1.7-6.5-4.3-8.4V7.2c0-3.4-2.7-6.2-6.2-6.2c-3.4,0-6.2,2.8-6.2,6.2v22.9 c-3.1,2.3-4.9,6.2-4,10.6C13,44.7,16.3,48,20.4,48.8z M17.5,32l0.9-0.7v-24c0-2.2,1.8-3.9,3.9-3.9c2.2,0,4,1.8,4,3.9v24l0.9,0.7 c2.1,1.5,3.3,4,3.3,6.6c0,2.2-0.9,4.3-2.4,5.8c-1.6,1.5-3.6,2.4-5.8,2.4c-4.1,0-7.3-2.9-8-6.5C13.8,37,15,33.8,17.5,32z"/><path d="M22.4,44.4c1.6,0,3.1-0.6,4.2-1.7c1.1-1.1,1.7-2.6,1.7-4.2c0-4-3.4-5.3-4.3-6.1V15.5h-3.3v16.9c-0.7,0.8-5.1,2.4-4.1,7.3 C17.1,42.3,19.4,44.4,22.4,44.4z"/><path d="M36.9,7.8h-5.7v2.3h5.7c0.6,0,1.1-0.5,1.1-1.1C38.1,8.3,37.6,7.8,36.9,7.8z"/><path d="M35.8,15c0-0.6-0.5-1.1-1.1-1.1h-3.4v2.3h3.4C35.3,16.1,35.8,15.6,35.8,15z"/><path d="M38.1,21c0-0.6-0.5-1.1-1.1-1.1h-5.7v2.3h5.7C37.6,22.2,38.1,21.6,38.1,21z"/></g><text x="0" y="65" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Vectors Market</text><text x="0" y="70" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 125" style="enable-background:new 0 0 100 100;" xml:space="preserve"><style type="text/css">
.st0{fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:10;}
.st1{fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style><path class="st0" d="M85.9,21.9"/><path class="st0" d="M89.8,48.5"/><path class="st0" d="M43,27.1"/><path class="st1" d="M68.2,79.8c1.2-0.2-11.4,2.7-22.3-1.8C41,75.9,39,26.4,39,26.4l18.9-4.5l18.6-4c0,0,14.4,47.5,10.5,51.5 c-8.5,8.7-17,9.9-19.1,10.2"/><path class="st1" d="M78.2,23.8L87,22c0,0,9.4,8.2,7.8,18.4s-9.5,10.8-9.5,10.8"/><polyline class="st1" points="43,72.9 12,39.6 16.8,32.2 38.8,41.6 "/><polyline class="st1" points="12,39.6 5.8,39.1 14.6,25.5 16.8,32.2 "/><path class="st1" d="M10.3,60.4c0,0,11.8,21.6,0,21.6S10.3,60.4,10.3,60.4z"/><line class="st1" x1="71.7" y1="27.1" x2="75.2" y2="44.6"/><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Daria Moskvina</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" version="1.1" viewBox="0 0 48 60" x="0px" y="0px"><g shape-rendering="auto"><path d="m24 19c-2.7496 0-5 2.2504-5 5s2.2504 5 5 5 5-2.2504 5-5-2.2504-5-5-5zm0 2c1.6687 0 3 1.3313 3 3s-1.3313 3-3 3-3-1.3313-3-3 1.3313-3 3-3z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;paint-order:fill markers stroke;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal;"/><path d="m11.959 10.971a1.0001 1.0001 0 0 0-0.6875 0.30274c-3.3751 3.3754-5.2715 7.9532-5.2715 12.727 2e-7 4.7737 1.8978 9.3531 5.2734 12.729a1.0001 1.0001 0 1 0 1.4141-1.4141c-3.0011-3.0009-4.6875-7.0704-4.6875-11.314 1e-7 -4.2437 1.6849-8.3117 4.6855-11.312a1.0001 1.0001 0 0 0-0.72656-1.7168z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;paint-order:fill markers stroke;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal;"/><path d="m36.01 10.969a1.0001 1.0001 0 0 0-0.69727 1.7168c3.0011 3.0009 4.6875 7.0704 4.6875 11.314 0 4.2437-1.6849 8.3117-4.6855 11.312a1.0001 1.0001 0 1 0 1.4141 1.4141c3.3751-3.3754 5.2715-7.9532 5.2715-12.727 0-4.7737-1.8978-9.3531-5.2734-12.729a1.0001 1.0001 0 0 0-0.7168-0.30273z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;paint-order:fill markers stroke;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal;"/><path d="m16.203 15.213a1.0001 1.0001 0 0 0-0.6875 0.30078c-2.2503 2.2502-3.5156 5.304-3.5156 8.4863 0 3.1821 1.2637 6.2342 3.5137 8.4844a1.0006 1.0006 0 1 0 1.416-1.4141c-1.8755-1.8756-2.9297-4.4179-2.9297-7.0703 0-2.6527 1.0539-5.1947 2.9297-7.0703a1.0001 1.0001 0 0 0-0.72656-1.7168z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;paint-order:fill markers stroke;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal;"/><path d="m31.768 15.213a1.0001 1.0001 0 0 0-0.69727 1.7168c1.8755 1.8756 2.9297 4.4179 2.9297 7.0703 0 2.6527-1.0539 5.1947-2.9297 7.0703a1.0006 1.0006 0 1 0 1.4141 1.416c2.2503-2.2502 3.5156-5.304 3.5156-8.4863 0-3.1821-1.2637-6.2342-3.5137-8.4844a1.0001 1.0001 0 0 0-0.71875-0.30273z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;paint-order:fill markers stroke;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal;"/></g><text x="0" y="63" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by RomStu</text><text x="0" y="68" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 24 30" style="enable-background:new 0 0 24 24;" xml:space="preserve"><path d="M9,20.5h6c0.276,0,0.5-0.224,0.5-0.5V4c0-0.276-0.224-0.5-0.5-0.5H9C8.724,3.5,8.5,3.724,8.5,4v16 C8.5,20.276,8.724,20.5,9,20.5z M9.5,4.5h5v15h-5V4.5z"/><path d="M4,19.5c-0.276,0-0.5,0.224-0.5,0.5s0.224,0.5,0.5,0.5h2.5V22c0,0.276,0.224,0.5,0.5,0.5h10c0.276,0,0.5-0.224,0.5-0.5v-1.5 H20c0.276,0,0.5-0.224,0.5-0.5s-0.224-0.5-0.5-0.5h-2.5v-3H20c0.276,0,0.5-0.224,0.5-0.5s-0.224-0.5-0.5-0.5h-2.5v-3H20 c0.276,0,0.5-0.224,0.5-0.5s-0.224-0.5-0.5-0.5h-2.5v-3H20c0.276,0,0.5-0.224,0.5-0.5S20.276,7.5,20,7.5h-2.5v-3H20 c0.276,0,0.5-0.224,0.5-0.5S20.276,3.5,20,3.5h-2.5V2c0-0.276-0.224-0.5-0.5-0.5H7C6.724,1.5,6.5,1.724,6.5,2v1.5H4 C3.724,3.5,3.5,3.724,3.5,4S3.724,4.5,4,4.5h2.5v3H4C3.724,7.5,3.5,7.724,3.5,8S3.724,8.5,4,8.5h2.5v3H4c-0.276,0-0.5,0.224-0.5,0.5 s0.224,0.5,0.5,0.5h2.5v3H4c-0.276,0-0.5,0.224-0.5,0.5s0.224,0.5,0.5,0.5h2.5v3H4z M7.5,2.5h9v19h-9V2.5z"/><text x="0" y="39" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Astatine Lab</text><text x="0" y="44" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

@ -1 +0,0 @@
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 26.458333 33.0729175" version="1.1" x="0px" y="0px"><g transform="translate(0,-270.54165)"><path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06966925;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 13.228374,272.12915 c 2.902351,0 5.530754,0.43849 7.481267,1.17643 0.975259,0.36897 1.783703,0.81078 2.377689,1.34208 0.593986,0.5313 0.989749,1.18892 0.989755,1.91759 v 14.68939 c -0.131036,0.63603 -0.58129,1.2674 -0.989755,1.63878 -0.593986,0.5313 -1.40243,0.97366 -2.377689,1.34263 -1.950513,0.73794 -4.578916,1.17643 -7.481267,1.17643 -2.902354,0 -5.5312995,-0.43849 -7.4818125,-1.17643 -0.975259,-0.36897 -1.783703,-0.81133 -2.377689,-1.34263 -0.494385,-0.51545 -0.858105,-1.02026 -0.98758,-1.63878 v -14.97795 c -0.0014,-0.11024 0.03101,-0.21828 0.09289,-0.30967 0.148463,-0.49083 0.468448,-0.9381 0.894689,-1.31936 0.593986,-0.5313 1.40243,-0.97311 2.377689,-1.34208 1.950513,-0.73794 4.5794595,-1.17643 7.4818135,-1.17643 z m 0,1.06814 c -2.792439,0 -5.3184745,0.43262 -7.0999295,1.1066 -0.890725,0.33698 -1.592938,0.73801 -2.042519,1.14015 -0.82716,0.76256 -0.727483,1.57863 0,2.24026 0.449579,0.40214 1.151794,0.80261 2.042519,1.1396 1.781455,0.67398 4.3074855,1.10714 7.0999295,1.10714 2.792442,0 5.320101,-0.43316 7.101556,-1.10714 0.890726,-0.33699 1.593486,-0.73746 2.043061,-1.1396 0.834681,-0.76102 0.666454,-1.63229 0,-2.24026 -0.449577,-0.40214 -1.152335,-0.80317 -2.043061,-1.14015 -1.781452,-0.67398 -4.309119,-1.1066 -7.101556,-1.1066 z m 9.760635,5.36567 c -0.58391,0.4943 -1.355708,0.91036 -2.279368,1.2598 -1.950516,0.73795 -4.578914,1.17643 -7.481267,1.17643 -2.902356,0 -5.5312965,-0.43848 -7.4818125,-1.17643 -0.923563,-0.34941 -1.694935,-0.76558 -2.278822,-1.2598 v 2.59757 c 0.04895,0.30123 0.237264,0.61914 0.618186,0.95987 0.449579,0.40214 1.151794,0.801 2.042519,1.13799 1.781455,0.67398 4.3074855,1.10875 7.0999295,1.10875 2.792442,0 5.320101,-0.43477 7.101556,-1.10875 0.890726,-0.33699 1.593486,-0.73585 2.043061,-1.13799 0.377743,-0.33788 0.565137,-0.65329 0.616018,-0.9523 z m 0,4.43394 c -0.583927,0.49435 -1.355627,0.91032 -2.279368,1.2598 -1.950516,0.73794 -4.578914,1.17643 -7.481267,1.17643 -2.902356,0 -5.5312965,-0.43849 -7.4818125,-1.17643 -0.923505,-0.34939 -1.694948,-0.76507 -2.278822,-1.25926 v 2.59865 c 0.04886,0.30091 0.237095,0.61738 0.618186,0.95825 0.449579,0.40214 1.151794,0.80318 2.042519,1.14016 1.781455,0.67398 4.3074855,1.10658 7.0999295,1.10658 2.792442,0 5.320101,-0.4326 7.101556,-1.10658 0.890726,-0.33698 1.593486,-0.73802 2.043061,-1.14016 0.377682,-0.33781 0.565098,-0.65163 0.616018,-0.95013 z m 0,4.43611 c -0.583927,0.49434 -1.355627,0.91033 -2.279368,1.2598 -1.950516,0.73794 -4.578914,1.17643 -7.481267,1.17643 -2.902356,0 -5.5312965,-0.43849 -7.4818125,-1.17643 -0.923505,-0.34939 -1.694948,-0.76508 -2.278822,-1.25926 v 3.70633 c 0.04897,0.30122 0.237264,0.61915 0.618186,0.95987 0.449581,0.40214 1.151794,0.80046 2.042519,1.13744 1.781455,0.67399 4.3074905,1.10713 7.0999295,1.10713 2.792437,0 5.320104,-0.43314 7.101556,-1.10713 0.890726,-0.33698 1.593484,-0.7353 2.043061,-1.13744 0.377743,-0.33788 0.565133,-0.6533 0.616018,-0.9523 z"/></g><text x="0" y="41.458334" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Icons Bazaar</text><text x="0" y="46.458334" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 90 112.5" enable-background="new 0 0 90 90" xml:space="preserve"><g><path d="M45.9,10.5c-19.3,0-35,15.7-35,35s15.7,35,35,35c19.3,0,35-15.7,35-35S65.2,10.5,45.9,10.5z M45.9,78.6 c-18.2,0-33-14.8-33-33s14.8-33,33-33s33,14.8,33,33S64.1,78.6,45.9,78.6z"/><path d="M73.5,36.6C73.5,36.6,73.5,36.6,73.5,36.6C73.5,36.6,73.5,36.6,73.5,36.6c-1.9-5.9-5.6-10.9-10.5-14.5c0,0,0,0-0.1-0.1 c0,0-0.1,0-0.1,0c-4.8-3.5-10.6-5.5-17-5.5c-6.3,0-12.2,2-17,5.5c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0.1c-4.9,3.6-8.6,8.6-10.5,14.4 c0,0,0,0,0,0c0,0,0,0,0,0c-0.9,2.8-1.4,5.8-1.4,8.9s0.5,6.1,1.4,8.9c0,0,0,0,0,0c0,0,0,0,0,0C20.3,60.4,24,65.4,28.8,69 c0,0,0,0,0.1,0.1c0,0,0.1,0,0.1,0.1c4.8,3.5,10.6,5.5,17,5.5c16,0,29-13,29-29C75,42.4,74.5,39.4,73.5,36.6z M45.9,72.6 c-5.6,0-10.8-1.7-15.1-4.6l3.5-4.9c0.3-0.4,0.2-1.1-0.2-1.4c-0.4-0.3-1.1-0.2-1.4,0.2l-3.5,4.9c-3.9-3.1-7-7.2-8.7-11.9l5.7-1.9 c0.5-0.2,0.8-0.7,0.6-1.3c-0.2-0.5-0.7-0.8-1.3-0.6L20,52.9c-0.7-2.4-1-4.8-1-7.4s0.4-5,1-7.4l5.7,1.9c0.1,0,0.2,0,0.3,0 c0.4,0,0.8-0.3,1-0.7c0.2-0.5-0.1-1.1-0.6-1.3l-5.7-1.9c1.7-4.7,4.8-8.9,8.7-11.9l3.5,4.9c0.2,0.3,0.5,0.4,0.8,0.4 c0.2,0,0.4-0.1,0.6-0.2c0.4-0.3,0.5-0.9,0.2-1.4l-3.5-4.9c4-2.7,8.9-4.4,14.1-4.6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6 c5.2,0.2,10,1.8,14.1,4.6L57.4,28c-0.3,0.4-0.2,1.1,0.2,1.4c0.2,0.1,0.4,0.2,0.6,0.2c0.3,0,0.6-0.1,0.8-0.4l3.5-4.9 c3.9,3.1,7,7.2,8.7,11.9l-5.7,1.9c-0.5,0.2-0.8,0.7-0.6,1.3c0.1,0.4,0.5,0.7,1,0.7c0.1,0,0.2,0,0.3,0l5.7-1.9c0.7,2.4,1,4.8,1,7.4 C73,60.5,60.8,72.6,45.9,72.6z"/><path d="M56.4,31.6l-3.1-6.1c-0.1-0.2-0.3-0.4-0.6-0.5c-0.3-0.1-0.5-0.1-0.8,0.1l-6.1,3.1c-7.6,0.1-14.3,5-16.6,12.3 c-3,9.3,2.2,19.2,11.4,22.2c1.8,0.6,3.6,0.8,5.4,0.8c7.7,0,14.5-4.9,16.8-12.3C65.1,43.9,62.5,36.1,56.4,31.6z M60.9,50.6 c-2.1,6.5-8.1,10.9-14.9,10.9c-1.6,0-3.2-0.3-4.8-0.7C33,58.1,28.4,49.3,31,41.1c2.1-6.5,8.1-10.9,15-10.9c0.2,0,0.3,0,0.5-0.1 l5.4-2.8l2.8,5.4c0.1,0.1,0.2,0.3,0.3,0.4C60.6,37,63,44.1,60.9,50.6z"/></g><text x="0" y="105" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Jamie Dickinson</text><text x="0" y="110" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 105" viewBox="0 0 100 125" x="0px" y="0px"><title>100. Heater</title><path d="M85,49H81V47.5a8.5,8.5,0,0,0-16-4,8.49,8.49,0,0,0-15,0,8.49,8.49,0,0,0-15,0,8.5,8.5,0,0,0-16,4V49H15a1,1,0,0,0-1,1v5a1,1,0,0,0,1,1h4V74.71H15a1,1,0,0,0-1,1v5a1,1,0,0,0,1,1h4v.79a8.5,8.5,0,0,0,16,4,8.49,8.49,0,0,0,15,0,8.49,8.49,0,0,0,15,0,8.5,8.5,0,0,0,16-4v-.79h4a1,1,0,0,0,1-1v-5a1,1,0,0,0-1-1H81V56h4a1,1,0,0,0,1-1V50A1,1,0,0,0,85,49ZM19,79.71H16v-3h3ZM19,54H16V51h3ZM34,82.5a6.5,6.5,0,0,1-13,0v-35a6.5,6.5,0,0,1,13,0Zm15,0a6.5,6.5,0,0,1-13,0v-35a6.5,6.5,0,0,1,13,0Zm15,0a6.5,6.5,0,0,1-13,0v-35a6.5,6.5,0,0,1,13,0Zm15,0a6.5,6.5,0,0,1-13,0v-35a6.5,6.5,0,0,1,13,0Zm5-5.79v3H81v-3ZM84,54H81V51h3Z"/><path d="M40.13,18.14a8.72,8.72,0,0,0-2.08-5.42A4.77,4.77,0,0,1,36.79,10a1,1,0,0,0-2,0,6,6,0,0,0,1.41,3.57l.22.32a6.72,6.72,0,0,1,1.71,4.25,4.32,4.32,0,0,1-1.06,3l-.38.48a6.62,6.62,0,0,0-1.9,4.71,7.3,7.3,0,0,0,1.58,4.64,5.34,5.34,0,0,1,1.23,3.5,1,1,0,0,0,2,0,7.15,7.15,0,0,0-1.52-4.55L38,29.79a5.36,5.36,0,0,1-1.23-3.5A4.21,4.21,0,0,1,37.4,24a10,10,0,0,1,.83-1.11A6.66,6.66,0,0,0,40.13,18.14Z"/><path d="M48.49,18.14a8.66,8.66,0,0,0-2.08-5.42A4.77,4.77,0,0,1,45.15,10a1,1,0,0,0-2,0,6,6,0,0,0,1.41,3.57,3.71,3.71,0,0,0,.23.32,6.77,6.77,0,0,1,1.7,4.25,4.32,4.32,0,0,1-1.06,3l-.38.48a6.66,6.66,0,0,0-1.9,4.71,7.3,7.3,0,0,0,1.58,4.64A5.29,5.29,0,0,1,46,34.43a1,1,0,1,0,2,0,7.15,7.15,0,0,0-1.53-4.55l-.06-.09a5.36,5.36,0,0,1-1.23-3.5A4.21,4.21,0,0,1,45.76,24a10,10,0,0,1,.83-1.11A6.66,6.66,0,0,0,48.49,18.14Z"/><path d="M56.85,18.14a8.66,8.66,0,0,0-2.08-5.42A4.77,4.77,0,0,1,53.51,10a1,1,0,0,0-2,0,6,6,0,0,0,1.41,3.57c.08.11.15.22.23.32a6.77,6.77,0,0,1,1.7,4.25,4.27,4.27,0,0,1-1.06,3l-.38.48a6.66,6.66,0,0,0-1.9,4.71,7.24,7.24,0,0,0,1.59,4.64,5.34,5.34,0,0,1,1.23,3.5,1,1,0,0,0,2,0,7.15,7.15,0,0,0-1.53-4.55l-.06-.09a5.36,5.36,0,0,1-1.23-3.5A4.21,4.21,0,0,1,54.12,24,10,10,0,0,1,55,22.85,6.66,6.66,0,0,0,56.85,18.14Z"/><path d="M65.21,18.14a8.66,8.66,0,0,0-2.08-5.42A4.84,4.84,0,0,1,61.87,10a1,1,0,0,0-2,0,6,6,0,0,0,1.41,3.57c.08.11.15.22.23.32a6.71,6.71,0,0,1,1.7,4.25,4.27,4.27,0,0,1-1.06,3l-.38.48a6.66,6.66,0,0,0-1.9,4.71,7.24,7.24,0,0,0,1.59,4.64,5.34,5.34,0,0,1,1.23,3.5,1,1,0,1,0,2,0,7.15,7.15,0,0,0-1.53-4.55l-.06-.09a5.36,5.36,0,0,1-1.23-3.5A4.21,4.21,0,0,1,62.48,24a11.43,11.43,0,0,1,.83-1.11A6.62,6.62,0,0,0,65.21,18.14Z"/><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Pascal Heß</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 64 80" style="enable-background:new 0 0 64 64;" xml:space="preserve"><g><path d="M40,1H24c-7.168,0-13,5.832-13,13v2v2v4c0,5.004,2.846,9.349,7,11.521V60c0,1.654,1.346,3,3,3s3-1.346,3-3V35h16v25 c0,1.654,1.346,3,3,3s3-1.346,3-3V33.521c4.154-2.172,7-6.517,7-11.521v-4v-2v-2C53,6.832,47.168,1,40,1z M13,14 c0-6.065,4.935-11,11-11h1v4h11c0.552,0,1,0.449,1,1s-0.448,1-1,1H25v6h11c0.552,0,1,0.449,1,1s-0.448,1-1,1H25v6h11 c0.552,0,1,0.449,1,1s-0.448,1-1,1H25v4h-1c-6.065,0-11-4.935-11-11v-2V14z M22,60c0,0.552-0.448,1-1,1s-1-0.448-1-1V34.364 c0.645,0.209,1.315,0.359,2,0.466V60z M44,60c0,0.552-0.448,1-1,1s-1-0.448-1-1V34.83c0.685-0.107,1.355-0.257,2-0.466V60z M40,33 H24c-4.664,0-8.648-2.922-10.246-7.027C16.135,29.026,19.837,31,24,31h16c4.163,0,7.865-1.974,10.246-5.027 C48.648,30.078,44.664,33,40,33z M51,18c0,6.065-4.935,11-11,11H27v-2h9c1.654,0,3-1.346,3-3s-1.346-3-3-3h-9v-2h9 c1.654,0,3-1.346,3-3s-1.346-3-3-3h-9v-2h9c1.654,0,3-1.346,3-3s-1.346-3-3-3h-9V3h13c6.065,0,11,4.935,11,11v2V18z"/><path d="M20,19c1.654,0,3-1.346,3-3s-1.346-3-3-3s-3,1.346-3,3S18.346,19,20,19z M20,15c0.552,0,1,0.449,1,1s-0.448,1-1,1 s-1-0.449-1-1S19.448,15,20,15z"/><path d="M44,13c-1.654,0-3,1.346-3,3s1.346,3,3,3s3-1.346,3-3S45.654,13,44,13z M44,17c-0.552,0-1-0.449-1-1s0.448-1,1-1 s1,0.449,1,1S44.552,17,44,17z"/></g><text x="0" y="79" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Eucalyp</text><text x="0" y="84" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@ -1,5 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" version="1.1" style="shape-rendering:geometricPrecision;text-rendering:geometricPrecision;image-rendering:optimizeQuality;" viewBox="0 0 304.88 684.5375" x="0px" y="0px" fill-rule="evenodd" clip-rule="evenodd"><defs><style type="text/css">
.fil0 {fill:black}
</style></defs><g><path class="fil0" d="M60.98 0l182.91 0c16.22,0 31.63,6.45 43.08,17.9 11.46,11.46 17.91,26.87 17.91,43.08l0 425.66c0,16.21 -6.45,31.62 -17.91,43.08 -11.45,11.45 -26.86,17.9 -43.08,17.9l-182.91 0c-16.21,0 -31.62,-6.45 -43.08,-17.9 -11.46,-11.46 -17.9,-26.87 -17.9,-43.08l0 -425.66c0,-16.21 6.44,-31.62 17.9,-43.08 11.46,-11.45 26.87,-17.9 43.08,-17.9zm-34.63 421.61l252.17 0 0 -332.65 -252.17 0 0 332.65zm252.17 26.36l-252.17 0 0 38.67c0,9.21 3.68,17.94 10.19,24.44 6.5,6.5 15.23,10.18 24.44,10.18l182.91 0c9.21,0 17.94,-3.67 24.45,-10.18 6.5,-6.5 10.18,-15.23 10.18,-24.44l0 -38.67zm-252.17 -385.37l252.17 0 0 -1.62c0,-9.21 -3.68,-17.94 -10.18,-24.44 -6.51,-6.5 -15.24,-10.18 -24.45,-10.18l-182.91 0c-9.21,0 -17.94,3.68 -24.44,10.18 -6.51,6.5 -10.19,15.23 -10.19,24.44l0 1.62z"/><path class="fil0" d="M152.44 462.98c11.96,0 21.65,9.69 21.65,21.65 0,11.95 -9.69,21.64 -21.65,21.64 -11.95,0 -21.64,-9.69 -21.64,-21.64 0,-11.96 9.69,-21.65 21.64,-21.65z"/></g><text x="0" y="562.63" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Alice-vector</text><text x="0" y="567.63" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 125" enable-background="new 0 0 100 100" xml:space="preserve"><g><path d="M91.476,26.045H32.187v21.253h-9.969v-4.826H3.613v15.054h18.604v-4.824h9.969v21.252h59.289 c2.708,0,4.911-2.203,4.911-4.91V30.957C96.387,28.249,94.184,26.045,91.476,26.045z M84.78,27.607v44.786H42.523V27.607H84.78z M20.656,51.471H5.174v-2.939h15.482V51.471z M20.656,44.035v2.935H5.174v-2.935H20.656z M5.174,55.967v-2.936h15.482v2.936H5.174z M22.218,51.143V48.86h9.969v2.282H22.218z M33.748,52.703v-5.404V27.607h7.215v44.786h-7.215V52.703z M94.825,69.045 c0,1.847-1.502,3.349-3.35,3.349h-5.134V27.607h5.134c1.848,0,3.35,1.502,3.35,3.349V69.045z"/><path d="M81.869,34.447c0-2.797-2.275-5.071-5.072-5.071s-5.072,2.274-5.072,5.071v6.258h10.145V34.447z M80.309,39.145h-7.022 v-4.698c0-1.936,1.575-3.511,3.511-3.511s3.512,1.575,3.512,3.511V39.145z"/><path d="M76.797,70.626c2.797,0,5.072-2.275,5.072-5.072v-6.258H71.725v6.258C71.725,68.351,74,70.626,76.797,70.626z M73.286,60.856h7.022v4.697c0,1.937-1.576,3.511-3.512,3.511s-3.511-1.574-3.511-3.511V60.856z"/><circle cx="76.797" cy="35.04" r="2.055"/><circle cx="76.797" cy="64.961" r="2.055"/></g><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Bakunetsu Kaito</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 65 81.25" enable-background="new 0 0 65 65" xml:space="preserve"><path d="M54.813,35.22h-4.584V18.325c0-0.007,0.002-0.013,0.002-0.02c0-8.903-8.333-16.146-18.577-16.146c0,0,0,0,0,0 c0,0-0.001,0-0.001,0c-10.23,0-18.647,6.469-19.545,14.692c-6.569,0.422-11.531,3.761-11.531,7.95v7.534c0,0.829,0.671,1.5,1.5,1.5 H5.52v21.005c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5V33.837h9.995v21.005c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5V33.837 h3.433c0.003,0,0.006,0.001,0.01,0.001c0.829,0,1.5-0.671,1.5-1.5v-7.535c0-2.553-1.846-4.788-4.771-6.242 c-0.008-0.004-0.015-0.011-0.023-0.015c-0.019-0.01-0.039-0.014-0.058-0.022c-1.813-0.887-4.032-1.473-6.484-1.653 c0.909-6.575,7.973-11.71,16.531-11.71c0,0,0,0,0.001,0c0,0,0,0,0,0c8.584,0,15.568,5.891,15.576,13.133 c0,0.004-0.001,0.008-0.001,0.012V35.22h-4.584c-5.299,0-9.609,4.312-9.609,9.61v7.436c0,5.3,4.311,9.611,9.609,9.611h12.168 c5.3,0,9.611-4.312,9.611-9.611V44.83C64.424,39.531,60.112,35.22,54.813,35.22z M8.096,30.837l5.586-11.027 c1.984,0.017,3.756,0.337,5.232,0.845l-5.158,10.182H8.096z M10.164,20.117l-5.431,10.72H3.576v-6.034 C3.576,22.923,6.162,20.878,10.164,20.117z M23.458,30.837h-6.339l4.479-8.84c1.184,0.852,1.861,1.85,1.861,2.806V30.837z M42.645,38.22h12.168c3.646,0,6.611,2.966,6.611,6.61v2.218h-5.768c-0.018,0-0.035,0.005-0.053,0.005 c-0.048,0.002-0.094,0.009-0.141,0.015c-0.053,0.007-0.104,0.014-0.155,0.025c-0.041,0.01-0.08,0.024-0.12,0.037 c-0.052,0.018-0.104,0.034-0.153,0.057c-0.04,0.019-0.076,0.041-0.114,0.063c-0.045,0.025-0.09,0.05-0.132,0.08 c-0.039,0.027-0.074,0.059-0.11,0.09c-0.037,0.032-0.074,0.063-0.107,0.1c-0.032,0.033-0.061,0.07-0.089,0.107 c-0.033,0.042-0.065,0.083-0.094,0.129c-0.009,0.014-0.02,0.024-0.028,0.039l-1.893,3.257l-4.629-8.197 c-0.001-0.002-0.002-0.003-0.003-0.005c-0.031-0.054-0.072-0.104-0.11-0.155c-0.022-0.03-0.042-0.064-0.067-0.092 c-0.002-0.003-0.003-0.006-0.005-0.008c-0.035-0.039-0.076-0.07-0.114-0.105c-0.033-0.029-0.063-0.063-0.098-0.089 c-0.059-0.045-0.122-0.081-0.186-0.116c-0.021-0.011-0.038-0.025-0.06-0.036c-0.071-0.035-0.146-0.061-0.221-0.084 c-0.017-0.006-0.031-0.013-0.048-0.018c-0.073-0.021-0.147-0.031-0.224-0.04c-0.021-0.002-0.041-0.008-0.062-0.01 c-0.07-0.005-0.14-0.001-0.209,0.004c-0.027,0.002-0.055,0-0.082,0.003c-0.068,0.008-0.136,0.025-0.202,0.044 c-0.028,0.007-0.057,0.01-0.084,0.02c-0.072,0.023-0.141,0.057-0.21,0.092c-0.02,0.01-0.041,0.016-0.061,0.026 c-0.001,0.001-0.002,0.002-0.004,0.003c-0.05,0.028-0.095,0.065-0.143,0.101c-0.035,0.026-0.074,0.049-0.107,0.077 c-0.002,0.002-0.004,0.003-0.006,0.005l-5.15,4.578h-4.349V44.83C36.035,41.186,39,38.22,42.645,38.22z M54.813,58.877H42.645 c-3.645,0-6.609-2.966-6.609-6.611v-2.218h4.92l0,0c0.001,0,0.001,0,0.001,0h0.001c0.17-0.001,0.33-0.035,0.482-0.087 c0.02-0.007,0.038-0.011,0.058-0.019c0.154-0.06,0.294-0.146,0.419-0.251c0.011-0.01,0.025-0.013,0.036-0.022l4.187-3.722 l5.002,8.858c0.011,0.019,0.026,0.031,0.037,0.049c0.05,0.08,0.107,0.156,0.172,0.227c0.022,0.023,0.042,0.048,0.064,0.069 c0.084,0.08,0.175,0.154,0.279,0.215c0.001,0.001,0.003,0.001,0.005,0.002c0.09,0.052,0.188,0.087,0.286,0.119 c0.151,0.049,0.307,0.082,0.462,0.082h0.001h0.001c0.126,0,0.254-0.017,0.379-0.049c0.064-0.018,0.123-0.05,0.185-0.075 c0.058-0.023,0.117-0.038,0.173-0.069c0.106-0.06,0.198-0.134,0.284-0.213c0.023-0.022,0.044-0.048,0.066-0.071 c0.065-0.069,0.122-0.143,0.173-0.222c0.011-0.017,0.026-0.029,0.036-0.047l2.775-4.774h4.904v2.218 C61.424,55.911,58.458,58.877,54.813,58.877z"/><text x="0" y="80" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Adnen Kadri</text><text x="0" y="85" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 24 30" enable-background="new 0 0 24 24" xml:space="preserve"><g><path d="M10.613,17.556c0.164,0.163,0.382,0.254,0.612,0.254c0.231,0,0.449-0.091,0.613-0.254l1.951-1.951 c0.336-0.337,0.337-0.886,0-1.225l-3.48-3.479c-0.328-0.326-0.896-0.326-1.225,0l-1.951,1.951 c-0.163,0.164-0.253,0.381-0.253,0.612s0.09,0.448,0.253,0.612L10.613,17.556z M9.743,11.467l3.48,3.571l-1.951,1.951 c-0.016,0.017-0.034,0.021-0.047,0.021L7.7,13.418L9.743,11.467z"/><path d="M3.297,17.913l3.479,3.48c0.164,0.163,0.381,0.253,0.612,0.253s0.448-0.09,0.612-0.253l1.95-1.951 c0.164-0.163,0.255-0.381,0.255-0.612s-0.091-0.449-0.254-0.612l-3.479-3.48c-0.328-0.326-0.896-0.326-1.225,0l-1.951,1.951 c-0.163,0.164-0.253,0.381-0.253,0.612S3.134,17.749,3.297,17.913z M5.906,15.304l3.479,3.572l-1.951,1.951 c-0.016,0.017-0.033,0.02-0.046,0.02l-3.525-3.592L5.906,15.304z"/><path d="M14.451,13.719c0.164,0.163,0.381,0.253,0.612,0.253s0.448-0.09,0.612-0.253l1.951-1.951 c0.163-0.164,0.253-0.381,0.253-0.612s-0.09-0.448-0.253-0.612l-3.48-3.479c-0.326-0.328-0.898-0.327-1.225-0.001l-1.951,1.951 c-0.163,0.164-0.253,0.381-0.253,0.612s0.09,0.448,0.253,0.612L14.451,13.719z M13.58,7.63l3.48,3.571l-1.951,1.951 c-0.016,0.017-0.033,0.02-0.046,0.02l-3.526-3.591L13.58,7.63z"/><path d="M18.288,9.882c0.164,0.163,0.381,0.253,0.612,0.253s0.448-0.09,0.612-0.253l1.951-1.951 c0.163-0.164,0.253-0.381,0.253-0.612s-0.09-0.448-0.253-0.612l-3.48-3.48c-0.327-0.325-0.894-0.327-1.225,0l-1.951,1.952 c-0.336,0.338-0.336,0.886,0,1.225L18.288,9.882z M17.417,3.792l3.48,3.572l-1.951,1.951c-0.016,0.017-0.033,0.02-0.046,0.02 l-3.526-3.592L17.417,3.792z"/><path d="M1.269,15.692l-0.364,0.364c-0.337,0.338-0.337,0.887,0,1.225l6.375,6.374c0.164,0.163,0.381,0.253,0.612,0.253 c0.231,0,0.448-0.09,0.612-0.253L23.659,8.5c0.337-0.338,0.336-0.887-0.001-1.225l-6.374-6.374c-0.328-0.326-0.896-0.326-1.225,0 l-0.363,0.363l-0.928-0.928c-0.328-0.326-0.896-0.326-1.225,0l-2.746,2.746c0,0-0.001,0-0.001,0.001s0,0.001-0.001,0.001 L8.424,5.458C8.423,5.458,8.422,5.459,8.422,5.459S8.421,5.461,8.42,5.461l-2.13,2.13c-0.118,0.118-0.15,0.298-0.08,0.45 C6.457,8.578,6.345,9.218,5.93,9.633c-0.407,0.409-1.062,0.521-1.59,0.279c-0.152-0.069-0.331-0.038-0.45,0.08L0.342,13.54 c-0.163,0.164-0.253,0.381-0.253,0.612s0.09,0.448,0.253,0.612L1.269,15.692z M16.718,1.468l6.375,6.467L7.938,23.088 c-0.016,0.017-0.033,0.02-0.046,0.02l-6.421-6.485L16.718,1.468z M4.272,10.741c0.781,0.246,1.649,0.032,2.224-0.543 C7.077,9.616,7.28,8.753,7.04,7.976l0.558-0.551l0.429,0.428C8.105,7.931,8.207,7.97,8.309,7.97s0.205-0.039,0.283-0.118 c0.156-0.156,0.156-0.409-0.001-0.565L8.167,6.863L8.716,6.32l0.421,0.421C9.216,6.82,9.318,6.859,9.421,6.859 S9.626,6.82,9.704,6.741c0.156-0.156,0.156-0.41,0-0.566L9.286,5.758l0.549-0.542l0.413,0.414c0.078,0.079,0.181,0.118,0.283,0.118 s0.204-0.039,0.282-0.117c0.157-0.156,0.157-0.409,0.001-0.565l-0.411-0.411l0.702-0.693l0.406,0.406 c0.078,0.078,0.181,0.117,0.283,0.117s0.205-0.039,0.283-0.117c0.156-0.156,0.156-0.41,0-0.566l-0.403-0.403l0.549-0.542 l0.398,0.399c0.078,0.079,0.181,0.118,0.283,0.118s0.204-0.039,0.282-0.117c0.157-0.156,0.157-0.409,0.001-0.565l-0.396-0.396 l0.549-0.542l0.393,0.393c0.078,0.078,0.181,0.117,0.283,0.117s0.205-0.039,0.283-0.117c0.156-0.156,0.156-0.41,0-0.566 l-0.389-0.389l0.288-0.285l0.928,0.927L1.846,15.115l-0.938-1.008l0.219-0.219l0.431,0.432c0.078,0.079,0.181,0.118,0.283,0.118 s0.204-0.039,0.282-0.117c0.157-0.156,0.157-0.409,0.001-0.565l-0.432-0.433l0.447-0.447l0.432,0.432 c0.078,0.079,0.181,0.118,0.283,0.118s0.204-0.039,0.282-0.117c0.157-0.156,0.157-0.409,0.001-0.565l-0.433-0.433l0.447-0.447 l0.433,0.433c0.078,0.078,0.181,0.117,0.283,0.117s0.205-0.039,0.283-0.117c0.156-0.156,0.156-0.41,0-0.566l-0.433-0.433 L4.272,10.741z"/></g><text x="0" y="39" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Atif Arshad</text><text x="0" y="44" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 125" style="enable-background:new 0 0 100 100;" xml:space="preserve"><g><g><g><g><g><path d="M93.6,37c-0.2,0-0.4-0.1-0.6-0.2C90.2,35,86.9,34,83.5,34c-3.4,0-6.7,1-9.5,2.8 c-0.5,0.3-1.3,0.2-1.6-0.3c-0.3-0.5-0.2-1.3,0.3-1.6c3.2-2.1,7-3.2,10.8-3.2c3.8,0,7.5,1.1,10.8,3.2c0.5,0.3,0.7,1.1,0.3,1.6 C94.4,36.8,94,37,93.6,37z"/></g><g><path d="M98.8,30.6c-0.2,0-0.4-0.1-0.6-0.2c-4.4-2.8-9.5-4.3-14.7-4.3c-5.2,0-10.3,1.5-14.7,4.3 c-0.5,0.3-1.3,0.2-1.6-0.3c-0.3-0.5-0.2-1.3,0.3-1.6c4.8-3.1,10.3-4.7,16-4.7s11.2,1.6,16,4.7c0.5,0.3,0.7,1.1,0.3,1.6 C99.6,30.4,99.2,30.6,98.8,30.6z"/></g><g><path d="M87.6,42.6c-0.2,0-0.4-0.1-0.6-0.2c-2.1-1.3-4.9-1.3-7,0c-0.5,0.3-1.3,0.2-1.6-0.3 c-0.3-0.5-0.2-1.3,0.3-1.6c2.8-1.8,6.7-1.8,9.5,0c0.5,0.3,0.7,1.1,0.3,1.6C88.4,42.4,88,42.6,87.6,42.6z"/></g></g></g></g><g><path d="M39.5,79.4C17.7,79.4,0,61.7,0,39.9S17.7,0.4,39.5,0.4C53.8,0.4,67,8.2,74,20.7c0.3,0.6,0.1,1.3-0.4,1.6 c-0.6,0.3-1.3,0.1-1.6-0.4C65.4,10,53,2.7,39.5,2.7C19,2.7,2.3,19.4,2.3,39.9c0,20.5,16.7,37.2,37.2,37.2c8.6,0,17-3,23.6-8.5 c0.5-0.4,1.2-0.3,1.6,0.2c0.4,0.5,0.3,1.2-0.2,1.6C57.6,76.2,48.7,79.4,39.5,79.4z"/></g><g><path d="M39.5,65.1c-0.3,0-0.5,0-0.8,0c-7.8-0.4-14.2-6.8-14.5-14.7c-0.2-6,3-11.5,8.3-14.3V18.6 c0-3.9,3.1-7,7-7s7,3.1,7,7v17.6c5.1,2.6,8.3,7.9,8.3,13.6c0,4.2-1.7,8.2-4.8,11.1C47.2,63.7,43.5,65.1,39.5,65.1z M39.5,13.9 c-2.6,0-4.7,2.1-4.7,4.7v18.4c0,0.5-0.3,0.9-0.7,1.1c-4.9,2.2-7.8,7.1-7.6,12.4c0.3,6.6,5.7,12.1,12.3,12.4c3.6,0.2,7-1.1,9.6-3.6 c2.6-2.5,4-5.8,4-9.4c0-5.1-3-9.7-7.6-11.8c-0.4-0.2-0.7-0.6-0.7-1.1V18.6C44.2,16,42.1,13.9,39.5,13.9z"/></g><g><path d="M39.5,52c-0.6,0-1.2-0.5-1.2-1.2v-28c0-0.6,0.5-1.2,1.2-1.2c0.6,0,1.2,0.5,1.2,1.2v28 C40.7,51.4,40.1,52,39.5,52z"/></g><g><path d="M39.5,58.3c-4.3,0-7.8-3.2-8.4-7.3h-5.8c-0.6,0-1.2-0.5-1.2-1.2c0-0.6,0.5-1.2,1.2-1.2h6.9 c0.6,0,1.2,0.5,1.2,1.2c0,3.4,2.7,6.1,6.1,6.1c3.4,0,6.1-2.7,6.1-6.1c0-0.6,0.5-1.2,1.2-1.2h6.9c0.6,0,1.2,0.5,1.2,1.2 c0,0.6-0.5,1.2-1.2,1.2h-5.8C47.3,55.1,43.8,58.3,39.5,58.3z"/></g><g><path d="M83.5,99.6c-8.8,0-15.9-7.1-15.9-15.9V62c0-8.8,7.1-15.9,15.9-15.9S99.4,53.2,99.4,62v21.7 C99.4,92.5,92.3,99.6,83.5,99.6z M83.5,48.4c-7.5,0-13.6,6.1-13.6,13.6v21.7c0,7.5,6.1,13.6,13.6,13.6c7.5,0,13.6-6.1,13.6-13.6 V62C97.1,54.5,91,48.4,83.5,48.4z"/></g><g><path d="M83.5,90.5c-3.9,0-7-3.1-7-7c0-3.9,3.1-7,7-7c3.9,0,7,3.1,7,7C90.5,87.4,87.4,90.5,83.5,90.5z M83.5,78.8c-2.6,0-4.7,2.1-4.7,4.7c0,2.6,2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7C88.2,80.9,86.1,78.8,83.5,78.8z"/></g></g><text x="0" y="115" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Andrei Yushchenko</text><text x="0" y="120" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" viewBox="0 0 96 116.8875" x="0px" y="0px"><title>18</title><path d="M97.28,40.76A31.82,31.82,0,0,0,77.71,17.64c-1.4.77-4.47,2.39-7.48,3.64a15.14,15.14,0,0,1-7.81,1,18.06,18.06,0,0,0,2.17,2.18c2.15,2,2.8,6.45,2.8,6.45a20.36,20.36,0,0,1-2.3.45c-7.63.34-17.59-5.15-17.59-5.15-2.15-.11-6.28,1.64-9.68,3.11s-10.65,2-10.65,2A34.79,34.79,0,0,1,30,25.59C31.76,22.87,34,19.81,34,19.81c-2.5-1.09-4.93-3.91-6.09-5.39C8.43,20.62-2.47,42.28,3.75,62.49a48.65,48.65,0,0,0,52,34C91.82,92.46,100.84,56.46,97.28,40.76Z" transform="translate(-2 -3.24)"/><path d="M40.05,18.67C37.93,20.38,32.66,27,32.66,27s4.75-1.44,6.25-2.14c6-2.76,9.64-2.66,9.64-2.66a62.36,62.36,0,0,0,13.63,5.2c-.67-2.17-2.1-1.76-4-6.09-1.06-2.41,1.48-2.06,5.58-2.11C70.26,19.1,79,12.8,79,12.8c-3.24-.87-9.09,3.14-13.09,3a67.33,67.33,0,0,1-10.25-1.61c-2.67-1.35-2-6.31-1.43-8.7A1.74,1.74,0,0,0,53,3.42a8.21,8.21,0,0,0-3.26,0,1.63,1.63,0,0,0-.85.42C45.68,7,46.38,13.3,46.38,13.3a4,4,0,0,0,3.71,3.62c3.4.26,4.42-.85,4.42-.85s-1.77,3.46-7,2c-2-.56-3.21-2.36-3.93-4.47L40.37,14c-6.34-.44-12.43-8.1-12.43-8.1A17.59,17.59,0,0,0,40.05,18.67Z" transform="translate(-2 -3.24)"/><text x="0" y="108.51" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by parkjisun</text><text x="0" y="113.51" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1 +0,0 @@
<svg xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="-949 951 100 125" style="enable-background:new -949 951 100 100;" xml:space="preserve"><switch><foreignObject requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" x="0" y="0" width="1" height="1"/><g i:extraneous="self"><g><path d="M-913.3,970.5c1.3,0,2.3-1,2.3-2.3v-7.4c0-1.3-1-2.3-2.3-2.3c-1.3,0-2.3,1-2.3,2.3v7.4 C-915.5,969.5-914.5,970.5-913.3,970.5z"/><path d="M-931.5,976.8c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7c0.9-0.9,0.9-2.3,0-3.2l-5.3-5.3c-0.9-0.9-2.3-0.9-3.2,0 c-0.9,0.9-0.9,2.3,0,3.2L-931.5,976.8z"/><path d="M-934.5,991.8c0-1.3-1-2.3-2.3-2.3h-7.4c-1.3,0-2.3,1-2.3,2.3s1,2.3,2.3,2.3h7.4C-935.5,994.1-934.5,993-934.5,991.8z"/><path d="M-931.5,1006.8l-5.3,5.3c-0.9,0.9-0.9,2.3,0,3.2c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7l5.3-5.3 c0.9-0.9,0.9-2.3,0-3.2C-929.2,1005.9-930.6,1005.9-931.5,1006.8z"/><path d="M-896.6,977.4c0.6,0,1.2-0.2,1.6-0.7l5.3-5.3c0.9-0.9,0.9-2.3,0-3.2c-0.9-0.9-2.3-0.9-3.2,0l-5.3,5.3 c-0.9,0.9-0.9,2.3,0,3.2C-897.8,977.2-897.2,977.4-896.6,977.4z"/><path d="M-863.5,991.6c-2.7-7.7-10.1-13-18.3-13c-5.8,0-11.3,2.7-14.9,7c-2.5-6.7-8.9-11.5-16.5-11.5c-9.7,0-17.6,7.9-17.6,17.6 c0,6.6,3.7,12.4,9.1,15.4c-0.4,1.2-0.6,2.4-0.6,3.7c0,6.9,5.6,12.4,12.4,12.4h42.3c8.9,0,16.1-7.2,16.1-16.1 C-851.5,999.8-856.5,993.4-863.5,991.6z M-919.6,1003.2c-4-2.2-6.7-6.5-6.7-11.4c0-7.2,5.9-13.1,13.1-13.1 c6.1,0,11.3,4.3,12.7,10c-5.1,0.9-9.2,4.8-10.3,9.8C-914.4,998.8-917.5,1000.5-919.6,1003.2z M-867.6,1018.8h-42.3 c-4.3,0-7.9-3.5-7.9-7.9c0-4.3,3.5-7.9,7.9-7.9c0.3,0,0.5,0,0.8,0c0.6,0.1,1.2-0.1,1.7-0.5c0.5-0.4,0.8-1,0.8-1.6 c0.2-4.4,3.8-7.9,8.2-7.9c0.3,0,0.5,0,0.8,0c1,0.1,1.9-0.4,2.3-1.3c2.4-5.2,7.7-8.6,13.5-8.6c6.7,0,12.6,4.5,14.4,11 c0.2,0.9,0.9,1.5,1.8,1.6c5.6,1,9.6,5.8,9.6,11.4C-856.1,1013.6-861.3,1018.8-867.6,1018.8z"/><path d="M-904,1027.1c-1.2-0.5-2.5,0.1-3,1.3l-4.8,12c-0.5,1.2,0.1,2.5,1.3,3c0.3,0.1,0.6,0.2,0.9,0.2c0.9,0,1.8-0.5,2.1-1.4 l4.8-12C-902.3,1028.9-902.8,1027.6-904,1027.1z"/><path d="M-892,1027.1c-1.2-0.5-2.5,0.1-3,1.3l-4.8,12c-0.5,1.2,0.1,2.5,1.3,3c0.3,0.1,0.6,0.2,0.9,0.2c0.9,0,1.8-0.5,2.1-1.4 l4.8-12C-890.2,1028.9-890.8,1027.6-892,1027.1z"/><path d="M-879.9,1027.1c-1.2-0.5-2.5,0.1-3,1.3l-4.8,12c-0.5,1.2,0.1,2.5,1.3,3c0.3,0.1,0.6,0.2,0.9,0.2c0.9,0,1.8-0.5,2.1-1.4 l4.8-12C-878.2,1028.9-878.7,1027.6-879.9,1027.1z"/><path d="M-867.9,1027.1c-1.2-0.5-2.5,0.1-3,1.3l-4.8,12c-0.5,1.2,0.1,2.5,1.3,3c0.3,0.1,0.6,0.2,0.9,0.2c0.9,0,1.8-0.5,2.1-1.4 l4.8-12C-866.1,1028.9-866.7,1027.6-867.9,1027.1z"/></g></g></switch><text x="-949" y="1066" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Adrien Coquet</text><text x="-949" y="1071" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Loading…
Cancel
Save