This commit is contained in:
Th3maz1ng 2023-03-31 10:28:39 +02:00
commit 2650cf85f9
109 changed files with 9855 additions and 6082 deletions

6
.gitignore vendored
View File

@ -1,5 +1,9 @@
#Exclude the W800 SDK bin folder from the the git repository
src/W800 SDK v1.00.08/bin/
src/W800_SDK_v1.00.10/bin/
src/W800_SDK_v1.00.10/tools/w800/wm_getver.exe
src/W800_SDK_v1.00.10/tools/w800/w800_secboot.img
src/W800_SDK_v1.00.10/.vscode/
#Exclude the lvgl simulator bin and obj folders from the the git repository
src/lvgl_win_sim/lv_port_win_codeblocks/bin

View File

@ -1,4 +1,4 @@
MIT No Attribution Copyright <YEARr> <COPYRIGHT HOLDER>
MIT W800 SmartWatch Copyright 2023 Anatole SCHRAMM-HENRY
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

168
README.md
View File

@ -9,14 +9,83 @@ So let's go !
The W800 is a pretty interesting chip with impressive characteristics for its price (around 1$) :
### Core :
* 32bit XT804 CPU
* 240 Mhz frequency
* 240 Mhz max clock
### Memory :
* 2 MB on chip flash
* 288 KB RAM
* 288 KB RAM, ~130 KB available to the user
### Wireless connectivity :
* Bluetooth EDR(Classic) and BLE 4.2
* WiFi 2.4Ghz 802.11 b/g/n
### SDK & OS
* FreeRTOS v10.4.1
* BLE stack : NimBLE
* TCP IP stack : lwip v2.1.3
## Getting started :
### So, you'd like to try this project yourself ?
### Here are the steps to follow, in order to build the firmware and flash the board :
#### On Windows :
1) Start by cloning this repository.
**Put it in a path that doesn't contain any spaces** ie : "C:\Users\Bob\Desktop\projects" for example.
2) Once cloning is done, you will need to install the [MSYS2](https://www.msys2.org/) tool/environment. This tool is needed to compile the project using **Make**.
3) Open a terminal by clicking on the **MSYS2** icon and execute the following commands to prepare the environment :
1) Update packages :
```bash
pacman -Syu
```
2) Install make :
```bash
pacman -S msys/make
```
3) Install automake :
```bash
pacman -S msys/automake
```
4) Install autoconf :
```bash
pacman -S msys/autoconf
```
5) Install gcc :
```bash
pacman -S msys/gcc
```
6) Install git :
```bash
pacman -S msys/git
```
7) Install utils needed for menuconfig :
```bash
pacman -S msys/ncurses-devel
pacman -S msys/gettext-devel
```
4) You now, need to download the toolchain required to compile and link the app [here](http://82.157.145.101/download/toolkits/winnermicro/w806/csky-elfabiv2-tools-mingw-minilibc-20210423.tar.gz) and extract it somewhere you remember on your hardrive.
5) Now, go back to the MSYS terminal window and move to the **src/W800_SDK_v1.00.10/** directory which is located in the cloned repository, using the **cd** command.
6) Then, execute the **make menuconfig** command, this should greet you with a crude configuration window.
Move to the **Toolchain Configuration -->** option using the arrows and hit enter.
Using the same controls, move to the **toolchain path** and **set the location** to where you extracted the toolchain in step 4.
7) To be able to flash the board, you will also need to set the used com port in the **Download Configuration --->** option.
**TIPS : set the download rate to : 2000000**, this should speed up the flashing process.
8) Now save your configuration and exit.
9) Finally, type :
```bash
#This will remove all builded object to start from a clean environment (Needed only once)
make distclean
#This will only compile the library part of the firmware
make lib
#This will compile the actual firmware using the libraries and produce the .bin file
make
#This will flash the board using the previously generated .bin file
make down
#This will do both previous commands in one (build and flash)
make flash
```
## Sensors :
The goal is to embed the following sensors in the watch :
@ -40,7 +109,7 @@ Possible choices :
* ~~A piezo buzzer~~ : dropped, maybe in next version.
## Power source :
* 1 cell lipo 450 mAh battery.
* A single 450 mAh cell lipo battery.
* A charge/discharge controller.
## Screen + touch element :
@ -57,7 +126,7 @@ using a magnetic 4 pin plug.
|------------|----------|------|----------|-------------|--------------|---------|
||PB_20|I/O|**UART0_RX**/PWM1/UART1_CTS/I²C_SCL|U/D|**USB/Serial TX flash pin**||
||PB_19|I/O|**UART0_TX**/PWM0/UART1_RTS/**I²C_SDA**|U/D|**USB/Serial RX flash pin** and **BMA456, Touch Panel, HMC5883L and BMP280 SDA pins**||
||WAKEUP|I|**External Wake Up Pin**|D|**BMA456 IRQ line** and **Touch Panel IRQ line** through NAND Gate|The chip is waken up when the pin is HIGH|
||WAKEUP|I|**External Wake Up Pin**|D|**BMA456 IRQ 1 line** and **Touch Panel IRQ line** through NAND Gate|The chip is waken up when the pin is HIGH|
||RESET|I|Reset Pin|D|**Micro switch** and **USB/Serial RTS pin**||
||XTAL_OUT|O|External crystal output||||
||XTAL_IN|I|External crystal input||||
@ -89,49 +158,55 @@ using a magnetic 4 pin plug.
||PB_11|**I/O**|I²S_DO/MMC_D3/HSPI_DO/SDIO_D3|U/D|**BMA456 IRQ 2 line**||
||GND|P|Ground (Central Pad)||||
## What is done/working so far :
## What is done/working so far - HARDWARE :
* Schematic :
* First version of the schematic is done an available [here](design/Kicad/W800_Smart_Watch/W800_Smart_Watch.pdf).
* 2 layer PCB version 1.0 design is done based on the schematic. Waiting for the PCBs from JLCPCB.
* Wake up interrupts handling :
* Wrist tilt MCU wake up working
* LCD touch wake up
* MCU sleep feature :
* Sleep and Standby modes working but implemented in a crude way.
Can and should be improved.
* PIFA antenna tested, performance isn't the best but it is working well for what it will be used for (BLE).
## What is done/working so far - SOFTWARE :
* LVGL 8.3.3 running on the SOC using DMA.
* Supported LCD drivers :
* ILI9341 in 4-line serial mode (8 bits) with D/C pin
* ST7789 in 4-line serial mode (8 bits) with D/C pin
* GC9A01 in 4-line serial mode (8 bits) with D/C pin
* Supported LCD touch screen :
* CST816D capacitive touch ic.
* Three screens designed and working with LVGL :
* CST816D I2C capacitive touch ic.
* Four screens designed and working with LVGL :
* 1 watch face based on a casio watch.
* 1 menu list screen with icons.
* 1 menu screen with a list of icons.
* 1 setting screen with basic settings (date and time + display brightness) (work in progress).
* 1 compass application using the QMC5883L.
* Debug UART on PB_2 (output only)
* Wake up interrupts handling :
* Wrist tilt MCU wake up working
* LCD touch wake up
* Sensors/Actuators :
* QMC5883L driver working
* BMA456 driver working
* BMP280 driver working (temperature + pressure)
* BMP280 driver working (temperature + pressure + altitude)
* Battery voltage sense using ADC is working
* Vibration motor controlled by PWM working
* Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
## To do - HARDWARE:
* [ ] Add the MAX30102 Heart Rate Monitor to the current design.
* [ ] Fix the issue with the DW01A chip, should be as easy as to replace the 100nf C12 cap with a lower value, let's say 80nf.
## To do - SOFTWARE
* [X] Finish to design the settings page.
* [X] Implement watch settings persistency using the integrated flash memory
* [ ] Implement a good algorithm to handle adaptiv MCU clock
to save power
* Drivers:
* [ ] Write/port the MAX30102 Heart Rate Monitor driver to the project.
* [ ] Add a wake up alarm app (using the vibration motor).
* [ ] Add BLE functionality.
## To do :
* Write I2C drivers for the :
* [X] BMA456
* [X] Wrist tilt detection
* [X] BMP280
* [X] Temperature
* [X] Pressure
* [X] QMC5883L
* [X] Write the init sequence for the GC9A01 LCD driver.
* [X] Make LCD display + touch work.
* [X] Design and test battery voltage sensing circuit -> voltage divider bridge because ADC input can sense 2.5V Max.
* [ ] Finish to design the settings page.
* [ ] Implement a good algorithm to handle adaptiv MCU clock to save power
* [X] Test the charge circuit.
* [X] Handle watch auto sleep feature with wake up on screen touch + wrist tilt (POC could be improved).
* Design and test the :
* [X] vibration motor circuit
* [X] Draw the schematic, the first revision of the schematic is available [here](design/Kicad/W800_Smart_Watch/W800_Smart_Watch.pdf).
* [X] Design the PCB (routing, placement etc..) on a 2 layer PCB - done.
* [ ] Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
## Achieved power consumption recap:
(Need to work on sleep current :-( )
@ -151,3 +226,32 @@ using a magnetic 4 pin plug.
### The back :
![](http://82.64.196.164/images/git/rendering_back.png)
## Update 21/03/2023 : PCBs were received from JLCPCB and this what they look like :
![](http://82.64.196.164/images/git/W800_pcb_1.png)
![](http://82.64.196.164/images/git/W800_pcb_2.png)
## And the watch running :
![](http://82.64.196.164/images/git/W800_running.png)
### **Almost everything works :**
* BMA456 ✓
* BMP280 ✓
* QMC5883L ✓
* Screen + touch panel ✓
* CH340E for chip programming ✓
* Vibration motor ✓
* Charge IC ✓
### **To sort out :**
* DW01A chip not driving the double N mosfet as expected :-(
* Round lipo battery not having the capacity advertised, will have to change it :-(
## Next steps :
* Finish to design and print the casing.
* Find an other battery 450 mAh or bigger would be great.
* Add BLE.
* Write and release a usable firmware for every day use.
## If you are interested by the project or if you just want to say hi, you can contact me at the email address : bugreport[at]laposte.net .

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Bot*
G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*
@ -29,17 +29,17 @@ G04 Aperture macros list*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,1.000000*%
%ADD11RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD12RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD13RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD14RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD15RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD16RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD17R,1.200000X1.500000*%
%ADD18RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD19RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD20RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD10RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD11RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD12RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD13RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD14RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD15RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD16R,1.200000X1.500000*%
%ADD17RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD18RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD19RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD20C,1.000000*%
%ADD21RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*%
%ADD22RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD23RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
@ -57,60 +57,57 @@ G04 Aperture macros list end*
%ADD35RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*%
G04 APERTURE END LIST*
D10*
X153000000Y-98200000D03*
X147000000Y-94200000D03*
X147000000Y-98800000D03*
X147000000Y-91940000D03*
D11*
X161516000Y-115316000D03*
X160556000Y-115316000D03*
D12*
D11*
X159512000Y-87120000D03*
X159512000Y-88140000D03*
D13*
D12*
X167100000Y-93775000D03*
X167100000Y-92225000D03*
D14*
D13*
X163068000Y-89210000D03*
X163068000Y-90170000D03*
D15*
D14*
X157734000Y-106116380D03*
X157734000Y-104216380D03*
D16*
D15*
X162605000Y-93680000D03*
X162605000Y-92720000D03*
X163621000Y-93680000D03*
X163621000Y-92720000D03*
D17*
D16*
X169530000Y-106190000D03*
X164330000Y-106190000D03*
D18*
D17*
X160780000Y-110490000D03*
X161800000Y-110490000D03*
D19*
D18*
X145354000Y-86360000D03*
X146304000Y-86360000D03*
X147254000Y-86360000D03*
X147254000Y-88635000D03*
X145354000Y-88635000D03*
D18*
D17*
X161542000Y-96520000D03*
X162562000Y-96520000D03*
D14*
D13*
X159258000Y-115344000D03*
X159258000Y-116304000D03*
D20*
D19*
X157922000Y-113405500D03*
X156972000Y-113405500D03*
X156022000Y-113405500D03*
X156022000Y-111130500D03*
X157922000Y-111130500D03*
D16*
D15*
X159258000Y-113510000D03*
X159258000Y-112550000D03*
D12*
D11*
X161563000Y-92690000D03*
X161563000Y-93710000D03*
D20*
X147000000Y-91940000D03*
D21*
X165632500Y-103490000D03*
X165632500Y-101590000D03*
@ -141,7 +138,7 @@ X146472000Y-111236000D03*
D25*
X160782000Y-114302000D03*
X160782000Y-113282000D03*
D12*
D11*
X143690000Y-91610000D03*
X143690000Y-92630000D03*
X144730000Y-90050000D03*
@ -152,30 +149,30 @@ X152670000Y-111250000D03*
D24*
X143156400Y-107746800D03*
X142136400Y-107746800D03*
D12*
D11*
X154686000Y-112774000D03*
X154686000Y-113794000D03*
D27*
X148590000Y-112334000D03*
X148590000Y-114234000D03*
D16*
D15*
X166370000Y-112748000D03*
X166370000Y-111788000D03*
D11*
D10*
X161262000Y-117348000D03*
X160302000Y-117348000D03*
D28*
X164084000Y-114614000D03*
X164084000Y-109414000D03*
D10*
D20*
X149250400Y-105664000D03*
D25*
X164637000Y-93710000D03*
X164637000Y-92690000D03*
D14*
D13*
X162052000Y-89210000D03*
X162052000Y-90170000D03*
D12*
D11*
X166370000Y-108710000D03*
X166370000Y-109730000D03*
D29*
@ -187,15 +184,19 @@ X152746000Y-118985000D03*
D31*
X150246000Y-115210000D03*
X154046000Y-115210000D03*
D10*
D20*
X155041600Y-105664000D03*
D24*
X149606000Y-109728000D03*
X148586000Y-109728000D03*
D20*
X147000000Y-98800000D03*
D32*
X160274000Y-96012000D03*
X158374000Y-96012000D03*
X159324000Y-94137000D03*
D20*
X153000000Y-98200000D03*
D24*
X163832000Y-103886000D03*
X162812000Y-103886000D03*
@ -205,27 +206,29 @@ X161800000Y-87120000D03*
D33*
X155222000Y-102616000D03*
X156182000Y-102616000D03*
D16*
D15*
X161290000Y-106018000D03*
X161290000Y-105058000D03*
D14*
D13*
X159258000Y-110518000D03*
X159258000Y-111478000D03*
D34*
X139860000Y-107160000D03*
X139860000Y-109260000D03*
D14*
D13*
X150114000Y-112324000D03*
X150114000Y-113284000D03*
D24*
X149606000Y-110744000D03*
X148586000Y-110744000D03*
D12*
D11*
X164100000Y-89190000D03*
X164100000Y-90210000D03*
D15*
D14*
X159766000Y-106116380D03*
X159766000Y-104216380D03*
D20*
X147000000Y-94200000D03*
D35*
X169926000Y-103425000D03*
X169926000Y-101600000D03*
@ -235,12 +238,12 @@ X164050000Y-101780000D03*
D34*
X143240000Y-112710000D03*
X143240000Y-114810000D03*
D10*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
D20*
X137479817Y-110861059D03*
D19*
X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D18*
X155514000Y-116210500D03*
X156464000Y-116210500D03*
X157414000Y-116210500D03*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*
@ -227,10 +227,10 @@ D33*
X143240000Y-112710000D03*
X143240000Y-114810000D03*
D35*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
X137479817Y-110861059D03*
X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D18*
X155514000Y-116210500D03*
X156464000Y-116210500D03*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*
@ -29,23 +29,23 @@ G04 Aperture macros list*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,0.300000*%
%ADD10C,0.150000*%
%ADD11C,0.213592*%
%ADD12C,0.200000*%
%ADD13C,0.150000*%
%ADD12C,0.300000*%
%ADD13C,0.200000*%
%ADD14C,0.120000*%
%ADD15C,0.250000*%
%ADD16C,1.000000*%
%ADD17RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD18RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD19RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD20RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD21RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD22RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD23R,1.200000X1.500000*%
%ADD24RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD25RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD26RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD16RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD17RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD18RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD19RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD20RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD21RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD22R,1.200000X1.500000*%
%ADD23RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD24RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD25RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD26C,1.000000*%
%ADD27RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*%
%ADD28RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD29RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
@ -63,6 +63,243 @@ G04 Aperture macros list end*
%ADD41RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*%
G04 APERTURE END LIST*
D10*
X150638095Y-90052380D02*
X150019047Y-90052380D01*
X150352380Y-90433333D01*
X150209523Y-90433333D01*
X150114285Y-90480952D01*
X150066666Y-90528571D01*
X150019047Y-90623809D01*
X150019047Y-90861904D01*
X150066666Y-90957142D01*
X150114285Y-91004761D01*
X150209523Y-91052380D01*
X150495238Y-91052380D01*
X150590476Y-91004761D01*
X150638095Y-90957142D01*
X149733333Y-90052380D02*
X149400000Y-91052380D01*
X149066666Y-90052380D01*
X148828571Y-90052380D02*
X148209523Y-90052380D01*
X148542857Y-90433333D01*
X148400000Y-90433333D01*
X148304761Y-90480952D01*
X148257142Y-90528571D01*
X148209523Y-90623809D01*
X148209523Y-90861904D01*
X148257142Y-90957142D01*
X148304761Y-91004761D01*
X148400000Y-91052380D01*
X148685714Y-91052380D01*
X148780952Y-91004761D01*
X148828571Y-90957142D01*
X150600476Y-94604761D02*
X150457619Y-94652380D01*
X150219523Y-94652380D01*
X150124285Y-94604761D01*
X150076666Y-94557142D01*
X150029047Y-94461904D01*
X150029047Y-94366666D01*
X150076666Y-94271428D01*
X150124285Y-94223809D01*
X150219523Y-94176190D01*
X150410000Y-94128571D01*
X150505238Y-94080952D01*
X150552857Y-94033333D01*
X150600476Y-93938095D01*
X150600476Y-93842857D01*
X150552857Y-93747619D01*
X150505238Y-93700000D01*
X150410000Y-93652380D01*
X150171904Y-93652380D01*
X150029047Y-93700000D01*
X149029047Y-94557142D02*
X149076666Y-94604761D01*
X149219523Y-94652380D01*
X149314761Y-94652380D01*
X149457619Y-94604761D01*
X149552857Y-94509523D01*
X149600476Y-94414285D01*
X149648095Y-94223809D01*
X149648095Y-94080952D01*
X149600476Y-93890476D01*
X149552857Y-93795238D01*
X149457619Y-93700000D01*
X149314761Y-93652380D01*
X149219523Y-93652380D01*
X149076666Y-93700000D01*
X149029047Y-93747619D01*
X148124285Y-94652380D02*
X148600476Y-94652380D01*
X148600476Y-93652380D01*
X152014285Y-98604761D02*
X151871428Y-98652380D01*
X151633333Y-98652380D01*
X151538095Y-98604761D01*
X151490476Y-98557142D01*
X151442857Y-98461904D01*
X151442857Y-98366666D01*
X151490476Y-98271428D01*
X151538095Y-98223809D01*
X151633333Y-98176190D01*
X151823809Y-98128571D01*
X151919047Y-98080952D01*
X151966666Y-98033333D01*
X152014285Y-97938095D01*
X152014285Y-97842857D01*
X151966666Y-97747619D01*
X151919047Y-97700000D01*
X151823809Y-97652380D01*
X151585714Y-97652380D01*
X151442857Y-97700000D01*
X151014285Y-98652380D02*
X151014285Y-97652380D01*
X150776190Y-97652380D01*
X150633333Y-97700000D01*
X150538095Y-97795238D01*
X150490476Y-97890476D01*
X150442857Y-98080952D01*
X150442857Y-98223809D01*
X150490476Y-98414285D01*
X150538095Y-98509523D01*
X150633333Y-98604761D01*
X150776190Y-98652380D01*
X151014285Y-98652380D01*
X150061904Y-98366666D02*
X149585714Y-98366666D01*
X150157142Y-98652380D02*
X149823809Y-97652380D01*
X149490476Y-98652380D01*
X156301904Y-107662380D02*
X156301904Y-106662380D01*
X156063809Y-106662380D01*
X155920952Y-106710000D01*
X155825714Y-106805238D01*
X155778095Y-106900476D01*
X155730476Y-107090952D01*
X155730476Y-107233809D01*
X155778095Y-107424285D01*
X155825714Y-107519523D01*
X155920952Y-107614761D01*
X156063809Y-107662380D01*
X156301904Y-107662380D01*
X154968571Y-107138571D02*
X154825714Y-107186190D01*
X154778095Y-107233809D01*
X154730476Y-107329047D01*
X154730476Y-107471904D01*
X154778095Y-107567142D01*
X154825714Y-107614761D01*
X154920952Y-107662380D01*
X155301904Y-107662380D01*
X155301904Y-106662380D01*
X154968571Y-106662380D01*
X154873333Y-106710000D01*
X154825714Y-106757619D01*
X154778095Y-106852857D01*
X154778095Y-106948095D01*
X154825714Y-107043333D01*
X154873333Y-107090952D01*
X154968571Y-107138571D01*
X155301904Y-107138571D01*
X153778095Y-106710000D02*
X153873333Y-106662380D01*
X154016190Y-106662380D01*
X154159047Y-106710000D01*
X154254285Y-106805238D01*
X154301904Y-106900476D01*
X154349523Y-107090952D01*
X154349523Y-107233809D01*
X154301904Y-107424285D01*
X154254285Y-107519523D01*
X154159047Y-107614761D01*
X154016190Y-107662380D01*
X153920952Y-107662380D01*
X153778095Y-107614761D01*
X153730476Y-107567142D01*
X153730476Y-107233809D01*
X153920952Y-107233809D01*
X150011904Y-106710000D02*
X150107142Y-106662380D01*
X150250000Y-106662380D01*
X150392857Y-106710000D01*
X150488095Y-106805238D01*
X150535714Y-106900476D01*
X150583333Y-107090952D01*
X150583333Y-107233809D01*
X150535714Y-107424285D01*
X150488095Y-107519523D01*
X150392857Y-107614761D01*
X150250000Y-107662380D01*
X150154761Y-107662380D01*
X150011904Y-107614761D01*
X149964285Y-107567142D01*
X149964285Y-107233809D01*
X150154761Y-107233809D01*
X149535714Y-107662380D02*
X149535714Y-106662380D01*
X148964285Y-107662380D01*
X148964285Y-106662380D01*
X148488095Y-107662380D02*
X148488095Y-106662380D01*
X148250000Y-106662380D01*
X148107142Y-106710000D01*
X148011904Y-106805238D01*
X147964285Y-106900476D01*
X147916666Y-107090952D01*
X147916666Y-107233809D01*
X147964285Y-107424285D01*
X148011904Y-107519523D01*
X148107142Y-107614761D01*
X148250000Y-107662380D01*
X148488095Y-107662380D01*
X147161904Y-100100000D02*
X147257142Y-100052380D01*
X147400000Y-100052380D01*
X147542857Y-100100000D01*
X147638095Y-100195238D01*
X147685714Y-100290476D01*
X147733333Y-100480952D01*
X147733333Y-100623809D01*
X147685714Y-100814285D01*
X147638095Y-100909523D01*
X147542857Y-101004761D01*
X147400000Y-101052380D01*
X147304761Y-101052380D01*
X147161904Y-101004761D01*
X147114285Y-100957142D01*
X147114285Y-100623809D01*
X147304761Y-100623809D01*
X146685714Y-101052380D02*
X146685714Y-100052380D01*
X146114285Y-101052380D01*
X146114285Y-100052380D01*
X145638095Y-101052380D02*
X145638095Y-100052380D01*
X145400000Y-100052380D01*
X145257142Y-100100000D01*
X145161904Y-100195238D01*
X145114285Y-100290476D01*
X145066666Y-100480952D01*
X145066666Y-100623809D01*
X145114285Y-100814285D01*
X145161904Y-100909523D01*
X145257142Y-101004761D01*
X145400000Y-101052380D01*
X145638095Y-101052380D01*
D11*
X141946796Y-112010000D02*
G75*
G03*
X141946796Y-112010000I-106796J0D01*
G01*
X154986796Y-115070000D02*
G75*
G03*
X154986796Y-115070000I-106796J0D01*
G01*
D12*
X154414285Y-97207142D02*
X154200000Y-97278571D01*
X153842857Y-97278571D01*
@ -178,18 +415,7 @@ X142271428Y-96278571D01*
X142485714Y-96278571D01*
X142628571Y-96350000D01*
X142700000Y-96421428D01*
D11*
X141946796Y-112010000D02*
G75*
G03*
X141946796Y-112010000I-106796J0D01*
G01*
X154986796Y-115070000D02*
G75*
G03*
X154986796Y-115070000I-106796J0D01*
G01*
D12*
D13*
X169384552Y-108488171D02*
X169241695Y-108535790D01*
X169194076Y-108583409D01*
@ -218,7 +444,7 @@ X167955980Y-108011980D01*
X167622647Y-108726266D01*
X167289314Y-108011980D01*
X167289314Y-109011980D01*
D10*
D12*
X154472400Y-102293028D02*
X154400971Y-102221600D01*
X154258114Y-102150171D01*
@ -444,7 +670,7 @@ X149019285Y-100097084D01*
X148938333Y-99935179D01*
X148857380Y-99854227D01*
X148695476Y-99773274D01*
D12*
D13*
X155737123Y-85170666D02*
X155260933Y-85170666D01*
X155832361Y-85456380D02*
@ -622,14 +848,14 @@ X150260933Y-88676380D01*
X150594266Y-87676380D02*
X150260933Y-88200190D01*
X149927600Y-87676380D01*
D13*
D10*
X151206152Y-119705428D02*
X150444247Y-119705428D01*
X150825200Y-120086380D02*
X150825200Y-119324476D01*
X153898552Y-119705428D02*
X153136647Y-119705428D01*
D12*
D13*
X161685219Y-109723180D02*
X162018552Y-109246990D01*
X162256647Y-109723180D02*
@ -667,7 +893,7 @@ X160447123Y-108723180D02*
X159875695Y-108723180D01*
X160161409Y-109723180D02*
X160161409Y-108723180D01*
D13*
D10*
X163057142Y-114733333D02*
X163104761Y-114685714D01*
X163152380Y-114542857D01*
@ -2045,10 +2271,25 @@ X144334285Y-115538095D01*
X144381904Y-115680952D01*
X144953333Y-116252380D01*
X144334285Y-116252380D01*
X136077739Y-108599845D02*
X135494086Y-109089588D01*
X136030784Y-109136543D02*
X135541041Y-108552891D01*
X141837739Y-112659845D02*
X141254086Y-113149588D01*
X141790784Y-113196543D02*
X141301041Y-112612891D01*
X141201415Y-112168194D02*
X140558627Y-111402150D01*
X140376236Y-111555195D01*
X140297410Y-111683500D01*
X140285671Y-111817674D01*
X140310411Y-111921240D01*
X140396368Y-112097762D01*
X140488195Y-112207197D01*
X140647109Y-112322501D01*
X140744805Y-112364849D01*
X140878980Y-112376587D01*
X141019024Y-112321239D01*
X141201415Y-112168194D01*
X142417739Y-116249845D02*
X141834086Y-116739588D01*
X141125633Y-110450278D02*
X140482845Y-109684234D01*
X140300454Y-109837278D01*
@ -2064,46 +2305,11 @@ X140943242Y-110603323D01*
X141125633Y-110450278D01*
X140114717Y-110801239D02*
X139531064Y-111290982D01*
X142417739Y-116249845D02*
X141834086Y-116739588D01*
X141201415Y-112168194D02*
X140558627Y-111402150D01*
X140376236Y-111555195D01*
X140297410Y-111683500D01*
X140285671Y-111817674D01*
X140310411Y-111921240D01*
X140396368Y-112097762D01*
X140488195Y-112207197D01*
X140647109Y-112322501D01*
X140744805Y-112364849D01*
X140878980Y-112376587D01*
X141019024Y-112321239D01*
X141201415Y-112168194D01*
X141837739Y-112659845D02*
X141254086Y-113149588D01*
X141790784Y-113196543D02*
X141301041Y-112612891D01*
X136077739Y-108599845D02*
X135494086Y-109089588D01*
X136030784Y-109136543D02*
X135541041Y-108552891D01*
D14*
X153700000Y-98200000D02*
G75*
G03*
X153700000Y-98200000I-700000J0D01*
G01*
X147700000Y-94200000D02*
G75*
G03*
X147700000Y-94200000I-700000J0D01*
G01*
X147700000Y-98800000D02*
G75*
G03*
X147700000Y-98800000I-700000J0D01*
G01*
X147700000Y-91940000D02*
G75*
G03*
X147700000Y-91940000I-700000J0D01*
G01*
X161143836Y-114956000D02*
X160928164Y-114956000D01*
X161143836Y-115676000D02*
@ -2176,6 +2382,11 @@ X161943000Y-93046359D02*
X161943000Y-93353641D01*
X161183000Y-93046359D02*
X161183000Y-93353641D01*
X147700000Y-91940000D02*
G75*
G03*
X147700000Y-91940000I-700000J0D01*
G01*
X166570000Y-100980000D02*
X165920000Y-100980000D01*
X166570000Y-104100000D02*
@ -2200,7 +2411,7 @@ X151510000Y-112927641D02*
X151510000Y-112620359D01*
X150750000Y-112927641D02*
X150750000Y-112620359D01*
D13*
D10*
X142597000Y-108561000D02*
X145947000Y-108561000D01*
X142597000Y-111686000D02*
@ -2281,7 +2492,7 @@ X155017602Y-96598727D02*
X155170105Y-96751230D01*
X155526719Y-96089610D02*
X155679222Y-96242113D01*
D13*
D10*
X150546000Y-119090000D02*
X150046000Y-119090000D01*
X150046000Y-116090000D02*
@ -2308,6 +2519,11 @@ X149249641Y-110108000D02*
X148942359Y-110108000D01*
X149249641Y-109348000D02*
X148942359Y-109348000D01*
X147700000Y-98800000D02*
G75*
G03*
X147700000Y-98800000I-700000J0D01*
G01*
X157764000Y-95074500D02*
X157764000Y-94424500D01*
X160884000Y-95074500D02*
@ -2316,6 +2532,11 @@ X157764000Y-95074500D02*
X157764000Y-95724500D01*
X160884000Y-95074500D02*
X160884000Y-96749500D01*
X153700000Y-98200000D02*
G75*
G03*
X153700000Y-98200000I-700000J0D01*
G01*
X163475641Y-103506000D02*
X163168359Y-103506000D01*
X163475641Y-104266000D02*
@ -2358,6 +2579,11 @@ X159031000Y-105427632D02*
X159031000Y-104905128D01*
X160501000Y-105427632D02*
X160501000Y-104905128D01*
X147700000Y-94200000D02*
G75*
G03*
X147700000Y-94200000I-700000J0D01*
G01*
X169191000Y-102739564D02*
X169191000Y-102285436D01*
X170661000Y-102739564D02*
@ -2372,14 +2598,14 @@ X142390000Y-112260000D02*
X144090000Y-112260000D01*
X144090000Y-112260000D02*
X144090000Y-114810000D01*
X135752805Y-110358610D02*
X140895106Y-116486965D01*
X140895106Y-116486965D02*
X142427195Y-115201390D01*
X142427195Y-115201390D02*
X137284894Y-109073035D01*
X137284894Y-109073035D02*
X135752805Y-110358610D01*
X142427195Y-115201390D02*
X137284894Y-109073035D01*
X140895106Y-116486965D02*
X142427195Y-115201390D01*
X135752805Y-110358610D02*
X140895106Y-116486965D01*
X158024000Y-117348000D02*
X158024000Y-116548000D01*
X154904000Y-117348000D02*
@ -2390,60 +2616,57 @@ X154904000Y-117348000D02*
X154904000Y-115548000D01*
%LPC*%
D16*
X153000000Y-98200000D03*
X147000000Y-94200000D03*
X147000000Y-98800000D03*
X147000000Y-91940000D03*
D17*
X161516000Y-115316000D03*
X160556000Y-115316000D03*
D18*
D17*
X159512000Y-87120000D03*
X159512000Y-88140000D03*
D19*
D18*
X167100000Y-93775000D03*
X167100000Y-92225000D03*
D20*
D19*
X163068000Y-89210000D03*
X163068000Y-90170000D03*
D21*
D20*
X157734000Y-106116380D03*
X157734000Y-104216380D03*
D22*
D21*
X162605000Y-93680000D03*
X162605000Y-92720000D03*
X163621000Y-93680000D03*
X163621000Y-92720000D03*
D23*
D22*
X169530000Y-106190000D03*
X164330000Y-106190000D03*
D24*
D23*
X160780000Y-110490000D03*
X161800000Y-110490000D03*
D25*
D24*
X145354000Y-86360000D03*
X146304000Y-86360000D03*
X147254000Y-86360000D03*
X147254000Y-88635000D03*
X145354000Y-88635000D03*
D24*
D23*
X161542000Y-96520000D03*
X162562000Y-96520000D03*
D20*
D19*
X159258000Y-115344000D03*
X159258000Y-116304000D03*
D26*
D25*
X157922000Y-113405500D03*
X156972000Y-113405500D03*
X156022000Y-113405500D03*
X156022000Y-111130500D03*
X157922000Y-111130500D03*
D22*
D21*
X159258000Y-113510000D03*
X159258000Y-112550000D03*
D18*
D17*
X161563000Y-92690000D03*
X161563000Y-93710000D03*
D26*
X147000000Y-91940000D03*
D27*
X165632500Y-103490000D03*
X165632500Y-101590000D03*
@ -2474,7 +2697,7 @@ X146472000Y-111236000D03*
D31*
X160782000Y-114302000D03*
X160782000Y-113282000D03*
D18*
D17*
X143690000Y-91610000D03*
X143690000Y-92630000D03*
X144730000Y-90050000D03*
@ -2485,30 +2708,30 @@ X152670000Y-111250000D03*
D30*
X143156400Y-107746800D03*
X142136400Y-107746800D03*
D18*
D17*
X154686000Y-112774000D03*
X154686000Y-113794000D03*
D33*
X148590000Y-112334000D03*
X148590000Y-114234000D03*
D22*
D21*
X166370000Y-112748000D03*
X166370000Y-111788000D03*
D17*
D16*
X161262000Y-117348000D03*
X160302000Y-117348000D03*
D34*
X164084000Y-114614000D03*
X164084000Y-109414000D03*
D16*
D26*
X149250400Y-105664000D03*
D31*
X164637000Y-93710000D03*
X164637000Y-92690000D03*
D20*
D19*
X162052000Y-89210000D03*
X162052000Y-90170000D03*
D18*
D17*
X166370000Y-108710000D03*
X166370000Y-109730000D03*
D35*
@ -2520,15 +2743,19 @@ X152746000Y-118985000D03*
D37*
X150246000Y-115210000D03*
X154046000Y-115210000D03*
D16*
D26*
X155041600Y-105664000D03*
D30*
X149606000Y-109728000D03*
X148586000Y-109728000D03*
D26*
X147000000Y-98800000D03*
D38*
X160274000Y-96012000D03*
X158374000Y-96012000D03*
X159324000Y-94137000D03*
D26*
X153000000Y-98200000D03*
D30*
X163832000Y-103886000D03*
X162812000Y-103886000D03*
@ -2538,27 +2765,29 @@ X161800000Y-87120000D03*
D39*
X155222000Y-102616000D03*
X156182000Y-102616000D03*
D22*
D21*
X161290000Y-106018000D03*
X161290000Y-105058000D03*
D20*
D19*
X159258000Y-110518000D03*
X159258000Y-111478000D03*
D40*
X139860000Y-107160000D03*
X139860000Y-109260000D03*
D20*
D19*
X150114000Y-112324000D03*
X150114000Y-113284000D03*
D30*
X149606000Y-110744000D03*
X148586000Y-110744000D03*
D18*
D17*
X164100000Y-89190000D03*
X164100000Y-90210000D03*
D21*
D20*
X159766000Y-106116380D03*
X159766000Y-104216380D03*
D26*
X147000000Y-94200000D03*
D41*
X169926000Y-103425000D03*
X169926000Y-101600000D03*
@ -2568,12 +2797,12 @@ X164050000Y-101780000D03*
D40*
X143240000Y-112710000D03*
X143240000Y-114810000D03*
D16*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
D26*
X137479817Y-110861059D03*
D25*
X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D24*
X155514000Y-116210500D03*
X156464000Y-116210500D03*
X157414000Y-116210500D03*

View File

@ -1,11 +1,11 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Top*
G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Top*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00*
G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Top*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*%
%LPD*%
G01*

View File

@ -1,12 +1,12 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*%
%TF.CreationDate,2023-02-26T11:53:20+01:00*%
%TF.CreationDate,2023-03-04T08:18:30+01:00*%
%TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Drillmap*%
%TF.FilePolarity,Positive*%
%FSLAX45Y45*%
G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:20*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:30*
%MOMM*%
%LPD*%
G01*

View File

@ -71,7 +71,7 @@ endobj
10 0 obj
<<
/Producer (KiCad PDF)
/CreationDate (D:20230226115323)
/CreationDate (D:20230304081832)
/Creator (PCBNEW)
/Title (W800_Smart_Watch-NPTH-drl_map.pdf)
>>

View File

@ -1,7 +1,7 @@
M48
; DRILL file {KiCad (6.0.10)} date Sun Feb 26 11:53:23 2023
; DRILL file {KiCad (6.0.10)} date Sat Mar 4 08:18:32 2023
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2023-02-26T11:53:23+01:00
; #@! TF.CreationDate,2023-03-04T08:18:32+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10)
; #@! TF.FileFunction,NonPlated,1,2,NPTH
FMAT,2

View File

@ -1,12 +1,12 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*%
%TF.CreationDate,2023-02-26T11:53:20+01:00*%
%TF.CreationDate,2023-03-04T08:18:30+01:00*%
%TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Drillmap*%
%TF.FilePolarity,Positive*%
%FSLAX45Y45*%
G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:20*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:30*
%MOMM*%
%LPD*%
G01*
@ -243,6 +243,10 @@ X14435000Y-10130000D02*
X14465000Y-10160000D01*
X14465000Y-10130000D02*
X14435000Y-10160000D01*
X14458000Y-9287000D02*
X14488000Y-9317000D01*
X14488000Y-9287000D02*
X14458000Y-9317000D01*
X14463000Y-10018000D02*
X14493000Y-10048000D01*
X14493000Y-10018000D02*
@ -255,22 +259,22 @@ X14463000Y-10589500D02*
X14493000Y-10619500D01*
X14493000Y-10589500D02*
X14463000Y-10619500D01*
X14469000Y-9254000D02*
X14499000Y-9284000D01*
X14499000Y-9254000D02*
X14469000Y-9284000D01*
X14464000Y-9165000D02*
X14494000Y-9195000D01*
X14494000Y-9165000D02*
X14464000Y-9195000D01*
X14483000Y-10374000D02*
X14513000Y-10404000D01*
X14513000Y-10374000D02*
X14483000Y-10404000D01*
X14488400Y-9179800D02*
X14518400Y-9209800D01*
X14518400Y-9179800D02*
X14488400Y-9209800D01*
X14513800Y-10957800D02*
X14543800Y-10987800D01*
X14543800Y-10957800D02*
X14513800Y-10987800D01*
X14517000Y-8426000D02*
X14547000Y-8456000D01*
X14547000Y-8426000D02*
X14517000Y-8456000D01*
X14526500Y-9637000D02*
X14556500Y-9667000D01*
X14556500Y-9637000D02*
@ -299,6 +303,10 @@ X14555000Y-9373000D02*
X14585000Y-9403000D01*
X14585000Y-9373000D02*
X14555000Y-9403000D01*
X14563000Y-9252000D02*
X14593000Y-9282000D01*
X14593000Y-9252000D02*
X14563000Y-9282000D01*
X14564000Y-10379000D02*
X14594000Y-10409000D01*
X14594000Y-10379000D02*
@ -387,6 +395,10 @@ X14718000Y-10795000D02*
X14748000Y-10825000D01*
X14748000Y-10795000D02*
X14718000Y-10825000D01*
X14741000Y-9584000D02*
X14771000Y-9614000D01*
X14771000Y-9584000D02*
X14741000Y-9614000D01*
X14746000Y-10389000D02*
X14776000Y-10419000D01*
X14776000Y-10389000D02*
@ -395,10 +407,6 @@ X14755100Y-8455900D02*
X14785100Y-8485900D01*
X14785100Y-8455900D02*
X14755100Y-8485900D01*
X14767000Y-9578000D02*
X14797000Y-9608000D01*
X14797000Y-9578000D02*
X14767000Y-9608000D01*
X14767800Y-10932400D02*
X14797800Y-10962400D01*
X14797800Y-10932400D02*
@ -435,6 +443,10 @@ X14793200Y-10157700D02*
X14823200Y-10187700D01*
X14823200Y-10157700D02*
X14793200Y-10187700D01*
X14816000Y-9646000D02*
X14846000Y-9676000D01*
X14846000Y-9646000D02*
X14816000Y-9676000D01*
X14825000Y-10389000D02*
X14855000Y-10419000D01*
X14855000Y-10389000D02*
@ -523,10 +535,6 @@ X15064000Y-8679000D02*
X15094000Y-8709000D01*
X15094000Y-8679000D02*
X15064000Y-8709000D01*
X15072600Y-9357600D02*
X15102600Y-9387600D01*
X15102600Y-9357600D02*
X15072600Y-9387600D01*
X15072600Y-10856200D02*
X15102600Y-10886200D01*
X15102600Y-10856200D02*
@ -559,6 +567,10 @@ X15111000Y-10171000D02*
X15141000Y-10201000D01*
X15141000Y-10171000D02*
X15111000Y-10201000D01*
X15122000Y-9360000D02*
X15152000Y-9390000D01*
X15152000Y-9360000D02*
X15122000Y-9390000D01*
X15143050Y-9052800D02*
X15173050Y-9082800D01*
X15173050Y-9052800D02*
@ -855,6 +867,10 @@ X15733000Y-11465800D02*
X15763000Y-11495800D01*
X15763000Y-11465800D02*
X15733000Y-11495800D01*
X15752000Y-8381000D02*
X15782000Y-8411000D01*
X15782000Y-8381000D02*
X15752000Y-8411000D01*
X15758400Y-9814800D02*
X15788400Y-9844800D01*
X15788400Y-9814800D02*
@ -867,10 +883,6 @@ X15783800Y-9332200D02*
X15813800Y-9362200D01*
X15813800Y-9332200D02*
X15783800Y-9362200D01*
X15800000Y-8383000D02*
X15830000Y-8413000D01*
X15830000Y-8383000D02*
X15800000Y-8413000D01*
X15809200Y-9713200D02*
X15839200Y-9743200D01*
X15839200Y-9713200D02*
@ -1239,6 +1251,10 @@ X16750450Y-9100000D02*
X16780450Y-9130000D01*
X16780450Y-9100000D02*
X16750450Y-9130000D01*
X16755000Y-9981000D02*
X16785000Y-10011000D01*
X16785000Y-9981000D02*
X16755000Y-10011000D01*
X16790150Y-10932400D02*
X16820150Y-10962400D01*
X16820150Y-10932400D02*
@ -1725,27 +1741,11 @@ X17278333Y-12652619D01*
X17268810Y-12681190D01*
X17154524Y-12795476D01*
X17278333Y-12795476D01*
X17402143Y-12595476D02*
X17421190Y-12595476D01*
X17440238Y-12605000D01*
X17449762Y-12614524D01*
X17459286Y-12633571D01*
X17468810Y-12671667D01*
X17468810Y-12719286D01*
X17459286Y-12757381D01*
X17449762Y-12776428D01*
X17440238Y-12785952D01*
X17421190Y-12795476D01*
X17402143Y-12795476D01*
X17383095Y-12785952D01*
X17373571Y-12776428D01*
X17364048Y-12757381D01*
X17354524Y-12719286D01*
X17354524Y-12671667D01*
X17364048Y-12633571D01*
X17373571Y-12614524D01*
X17383095Y-12605000D01*
X17402143Y-12595476D01*
X17449762Y-12662143D02*
X17449762Y-12795476D01*
X17402143Y-12585952D02*
X17354524Y-12728809D01*
X17478333Y-12728809D01*
X17706905Y-12795476D02*
X17706905Y-12595476D01*
X17792619Y-12795476D02*

View File

@ -1,7 +1,7 @@
M48
; DRILL file {KiCad (6.0.10)} date Sun Feb 26 11:53:23 2023
; DRILL file {KiCad (6.0.10)} date Sat Mar 4 08:18:32 2023
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2023-02-26T11:53:23+01:00
; #@! TF.CreationDate,2023-03-04T08:18:32+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10)
; #@! TF.FileFunction,Plated,1,2,PTH
FMAT,2
@ -69,13 +69,14 @@ X144.145Y-98.425
X144.23Y-108.42
X144.272Y-110.896
X144.5Y-101.45
X144.73Y-93.02
X144.78Y-100.33
X144.78Y-104.775
X144.78Y-106.045
X144.84Y-92.69
X144.79Y-91.8
X144.98Y-103.89
X145.034Y-91.948
X145.288Y-109.728
X145.32Y-84.41
X145.415Y-96.52
X145.415Y-97.79
X145.415Y-99.06
@ -83,6 +84,7 @@ X145.415Y-105.41
X145.542Y-101.473
X145.669Y-118.364
X145.7Y-93.88
X145.78Y-92.67
X145.79Y-103.94
X145.879Y-90.192
X146.05Y-100.33
@ -105,9 +107,9 @@ X147.193Y-117.83
X147.32Y-101.67
X147.32Y-106.68
X147.33Y-108.1
X147.56Y-95.99
X147.61Y-104.04
X147.701Y-84.709
X147.82Y-95.93
X147.828Y-109.474
X147.828Y-119.38
X147.955Y-99.695
@ -117,6 +119,7 @@ X148.0Y-118.618
X148.005Y-84.101
X148.082Y-90.932
X148.082Y-101.727
X148.31Y-96.61
X148.4Y-104.04
X148.463Y-89.916
X148.54Y-93.4
@ -139,7 +142,6 @@ X150.368Y-118.11
X150.41Y-101.59
X150.724Y-106.782
X150.79Y-86.94
X150.876Y-93.726
X150.876Y-108.712
X150.876Y-109.474
X150.879Y-110.179
@ -148,6 +150,7 @@ X150.927Y-106.07
X150.99Y-86.03
X151.003Y-113.919
X151.26Y-101.86
X151.37Y-93.75
X151.581Y-90.678
X151.638Y-110.998
X151.76Y-87.729
@ -222,10 +225,10 @@ X157.131Y-109.633
X157.2Y-95.7
X157.275Y-107.687
X157.48Y-114.808
X157.67Y-83.96
X157.734Y-98.298
X157.861Y-112.268
X157.988Y-93.472
X158.15Y-83.98
X158.242Y-97.282
X158.27Y-109.72
X158.339Y-89.505
@ -318,6 +321,7 @@ X167.4Y-103.47
X167.589Y-105.258
X167.589Y-106.883
X167.654Y-91.15
X167.7Y-99.96
X168.052Y-109.474
X168.092Y-94.408
X168.2Y-92.2

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"board": {
"active_layer": 0,
"active_layer": 36,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_nets": [],
@ -62,7 +62,7 @@
35,
36
],
"visible_layers": "000d3fc_ffffffff",
"visible_layers": "000d37c_ffffffff",
"zone_display_mode": 0
},
"meta": {

View File

@ -45,7 +45,7 @@
"silk_text_upright": false,
"zones": {
"45_degree_only": false,
"min_clearance": 0.3
"min_clearance": 0.0
}
},
"diff_pair_dimensions": [

View File

@ -2365,7 +2365,6 @@
)
)
(junction (at 165.1 29.21) (diameter 0) (color 0 0 0 0)
(uuid 0052d37e-e6de-4b27-bd9a-838024e8b8c2)
)
@ -4621,7 +4620,7 @@
(property "Reference" "D1" (id 0) (at 20.32 137.16 90)
(effects (font (size 1.27 1.27)) (justify right))
)
(property "Value" "GBLC05" (id 1) (at 17.78 140.97 90)
(property "Value" "GBLC05" (id 1) (at 16.51 139.7 90)
(effects (font (size 1.27 1.27)) (justify right))
)
(property "Footprint" "ICs:D_SOD-323" (id 2) (at 25.4 138.43 0)

View File

@ -1,6 +0,0 @@
{
"files.associations": {
"wm_include.h": "c",
"freertos.h": "c"
}
}

View File

@ -33,6 +33,8 @@ COMPONENTS_$(TARGET) = \
$(TOP_DIR)/app/libuser$(LIB_EXT) \
$(TOP_DIR)/app/app_drivers/libappdrivers$(LIB_EXT) \
$(TOP_DIR)/app/persistency/libpersistency$(LIB_EXT) \
$(TOP_DIR)/app/translation/libtranslation$(LIB_EXT) \
$(TOP_DIR)/app/translation/libble$(LIB_EXT) \
$(TOP_DIR)/lvgl/liblvgl$(LIB_EXT)
ifeq ($(USE_LIB), 0)

View File

@ -1,5 +1,5 @@
#ifndef APPCONFIG_H
#define APPCONFIG_H
#ifndef APP_CONFIG_H
#define APP_CONFIG_H
#include "wm_gpio.h"
@ -8,6 +8,18 @@
*
*/
/**
* @brief Defines for which platform to compile the firmware for :
*
* SMART_WATCH_BREADBOARD : the smart watch dev hardware which is on a breadboard
* SMART_WATCH_PCB : the smart watch using the PCB
*
*/
#define SMART_WATCH_BREADBOARD (0)
#define SMART_WATCH_PCB (1)
#define HARDWARE_PLATFORM SMART_WATCH_PCB
/**
* @brief Define which kind of logs to display :
*
@ -31,6 +43,7 @@
* @brief i2c
*
*/
#define I2C_CLOCK_SPEED (300000) // 300 kHz seems to be the maximum achievable clock speed before the touch IC behaves funky
#define I2C_SCL WM_IO_PA_01
#define I2C_SDA WM_IO_PB_19
@ -66,6 +79,13 @@
*/
#define BATTERY_VOLTAGE_DIVIDER_ENABLE WM_IO_PB_05
/**
* @brief battery controller IC charged and charging status pins
*
*/
#define BATTERY_CONTROLLER_CHARGING_STATUS WM_IO_PB_03
#define BATTERY_CONTROLLER_CHARGED_STATUS WM_IO_PB_04
/**
* @brief battery voltage adc input pin : WM_IO_PA_04 = channel 1
*
@ -79,4 +99,6 @@
#define VIBRATION_MOTOR_ENABLE WM_IO_PB_00
#define VIBRATION_MOTOR_PWM_CHANNEL (0)
#endif //APPCONFIG_H
#define BLE_DEVICE_NAME "MDBT42Q_W800SW"
#endif //APP_CONFIG_H

View File

@ -78,7 +78,11 @@ const uint8_t gc9a01_init_seq[] = {
0x02, 0, 0x8E, 0xFF,
0x02, 0, 0x8F, 0xFF,
0x03, 0, 0xB6, 0x00, 0x00,
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
0x02, 0, 0x36, 0x88,
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
0x02, 0, 0x36, 0x48,
#endif
0x02, 0, 0x3A, 0x55,
0x05, 0, 0x90, 0x08, 0x08, 0x08, 0x08,
0x02, 0, 0xBD, 0x06,
@ -378,7 +382,6 @@ void lcd_set_backlight(LCDConfig_t * const LCDConfig, uint8_t brightness)
tls_gpio_cfg(LCDConfig->LCDPWMBacklightPin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(LCDConfig->LCDPWMBacklightPin, 0);
}
}
void lcd_hardware_reset(LCDConfig_t * const LCDConfig)
@ -416,7 +419,7 @@ void lcd_sleep(LCDConfig_t *const LCDConfig, bool state)
lcd_set_data_command(LCDConfig, LCD_DATA);
}
void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation)
void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_e orientation)
{
if(!LCDConfig) return;
@ -434,6 +437,7 @@ void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation)
switch(orientation)
{
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
case LCD_ORIENTATION_90:
mmc_sdio_driver_write_one(0xE8);
break;
@ -445,6 +449,19 @@ void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation)
break;
default: //Is default orientation eg : 0
mmc_sdio_driver_write_one(0x88);
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
case LCD_ORIENTATION_90:
mmc_sdio_driver_write_one(0x28);
break;
case LCD_ORIENTATION_180:
mmc_sdio_driver_write_one(0x88);
break;
case LCD_ORIENTATION_270:
mmc_sdio_driver_write_one(0xE8);
break;
default: //Is default orientation eg : 0
mmc_sdio_driver_write_one(0x48);
#endif
}
lcd_set_cs(LCDConfig, LCD_RELEASED);
@ -505,5 +522,8 @@ static void lcd_set_cs(LCDConfig_t * const LCDConfig, LCDSelect_e selected)
static void lcd_set_data_command(LCDConfig_t * const LCDConfig, LCDDataCommand_e dataCommand)
{
// We wait for the mmc sdio driver to be ready before changing the LCD access mode
mmc_sdio_driver_blocking_wait_bus_free();
tls_gpio_write(LCDConfig->LCDDataCommandPin, dataCommand);
}

View File

@ -46,7 +46,7 @@ typedef enum LCDOrientation
LCD_ORIENTATION_90,
LCD_ORIENTATION_180,
LCD_ORIENTATION_270,
} LCDOrientation_t;
} LCDOrientation_e;
/**
* @brief
@ -62,7 +62,7 @@ typedef struct LCDConfig
enum tls_io_name LCDResetPin;
DrawFinishedCb_t drawFinishedCb;
void *cbArg;
LCDOrientation_t LCDOrientation;
LCDOrientation_e LCDOrientation;
} LCDConfig_t;
/**
@ -139,8 +139,12 @@ void lcd_sleep(LCDConfig_t * const LCDConfig, bool state);
* @brief Sets the LCD orientation.
*
* @param LCDConfig a pointer to a user allocated LCDConfig_t structure
* @param orientation the value of the orientation to set
* @param orientation the value of the orientation to set :
* - LCD_ORIENTATION_DEFAULT or LCD_ORIENTATION_0
* - LCD_ORIENTATION_90
* - LCD_ORIENTATION_180
* - LCD_ORIENTATION_270
*/
void lcd_orientation(LCDConfig_t * const LCDConfig, LCDOrientation_t orientation);
void lcd_orientation(LCDConfig_t * const LCDConfig, LCDOrientation_e orientation);
#endif //LCD_H

View File

@ -99,7 +99,7 @@ void mmc_sdio_driver_write_dma_async(uint32_t *data, uint32_t dataLengthInBytes)
void mmc_sdio_driver_write_one(uint8_t data)
{
/* Wait for MMC device to be ready to send the data */
while (SDIO_HOST->MMC_IO & 0x01);
mmc_sdio_driver_blocking_wait_bus_free();
SDIO_HOST->BUF_CTL = 0x4820;
SDIO_HOST->DATA_BUF[0] = (uint32_t)data;
@ -107,19 +107,25 @@ void mmc_sdio_driver_write_one(uint8_t data)
/* Start the transfer */
SDIO_HOST->MMC_IO = 0x01;
/* Wait for MMC device to be done sending the data */
while (SDIO_HOST->MMC_IO & 0x01);
mmc_sdio_driver_blocking_wait_bus_free();
}
void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes)
{
/* Wait for MMC device to be ready to send the data */
while (SDIO_HOST->MMC_IO & 0x01);
mmc_sdio_driver_blocking_wait_bus_free();
SDIO_HOST->BUF_CTL = 0x4820;
memcpy((void *)SDIO_HOST->DATA_BUF, (void *)data, dataLengthInBytes);
SDIO_HOST->MMC_BYTECNTL = dataLengthInBytes;
/* Start the transfer */
SDIO_HOST->MMC_IO = 0x01;
/* Wait for MMC device to be done sending the data */
mmc_sdio_driver_blocking_wait_bus_free();
}
void mmc_sdio_driver_blocking_wait_bus_free(void)
{
while (SDIO_HOST->MMC_IO & 0x01);
}

View File

@ -23,7 +23,7 @@ void mmc_sdio_driver_periph_init(DMATransferDoneCb_t DMATransferDoneCb, void *ar
* @param dataLengthInBytes the size in bytes of the data to transfer.
* Maximum length is 65535 bytes.
*/
void mmc_sdio_driver_write_dma_async(uint32_t *data, u32 dataLengthInBytes);
void mmc_sdio_driver_write_dma_async(uint32_t *data, uint32_t dataLengthInBytes);
/**
* @brief Sends one byte of data to the slave
@ -43,4 +43,10 @@ void mmc_sdio_driver_write_one(uint8_t data);
*/
void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes);
/**
* @brief Performs a busy wait until the data bus is free for us to use.
*
*/
void mmc_sdio_driver_blocking_wait_bus_free(void);
#endif //MMC_SDIO_H

View File

@ -6,19 +6,107 @@
#include "wm_timer.h"
#include "wm_pwm.h"
#define INTERRUPT_POLICY (0)
#define POLL_POLICY (1)
#define BATTERY_CONTROLLER_STATUS_DETECTION_POLICY INTERRUPT_POLICY
/* Battery voltage and ADC */
static int8_t _adc_offset = 0;
/* Vibration motor timer */
static uint8_t _vibration_motor_timer_id = WM_TIMER_ID_INVALID;
/* Battery charge controller status */
static battery_controller_status_e _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
static BatteryControllerStatusChangeCb_t _BatteryControllerStatusChangeCb = NULL;
static void vibration_motor_timer_irq_cb(void *p)
{
(void)p;
tls_pwm_stop(VIBRATION_MOTOR_PWM_CHANNEL);
tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0);
APP_LOG_DEBUG("Vibration stopped");
}
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == POLL_POLICY
static uint8_t _battery_status_timer_id = WM_TIMER_ID_INVALID;
static void battery_status_timer_irq_cb(void *p)
{
bool charging = tls_gpio_read(BATTERY_CONTROLLER_CHARGING_STATUS) == 0;
bool charged = tls_gpio_read(BATTERY_CONTROLLER_CHARGED_STATUS) == 0;
battery_controller_status_e old_battery_status = _battery_fsm;
if(charging && !charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGING;
else if(!charging && charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGED;
else if (!charging && !charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
else
_battery_fsm = BATTERY_CONTROLLER_STATUS_ERROR;
if(old_battery_status != _battery_fsm)
{
// Let's call a user registered callback here
APP_LOG_INFO("Battery status changed from %s to %s",
battery_controller_status_2_str(old_battery_status),
battery_controller_status_2_str(_battery_fsm));
if(_BatteryControllerStatusChangeCb) _BatteryControllerStatusChangeCb(old_battery_status, _battery_fsm);
}
}
#elif BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == INTERRUPT_POLICY
static void battery_controller_irq_cb(void *p)
{
enum tls_io_name gpio_pin = (enum tls_io_name)p;
if(BATTERY_CONTROLLER_CHARGING_STATUS == gpio_pin)
{
tls_clr_gpio_irq_status(BATTERY_CONTROLLER_CHARGING_STATUS);
}
if(BATTERY_CONTROLLER_CHARGED_STATUS == gpio_pin)
{
tls_clr_gpio_irq_status(BATTERY_CONTROLLER_CHARGED_STATUS);
}
bool charging = tls_gpio_read(BATTERY_CONTROLLER_CHARGING_STATUS) == 0;
bool charged = tls_gpio_read(BATTERY_CONTROLLER_CHARGED_STATUS) == 0;
battery_controller_status_e old_battery_status = _battery_fsm;
switch(old_battery_status)
{
case BATTERY_CONTROLLER_STATUS_CHARGING:
if(charged) _battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGED;
else if(!charged && !charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
case BATTERY_CONTROLLER_STATUS_CHARGED:
if(!charged && !charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
case BATTERY_CONTROLLER_STATUS_DISCHARGING:
if(charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGING;
break;
default:
_battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
}
if(old_battery_status != _battery_fsm)
{
// Let's call a user registered callback here
APP_LOG_INFO("Battery status changed from %s to : %s, IRQ : %u",
battery_controller_status_2_str(old_battery_status),
battery_controller_status_2_str(_battery_fsm),
gpio_pin);
if(_BatteryControllerStatusChangeCb) _BatteryControllerStatusChangeCb(old_battery_status, _battery_fsm);
}
}
#endif
static void watch_peripherals_io_init(void)
{
/* We initialize the ADC input as well as the gpio used to enabled the voltage divider bridge */
@ -29,6 +117,36 @@ static void watch_peripherals_io_init(void)
/* We initialize the output pin for the vibration motor enable pin */
tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0);
/* We initialize the pins used to read the battery controller IC charging and charged statuses */
tls_gpio_cfg(BATTERY_CONTROLLER_CHARGED_STATUS, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(BATTERY_CONTROLLER_CHARGING_STATUS, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == INTERRUPT_POLICY
tls_gpio_isr_register(BATTERY_CONTROLLER_CHARGED_STATUS, &(battery_controller_irq_cb), (int*) BATTERY_CONTROLLER_CHARGED_STATUS);
tls_gpio_irq_enable(BATTERY_CONTROLLER_CHARGED_STATUS, WM_GPIO_IRQ_TRIG_DOUBLE_EDGE); // Enabled when level is changing edge
tls_gpio_isr_register(BATTERY_CONTROLLER_CHARGING_STATUS, &(battery_controller_irq_cb), (int*) BATTERY_CONTROLLER_CHARGING_STATUS);
tls_gpio_irq_enable(BATTERY_CONTROLLER_CHARGING_STATUS, WM_GPIO_IRQ_TRIG_DOUBLE_EDGE); // Enabled when level is changing edge
#endif
}
#ifndef CASE_RETURN_STR
#define CASE_RETURN_STR(const) case const: return #const;
#endif
const char *battery_controller_status_2_str(battery_controller_status_e status)
{
switch(status)
{
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_CHARGING)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_DISCHARGING)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_CHARGED)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_ERROR)
default:
return "Unknown Battery Status";
}
}
void watch_peripherals_init(int8_t adcOffset)
@ -39,7 +157,7 @@ void watch_peripherals_init(int8_t adcOffset)
/* Prevent multiple init call !*/
if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id)
{
/* Let's initialize the timer w'll use to stop the vibration motor */
/* Let's initialize the timer we'll use to stop the vibration motor */
struct tls_timer_cfg vibration_motor_timer_cfg =
{
.arg = NULL,
@ -51,11 +169,35 @@ void watch_peripherals_init(int8_t adcOffset)
_vibration_motor_timer_id = tls_timer_create(&vibration_motor_timer_cfg);
if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id)
APP_LOG_ERROR("Failed to create timer");
APP_LOG_ERROR("Failed to create vibration motor timer");
}
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == POLL_POLICY
if(WM_TIMER_ID_INVALID == _battery_status_timer_id)
{
struct tls_timer_cfg battery_status_timer_cfg =
{
.arg = NULL,
.callback = &(battery_status_timer_irq_cb),
.unit = TLS_TIMER_UNIT_MS,
.is_repeat = true,
.timeout = 200
};
_battery_status_timer_id = tls_timer_create(&battery_status_timer_cfg);
if(WM_TIMER_ID_INVALID == _battery_status_timer_id)
APP_LOG_ERROR("Failed to create battery status timer");
else
tls_timer_start(_battery_status_timer_id);
}
#endif
}
uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit)
void watch_peripherals_register_battery_controller_status_change_cb(BatteryControllerStatusChangeCb_t BatteryControllerStatusChangeCb)
{
_BatteryControllerStatusChangeCb = BatteryControllerStatusChangeCb;
}
uint16_t watch_peripherals_get_battery_voltage(battery_unit_e unit)
{
tls_gpio_write(BATTERY_VOLTAGE_DIVIDER_ENABLE, 1);
int batteryVoltage = adc_get_inputVolt(BATTERY_VOLTAGE_ADC_CHANNEL, 1, 1) * 2 + _adc_offset;
@ -63,10 +205,10 @@ uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit)
switch (unit)
{
case Battery_Unit_mV:
case battery_unit_mv:
return batteryVoltage < 0 ? 0 : batteryVoltage;
break;
case Battery_Unit_percent:
case battery_unit_percent:
return battery_voltage_to_percentage(batteryVoltage < 0 ? 0 : batteryVoltage);
break;
default:
@ -94,9 +236,15 @@ uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV)
return (i+1) * 5;
}
battery_controller_status_e watch_peripherals_get_battery_controller_status(void)
{
return _battery_fsm;
}
void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs)
{
APP_LOG_DEBUG("Vibration started");
/* No need to do anything if the duration is 0 or if the strength is 0 */
if(!strength || !durationMs) return;
/* We start the timer which will stop the vibration after durationMs time */
tls_timer_change(_vibration_motor_timer_id, durationMs);
wm_pwm0_config(VIBRATION_MOTOR_ENABLE);
@ -104,3 +252,15 @@ void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs)
tls_pwm_duty_set(VIBRATION_MOTOR_PWM_CHANNEL, strength);
tls_timer_start(_vibration_motor_timer_id);
}
void watch_peripherals_set_brightness(uint8_t brightness)
{
extern LCDConfig_t LCDConfig;
lcd_set_backlight(&LCDConfig, brightness);
}
void watch_peripherals_set_orientation(LCDOrientation_e orientation)
{
extern LCDConfig_t LCDConfig;
lcd_orientation(&LCDConfig, orientation);
}

View File

@ -4,13 +4,32 @@
*/
#ifndef WATCH_PERIPHERALS_H
#define WATCH_PERIPHERALS_H
#include "lcd.h"
#include "wm_type_def.h"
typedef enum Battery_Unit
typedef enum battery_unit
{
Battery_Unit_mV = 0,
Battery_Unit_percent
} Battery_Unit_e;
battery_unit_mv = 0,
battery_unit_percent
} battery_unit_e;
typedef enum battery_controller_status
{
BATTERY_CONTROLLER_STATUS_DISCHARGING = 0,
BATTERY_CONTROLLER_STATUS_CHARGING,
BATTERY_CONTROLLER_STATUS_CHARGED,
BATTERY_CONTROLLER_STATUS_ERROR
} battery_controller_status_e;
typedef void (*BatteryControllerStatusChangeCb_t)(battery_controller_status_e old, battery_controller_status_e new);
/**
* @brief Helper function to easily print the battery status enumeration name
*
* @param status the enumeration value for which to get the name
* @return const char* a string representing the enumeration value
*/
const char *battery_controller_status_2_str(battery_controller_status_e status);
/**
* @brief Inits the watch peripherals driver.
@ -20,6 +39,14 @@ typedef enum Battery_Unit
*/
void watch_peripherals_init(int8_t adcOffset);
/**
* @brief Registers the user provided callback function to notify the battery controller status change event
* @note This function should be as short as possible, do not call LVGL functions in it.
*
* @param BatteryStatusChangeCb a pointer to the function having the right definition.
*/
void watch_peripherals_register_battery_controller_status_change_cb(BatteryControllerStatusChangeCb_t BatteryStatusChangeCb);
/**
* @brief Reads and returns the current battery voltage in mV or it's corresponding capacity in percentage.
* This function takes into account the adcOffset parameter provided in the @ref watch_peripherals_init
@ -29,7 +56,7 @@ void watch_peripherals_init(int8_t adcOffset);
* @param unit the unit of the data to be returned : mV or corresponding capacity in percentage
* @return uint16_t the voltage in mV or the battery left capacity in %
*/
uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit);
uint16_t watch_peripherals_get_battery_voltage(battery_unit_e unit);
/**
* @brief Converts the given battery voltage to the corresponding battery capacity for a single cell LiPo only (4.2V to 3.2V)
@ -39,6 +66,14 @@ uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit);
*/
uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV);
/**
* @brief Returns the current battery controller IC status.
* It can be one of the following :
*
* @return battery_controller_status_e BATTERY_CHARGING, BATTERY_CHARGED, BATTERY_DISCHARGING and BATTERY_ERROR.
*/
battery_controller_status_e watch_peripherals_get_battery_controller_status(void);
/**
* @brief Triggers the vibration motor to vibrate at the provided strength for the set duration in ms.
*
@ -47,4 +82,22 @@ uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV);
*/
void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs);
/**
* @brief Sets the brightness of the LCD display
*
* @param brightness from 0 (backlight off) to 255 backlight fully on
*/
void watch_peripherals_set_brightness(uint8_t brightness);
/**
* @brief Sets the orientation of the LCD display
*
* @param orientation the value of the orientation to set :
* - LCD_ORIENTATION_DEFAULT or LCD_ORIENTATION_0
* - LCD_ORIENTATION_90
* - LCD_ORIENTATION_180
* - LCD_ORIENTATION_270
*/
void watch_peripherals_set_orientation(LCDOrientation_e orientation);
#endif //WATCH_PERIPHERALS_H

View File

@ -1,5 +1,5 @@
#ifndef APPLOG_H
#define APPLOG_G
#ifndef APP_LOG_H
#define APP_LOG_G
#include "app_common.h"
#include "app_config.h"
@ -34,4 +34,4 @@
#define APP_LOG_DEBUG(message, ...) do{}while(0)
#endif
#endif //APPLOG_H
#endif //APP_LOG_H

View File

@ -0,0 +1,15 @@
TOP_DIR = ../..
sinclude $(TOP_DIR)/tools/w800/conf.mk
ifndef PDIR
GEN_LIBS = libble$(LIB_EXT)
endif
#DEFINES +=
sinclude $(TOP_DIR)/tools/w800/rules.mk
INCLUDES := $(INCLUDES) -I $(PDIR)include
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

View File

@ -0,0 +1,91 @@
#include "ble_modem.h"
#include "app_common.h"
#include "host/ble_hs.h"
#include "FreeRTOS.h"
#include "wm_bt_def.h"
#include "wm_bt_app.h"
#include "wm_bt_util.h"
#include "ble_service.h"
//Is needed for the BT off workaround
#include "wm_wifi.h"
bool ble_modem_on(bool startService)
{
int status = BLE_HS_ENOERR;
bool serviceStartSuccess = true;
uint8_t uart_no = 0xFF;
tls_appl_trace_level = TLS_BT_LOG_VERBOSE; //Should be set with a config define
if(bt_adapter_state == WM_BT_STATE_ON) {
TLS_BT_APPL_TRACE_VERBOSE("ble modem already on"NEW_LINE);
return true;
}
TLS_BT_APPL_TRACE_DEBUG("ble modem running, uart_no=%d, log_level=%d"NEW_LINE, uart_no,
tls_appl_trace_level);
status = tls_bt_init(uart_no);
if((status != BLE_HS_ENOERR) && (status != BLE_HS_EALREADY)) {
TLS_BT_APPL_TRACE_ERROR("%s, tls_bt_init ret:%s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// Start the ble service if it was asked and if it is not yet started
if(startService && !ble_service_is_started())
serviceStartSuccess = ble_service_start();
return ((status == BLE_HS_ENOERR || status == BLE_HS_EALREADY) && serviceStartSuccess) ? true : false;
}
bool ble_modem_off(void)
{
int status = BLE_HS_ENOERR;
bool serviceStopSuccess = true;
TLS_BT_APPL_TRACE_DEBUG("ble modem off"NEW_LINE);
if(bt_adapter_state == WM_BT_STATE_OFF)
{
TLS_BT_APPL_TRACE_VERBOSE("ble modem already off"NEW_LINE);
return TLS_BT_STATUS_SUCCESS;
}
if(ble_service_is_started())
{
serviceStopSuccess = ble_service_stop();
}
// Let's make a busy wait on the status of the ble service:
uint8_t timeout = 0;
while(ble_service_is_started())
{
tls_os_time_delay(pdMS_TO_TICKS(5));
// Service is stuck ? waiting up to 300 ms for it to stop
if(++timeout > 60)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_service_stop timeout "NEW_LINE, __FUNCTION__);
return serviceStopSuccess;
}
};
status = tls_bt_deinit();
if((status != BLE_HS_ENOERR) && (status != BLE_HS_EALREADY)) {
TLS_BT_APPL_TRACE_ERROR("%s, tls_bt_deinit ret:%s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
if(status != BLE_HS_EALREADY)
{
//Starting a wifi scan really stops the BT modem ?? Why ? I don't know
tls_wifi_scan();
}
return ((status == BLE_HS_ENOERR || status == BLE_HS_EALREADY) && serviceStopSuccess) ? true : false;
}
bool is_ble_modem_on(void)
{
if(bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE)
return false;
return true;
}

View File

@ -0,0 +1,32 @@
#ifndef BLE_MODEM_H
#define BLE_MODEM_H
#include "wm_type_def.h"
/**
* @brief Turns the BLE modem on
*
* @param startService to start the ble service when turning the modem on
* @return true on success
* @return false on failure
*/
bool ble_modem_on(bool startService);
/**
* @brief Turns the BLE modem off
* @note If the ble service was started, then it will automatically be turned off with the modem
*
* @return true on success
* @return false on failure
*/
bool ble_modem_off(void);
/**
* @brief Find out if the modem is turned on or not
*
* @return true if turned on
* @return false if turned off
*/
bool is_ble_modem_on(void);
#endif //BLE_MODEM_H

View File

@ -0,0 +1,788 @@
#include "ble_service.h"
#include "app_common.h"
#include "ble_modem.h"
#include "host/ble_hs.h"
#include "services/gap/ble_svc_gap.h"
#include "wm_bt_util.h"
#include "bluetooth_sig_values.h"
#define USABLE_DEFAULT_MTU (20) //23 - 3 of header bytes
/* ble service internal workings attributes */
static volatile ble_service_state_e _ble_service_state = BLE_SERVICE_MODE_STOPPED;
static nus_data_rx_fn_t _ble_service_nus_data_rx_cb = NULL;
static ble_service_state_change_fn_t _ble_service_state_change_cb = NULL;
/* Connection handle to the connected device : only one simultaneous connection */
static uint16_t ble_device_conn_handle = BLE_HS_CONN_HANDLE_NONE;
static uint16_t usable_mtu = USABLE_DEFAULT_MTU;
/**
* @brief Structure used to store the various data to carry out a chunked notification or indication data transfer
*
*/
typedef struct
{
uint16_t length; // The length of the data being sent
uint16_t offset; // The offset used to be ableto send the next chunk of data in the array
uint16_t sent_chunk_size; // The size of the chunk sent
const uint8_t *data; // The address of the data to send
bool transfer_in_progress; // Is a transfer already in progress ?
} data_being_sent_t;
// Only one transfer of a type () can occur at any given time
static data_being_sent_t notification_data = {.data = NULL, .length = 0, .offset = 0, .transfer_in_progress = false};
static data_being_sent_t indication_data = {.data = NULL, .length = 0, .offset = 0, .transfer_in_progress = false};
static struct ble_gap_event_listener ble_gap_event_listener;
static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static uint16_t battery_level_char_handle = 0;
static uint8_t battery_level_value = 42;
static int gatt_nus_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static const ble_uuid128_t gatt_nus_service_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E);
static uint16_t gatt_nus_char_rx_handle = 0;
static const ble_uuid128_t gatt_nus_char_rx_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E);
static uint16_t gatt_nus_char_tx_handle = 0;
static const ble_uuid128_t gatt_nus_char_tx_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E);
static struct ble_gatt_svc_def gatt_svc[] =
{
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = BLE_UUID16_DECLARE(BLE_DEVICE_ADV_SERVICE),
.characteristics = (struct ble_gatt_chr_def[])
{
{
.uuid = BLE_UUID16_DECLARE(0x2A19),
.val_handle = &battery_level_char_handle,
.access_cb = &(battery_level_char_access_cb),
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY
},
{
.uuid = NULL
}
}
},
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &gatt_nus_service_uuid.u,
.characteristics = (struct ble_gatt_chr_def[])
{
{
.uuid = &gatt_nus_char_rx_uuid.u,
.val_handle = &gatt_nus_char_rx_handle,
.access_cb = &(gatt_nus_char_access_cb),
.flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_WRITE_NO_RSP
}
,
{
.uuid = &gatt_nus_char_tx_uuid.u,
.val_handle = &gatt_nus_char_tx_handle,
.access_cb = &(gatt_nus_char_access_cb),
.flags = BLE_GATT_CHR_F_NOTIFY
}
,
{
.uuid = NULL
}
}
},
{
.type = BLE_GATT_SVC_TYPE_END
}
};
static bool ble_service_define_gatt(const struct ble_gatt_svc_def *gatt_svc);
static bool ble_service_advertise(bool enable);
static int ble_gap_event_cb(struct ble_gap_event *event, void *arg);
static int ble_advertise_gap_event_cb(struct ble_gap_event *event, void *arg);
static void print_conn_desc(const struct ble_gap_conn_desc *desc);
// Raw because it doesn't handle payload fragmentation if mtu size is smaller than the payload size
static bool ble_service_send_raw_custom_notification(uint16_t characteristic_handle, const uint8_t *data, uint16_t length);
static bool ble_service_send_custom_notification(uint16_t characteristic_handle, data_being_sent_t * const data);
static void reset_data_being_sent(data_being_sent_t * const data);
// Needed to get the reponse after a mtu exchange request
static int ble_gatt_mtu_cb(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t mtu, void *arg);
const char *ble_service_state_2_str(ble_service_state_e state)
{
switch(state) {
CASE_RETURN_STR(BLE_SERVICE_MODE_STOPPED)
CASE_RETURN_STR(BLE_SERVICE_MODE_IDLE)
CASE_RETURN_STR(BLE_SERVICE_MODE_ADVERTISING)
CASE_RETURN_STR(BLE_SERVICE_MODE_CONNECTED)
CASE_RETURN_STR(BLE_SERVICE_MODE_INDICATING)
CASE_RETURN_STR(BLE_SERVICE_MODE_EXITING)
default:
return "unkown ble service state";
}
}
/**
* PUBLIC FUNCTION DEFINITION
*/
bool ble_service_start(void)
{
int status = BLE_HS_ENOERR;
// 1 We first check if the BLE service is stopped
if(_ble_service_state != BLE_SERVICE_MODE_STOPPED)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble service already running (%s)"NEW_LINE, __FUNCTION__, ble_service_state_2_str(_ble_service_state));
return true;
}
// 2 We check if the BLE MODEM is turned on
if(!is_ble_modem_on())
{
TLS_BT_APPL_TRACE_ERROR("%s, ble modem is not turned on"NEW_LINE, __FUNCTION__);
return false;
}
// 3 We set our device name and appearance
if((status = ble_svc_gap_device_name_set(BLE_DEVICE_NAME)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_svc_gap_device_name_set "NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
if((status = ble_svc_gap_device_appearance_set(BLE_DEVICE_APPEARANCE)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_svc_gap_device_appearance_set "NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// 4 We register our gatt (service structure)
if(!ble_service_define_gatt(gatt_svc))
{
TLS_BT_APPL_TRACE_ERROR("%s, failed to define gatt"NEW_LINE, __FUNCTION__);
return false;
}
// 5 We register a gap event handler callback
if((status = ble_gap_event_listener_register(&ble_gap_event_listener, &(ble_gap_event_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_event_listener_register %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// 6 We are now ready to make all registered services available to peers
if((status = ble_gatts_start()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_start failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// 7 Finally we can start advertising
if(!ble_service_advertise(true))
{
return false;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
return true;
}
bool ble_service_stop(void)
{
int status = BLE_HS_ENOERR;
// 1 We first check if the BLE service is not stopped
if(_ble_service_state == BLE_SERVICE_MODE_STOPPED)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble service already stopped"NEW_LINE, __FUNCTION__);
return true;
}
// 2 We check if the BLE MODEM is turned on
if(!is_ble_modem_on())
{
TLS_BT_APPL_TRACE_ERROR("%s, ble modem is not turned on"NEW_LINE, __FUNCTION__);
return false;
}
switch(_ble_service_state)
{
case BLE_SERVICE_MODE_CONNECTED:
case BLE_SERVICE_MODE_INDICATING:
status = ble_gap_terminate(ble_device_conn_handle, BLE_ERR_REM_USER_CONN_TERM);
if(status == BLE_HS_ENOERR)
{
_ble_service_state = BLE_SERVICE_MODE_EXITING;
}
else //BLE_HS_EDISABLED || BLE_HS_ENOTCONN or any other error
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_terminate %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
//Unregister gap event listener
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
case BLE_SERVICE_MODE_ADVERTISING:
if(!ble_service_advertise(false))
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_service_advertise failed to stop"NEW_LINE, __FUNCTION__);
}
else
{
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
//Unregister gap event listener
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
default: //Just to keep compiler happy since BLE_SERVICE_MODE_STOPPED is rulled out earlier
break;
}
if(_ble_service_state == BLE_SERVICE_MODE_STOPPED)
{
// We finally clean the gatt registered services
if((status = ble_gatts_reset()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_reset %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
return true;
}
bool ble_service_is_started(void)
{
return _ble_service_state != BLE_SERVICE_MODE_STOPPED;
}
bool ble_service_is_device_connected(void)
{
return _ble_service_state == BLE_SERVICE_MODE_CONNECTED;
}
void ble_service_register_state_change_cb(ble_service_state_change_fn_t ble_service_state_change_cb)
{
_ble_service_state_change_cb = ble_service_state_change_cb;
}
ble_service_state_e ble_service_get_state(void)
{
return _ble_service_state;
}
bool ble_service_update_connection_parameters(
uint16_t itvl_min,
uint16_t itvl_max,
uint16_t latency,
uint16_t supervision_timeout,
uint16_t min_ce_len,
uint16_t max_ce_len)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
struct ble_gap_upd_params gap_params_to_apply = {0};
gap_params_to_apply.itvl_min = itvl_min;
gap_params_to_apply.itvl_max = itvl_max;
gap_params_to_apply.latency = latency;
gap_params_to_apply.supervision_timeout = supervision_timeout;
gap_params_to_apply.min_ce_len = min_ce_len;
gap_params_to_apply.max_ce_len = max_ce_len;
if ((status = ble_gap_update_params(ble_device_conn_handle, &gap_params_to_apply)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_update_params failed %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
bool ble_service_request_mtu_exchange(void)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
if((status = ble_gattc_exchange_mtu(ble_device_conn_handle, &(ble_gatt_mtu_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gattc_exchange_mtu %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
bool ble_service_send_nus_data(const uint8_t *data, uint16_t length)
{
// The NUS is TX is using notifications
if(notification_data.transfer_in_progress)
{
TLS_BT_APPL_TRACE_WARNING("%s, a transfer is already in progress"NEW_LINE, __FUNCTION__);
return false;
}
notification_data.transfer_in_progress = true;
notification_data.data = data;
notification_data.length = length;
return ble_service_send_custom_notification(gatt_nus_char_tx_handle, &notification_data);
}
void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb)
{
_ble_service_nus_data_rx_cb = nus_data_rx_cb;
}
/**
* PRIVATE FUNCTION DEFINITION
* Used for the internal workings of the service
*/
static bool ble_service_send_raw_custom_notification(uint16_t characteristic_handle, const uint8_t *data, uint16_t length)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
if(!data || !length)
{
TLS_BT_APPL_TRACE_ERROR("%s, no data" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
struct os_mbuf *om_buf = ble_hs_mbuf_from_flat(data, length);
if(!om_buf)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_mbuf_from_flat" NEW_LINE, __FUNCTION__);
return false;
}
if((status = ble_gattc_notify_custom(ble_device_conn_handle, characteristic_handle, om_buf)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_mbuf_from_flat %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
static bool ble_service_send_custom_notification(uint16_t characteristic_handle, data_being_sent_t * const notif_data)
{
if(!notif_data)
{
TLS_BT_APPL_TRACE_WARNING("%s, notif_data is NULL"NEW_LINE, __FUNCTION__);
return false;
}
// We compute the maximum size of the data we can send:
uint16_t remaining_data_to_send = notif_data->length - notif_data->offset;
notif_data->sent_chunk_size = remaining_data_to_send <= usable_mtu ? remaining_data_to_send : usable_mtu;
if(!ble_service_send_raw_custom_notification(characteristic_handle, &notif_data->data[notif_data->offset], notif_data->sent_chunk_size))
{
//Transfer failed :
reset_data_being_sent(notif_data);
return false;
}
return true;
}
int ble_gatt_mtu_cb(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t mtu, void *arg)
{
TLS_BT_APPL_TRACE_DEBUG("ble_gatt_mtu_cb"NEW_LINE);
switch(error->status)
{
case 0:
TLS_BT_APPL_TRACE_DEBUG("mtu exchange complete: conn_handle=%d mtu=%d"NEW_LINE,
conn_handle, mtu);
usable_mtu = mtu - 3;
break;
default:
TLS_BT_APPL_TRACE_ERROR("Update MTU failed...error->status=%d"NEW_LINE, error->status);
break;
}
return BLE_HS_ENOERR;
}
static bool ble_service_define_gatt(const struct ble_gatt_svc_def *gatt_svc)
{
int status = BLE_HS_ENOERR;
if((status = ble_gatts_count_cfg(gatt_svc)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_count_cfg failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
if((status = ble_gatts_add_svcs(gatt_svc)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_add_svcs failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return status == BLE_HS_ENOERR ? true : false;
}
static bool ble_service_advertise(bool enable)
{
int status = BLE_HS_ENOERR;
if(enable)
{
struct ble_hs_adv_fields advertisement_fields = {0};
uint8_t own_addr_type = BLE_OWN_ADDR_RANDOM;
advertisement_fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
advertisement_fields.appearance = ble_svc_gap_device_appearance();
advertisement_fields.appearance_is_present = 1;
// Set the name of a watch supported by GB
#ifdef GADGETBRIDGE_SUPPORT
static const char dev_name[12] = "Bangle.js 2";
advertisement_fields.name = (uint8_t *)dev_name;//ble_svc_gap_device_name();
advertisement_fields.name_len = 11;//strlen(ble_svc_gap_device_name());
#else
advertisement_fields.name = (uint8_t *)ble_svc_gap_device_name();
advertisement_fields.name_len = strlen(ble_svc_gap_device_name());
#endif
advertisement_fields.name_is_complete = 1;
advertisement_fields.uuids16 = (ble_uuid16_t[])
{
BLE_UUID16_INIT(BLE_DEVICE_ADV_SERVICE)
};
advertisement_fields.num_uuids16 = 1;
advertisement_fields.uuids16_is_complete = 1;
// Lets apply the advertisement data
if((status = ble_gap_adv_set_fields(&advertisement_fields)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_set_fields failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// We the device address
uint8_t device_addr[6] = {0};
extern int tls_get_bt_mac_addr(u8 *mac);
tls_get_bt_mac_addr(device_addr);
// Make sure the the device address is compliant with the random address specification :
device_addr[5] |= 0xC0;
if((status = ble_hs_id_set_rnd(device_addr)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_id_set_rnd failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
else
{
TLS_BT_APPL_TRACE_VERBOSE("addr type : %s"NEW_LINE"device addr : %02X:%02X:%02X:%02X:%02X:%02X"NEW_LINE,
tls_bt_addr_type_2_str(own_addr_type),
device_addr[5],
device_addr[4],
device_addr[3],
device_addr[2],
device_addr[1],
device_addr[0]);
}
// We are now ready to configure the advertisement parameters
struct ble_gap_adv_params advertisement_params = {0};
advertisement_params.conn_mode = BLE_GAP_CONN_MODE_UND;
advertisement_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
advertisement_params.itvl_min = 160;
advertisement_params.itvl_max = 160; //160 / 0.625 = 100 ms
advertisement_params.filter_policy = 0;
advertisement_params.channel_map = 0; // Use sane default
advertisement_params.high_duty_cycle = 0;
if((status = ble_gap_adv_start(BLE_OWN_ADDR_RANDOM, NULL, BLE_HS_FOREVER, &advertisement_params, &(ble_advertise_gap_event_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_start failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
else
{
if((status = ble_gap_adv_stop()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_stop failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
return true;
}
// This is the brain of the ble service, here we handle all the possible GAP events
static int ble_gap_event_cb(struct ble_gap_event *event, void *arg)
{
int status = BLE_HS_ENOERR;
struct ble_gap_conn_desc desc;
bool error = false;
TLS_BT_APPL_TRACE_EVENT("ble_gap_event_cb : %s"NEW_LINE, tls_bt_gap_evt_2_str(event->type));
switch(event->type)
{
case BLE_GAP_EVENT_CONNECT:
if(event->connect.status == BLE_HS_ENOERR)
{
if((status = ble_gap_conn_find(event->connect.conn_handle, &desc)) == BLE_HS_ENOERR)
{
print_conn_desc(&desc);
if(desc.role == BLE_GAP_ROLE_SLAVE)
{
_ble_service_state = BLE_SERVICE_MODE_CONNECTED;
usable_mtu = USABLE_DEFAULT_MTU;
ble_device_conn_handle = event->connect.conn_handle;
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(_ble_service_state);
}
else
{
error = true;
if((status = ble_gap_terminate(event->connect.conn_handle, BLE_ERR_REM_USER_CONN_TERM)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_terminate %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
}
}
else
{
error = true;
}
//Resume advertising :
if(error)
{
TLS_BT_APPL_TRACE_VERBOSE("Remote device failed to connect, advertise again"NEW_LINE);
if(!ble_service_advertise(true))
{
_ble_service_state = BLE_SERVICE_MODE_IDLE;
return BLE_HS_EUNKNOWN;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
}
break;
case BLE_GAP_EVENT_DISCONNECT:
if(event->disconnect.conn.role != BLE_GAP_ROLE_SLAVE) return 0;
TLS_BT_APPL_TRACE_DEBUG("Server disconnect reason=%d[0x%02x],state=%s"NEW_LINE, event->disconnect.reason,event->disconnect.reason-0x200,
ble_service_state_2_str(_ble_service_state));
// Don't forget to invalidate the connection handle :
ble_device_conn_handle = BLE_HS_CONN_HANDLE_NONE;
if(_ble_service_state == BLE_SERVICE_MODE_EXITING)
{
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// We finally clean the gatt registered services
if((status = ble_gatts_reset()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_reset %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
else
{
// Let's advertise again
TLS_BT_APPL_TRACE_VERBOSE("Service disconnect event, advertise again"NEW_LINE);
if(!ble_service_advertise(true))
{
_ble_service_state = BLE_SERVICE_MODE_IDLE;
return BLE_HS_EUNKNOWN;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
}
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(_ble_service_state);
break;
case BLE_GAP_EVENT_CONN_UPDATE:
TLS_BT_APPL_TRACE_DEBUG("Conn update status : %d"NEW_LINE, event->conn_update.status);
if((status = ble_gap_conn_find(event->connect.conn_handle, &desc)) == BLE_HS_ENOERR)
{
print_conn_desc(&desc);
}
else
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_conn_find %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
break;
case BLE_GAP_EVENT_SUBSCRIBE:
TLS_BT_APPL_TRACE_VERBOSE("Attr handle : %u"NEW_LINE
"cur_indicate : %u"NEW_LINE
"prev_indicate : %u"NEW_LINE
"cur_notify : %u"NEW_LINE
"prev_notify : %u"NEW_LINE,
event->subscribe.attr_handle,
event->subscribe.cur_indicate,
event->subscribe.prev_indicate,
event->subscribe.cur_notify,
event->subscribe.prev_notify
);
break;
case BLE_GAP_EVENT_MTU:
TLS_BT_APPL_TRACE_VERBOSE("MTU update : %u"NEW_LINE, event->mtu.value);
usable_mtu = event->mtu.value - 3;
break;
case BLE_GAP_EVENT_NOTIFY_TX:
if(event->notify_tx.indication == 0) // Notification
{
TLS_BT_APPL_TRACE_VERBOSE("Type : notification"NEW_LINE);
if(event->notify_tx.status != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, notify_tx notification error %d, transfer in progress : %u"NEW_LINE, __FUNCTION__, event->notify_tx.status, notification_data.transfer_in_progress);
reset_data_being_sent(&notification_data);
return BLE_HS_EUNKNOWN;
}
TLS_BT_APPL_TRACE_DEBUG("transfer : %u"NEW_LINE"length : %u"NEW_LINE"offset : %u"NEW_LINE,
notification_data.transfer_in_progress,
notification_data.length,
notification_data.offset);
// We update the offset :
notification_data.offset += notification_data.sent_chunk_size;
if(notification_data.offset < notification_data.length) // Still data to send ?
{
if(!ble_service_send_custom_notification(event->notify_tx.attr_handle, &notification_data))
{
TLS_BT_APPL_TRACE_ERROR("Failed to send next notification chunk, aborting"NEW_LINE);
reset_data_being_sent(&notification_data);
return BLE_HS_EUNKNOWN;
}
}
else
{
TLS_BT_APPL_TRACE_VERBOSE("last data chunk sent, end of the transfer"NEW_LINE);
// All data have been sent, end of the transfer
reset_data_being_sent(&notification_data);
}
}
else // Indication
{
TLS_BT_APPL_TRACE_WARNING("Indication not yet handled"NEW_LINE);
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled event !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static int ble_advertise_gap_event_cb(struct ble_gap_event *event, void *arg)
{
return BLE_HS_ENOERR;
}
static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg)
{
int status = BLE_HS_ENOERR;
TLS_BT_APPL_TRACE_EVENT("battery_level_char_access_cb op : %s"NEW_LINE, tls_bt_access_opt_2_str(ctxt->op));
switch(ctxt->op)
{
case BLE_GATT_ACCESS_OP_READ_CHR:
if(attr_handle == battery_level_char_handle)
{
TLS_BT_APPL_TRACE_VERBOSE("battery level reading"NEW_LINE);
if((status = os_mbuf_append(ctxt->om, &battery_level_value, sizeof(battery_level_value))) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, battery level os_mbuf : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled operation !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static int gatt_nus_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg)
{
//TLS_BT_APPL_TRACE_EVENT("gatt_nus_char_access_cb op : %s"NEW_LINE, tls_bt_access_opt_2_str(ctxt->op));
switch(ctxt->op)
{
case BLE_GATT_ACCESS_OP_WRITE_CHR:
{
struct os_mbuf *om_buf = ctxt->om;
while(om_buf)
{
// Call the nus rx cb function if one is registered
if(_ble_service_nus_data_rx_cb)
_ble_service_nus_data_rx_cb(om_buf->om_data, om_buf->om_len);
om_buf = SLIST_NEXT(om_buf, om_next);
}
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled operation !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static void print_conn_desc(const struct ble_gap_conn_desc *desc)
{
TLS_BT_APPL_TRACE_VERBOSE("conn_handle : %u"NEW_LINE"conn_itvl : %u"NEW_LINE"conn_latency : %u"NEW_LINE"master_clock_accuracy : %u"NEW_LINE"role : %s"NEW_LINE"supervision_timeout : %u"NEW_LINE
"encrypted : %u"NEW_LINE"authenticated : %u"NEW_LINE"bonded : %u"NEW_LINE,
desc->conn_handle,
desc->conn_itvl,
desc->conn_latency,
desc->master_clock_accuracy,
desc->role == BLE_GAP_ROLE_MASTER ? "MASTER" : "SLAVE",
desc->supervision_timeout,
desc->sec_state.encrypted,
desc->sec_state.authenticated,
desc->sec_state.bonded);
}
static void reset_data_being_sent(data_being_sent_t * const data)
{
if(data)
{
memset(data, 0, sizeof(data_being_sent_t));
}
}

View File

@ -0,0 +1,126 @@
#ifndef BLE_SERVICE_H
#define BLE_SERVICE_H
#include "wm_type_def.h"
#ifndef CASE_RETURN_STR
#define CASE_RETURN_STR(const) case const: return #const;
#endif
typedef void (*nus_data_rx_fn_t)(const uint8_t *data, uint16_t length);
typedef enum
{
BLE_SERVICE_MODE_STOPPED = 0x00,
BLE_SERVICE_MODE_IDLE,
BLE_SERVICE_MODE_ADVERTISING,
BLE_SERVICE_MODE_CONNECTED,
BLE_SERVICE_MODE_INDICATING,
BLE_SERVICE_MODE_EXITING
} ble_service_state_e;
typedef void (*ble_service_state_change_fn_t)(ble_service_state_e service_state);
/**
* @brief Resturns the corresponding enum name as a string
*
* @param state the enum value
* @return const char* the enum name as a string
*/
const char *ble_service_state_2_str(ble_service_state_e state);
/**
* @brief Configures and starts the BLE service
*
* @return true on success
* @return false on failure
*/
bool ble_service_start(void);
/**
* @brief Deinits and stops the BLE service
*
* @return true on success
* @return false on failure
*/
bool ble_service_stop(void);
/**
* @brief Check whether the ble service is running or not
*
* @return true if it is running
* @return false if it is stopped
*/
bool ble_service_is_started(void);
/**
* @brief Check whether a device is connected to the ble service or not
*
* @return true if a device is connected
* @return false if no device is connected
*/
bool ble_service_is_device_connected(void);
/**
* @brief Registers a callback function called every time the state of the BLE service changes.
* For example, you can register a callback to know if a device connected to the service, or disconnected
*
* @param ble_service_state_change_cb the function to register as the callback. The ble_service_state parameter is set to the new state.
*/
void ble_service_register_state_change_cb(ble_service_state_change_fn_t ble_service_state_change_cb);
/**
* @brief Returns the current state of the ble service
*
* @return ble_service_state_e
*/
ble_service_state_e ble_service_get_state(void);
/**
* @brief Asks to update the current connection parameters
* /!\ A connection should be already active before calling this function.
*
* @param itvl_min Minimum value for connection interval in 1.25ms units
* @param itvl_max Maximum value for connection interval in 1.25ms units
* @param latency Connection latency
* @param supervision_timeout Supervision timeout in 10ms units
* @param min_ce_len Minimum length of connection event in 0.625ms units
* @param max_ce_len Maximum length of connection event in 0.625ms units
* @return true
* @return false
*/
bool ble_service_update_connection_parameters(
uint16_t itvl_min,
uint16_t itvl_max,
uint16_t latency,
uint16_t supervision_timeout,
uint16_t min_ce_len,
uint16_t max_ce_len);
/**
* @brief Requests a MTU (Maximum Transmission Unit) update in order to hopefully, get something bigger than 20 bytes ...
*
* @return true on success
* @return false on failure
*/
bool ble_service_request_mtu_exchange(void);
/**
* @brief Sends the provided payload of size length using the NUS (Nordic UART Service) TX characteristic
*
* @param data the data to send through the NUS
* @param length the lenght in byte of the data to send
* @return true on success
* @return false on failure
*/
bool ble_service_send_nus_data(const uint8_t *data, uint16_t length);
/**
* @brief Registers a function which will be called every time data is received by the nus rx
* @note To unregister a callback, simply pass NULL to the function
*
* @param nus_data_rx_cb a pointer to the function to call of type nus_data_rx_fn_t
*/
void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb);
#endif //BLE_APP_H

View File

@ -0,0 +1,8 @@
#ifndef BLUETOOTH_SIG_VALUES_H
#define BLUETOOTH_SIG_VALUES_H
#define BLE_DEVICE_APPEARANCE (0x00C2) //Smart Watch
#define BLE_DEVICE_ADV_SERVICE (0x180F) //Battery Service
#endif //BLUETOOTH_SIG_VALUES_H

View File

@ -0,0 +1,8 @@
#ifndef FIRMWARE_VERSION_H
#define FIRMWARE_VERSION_H
#define FIRMWARE_VERSION "0.0.1" //Firmware creation
#define FIRMWARE_TIME_DATE (__TIME__" "__DATE__)
#endif //FIRMWARE_VERSION_H

File diff suppressed because one or more lines are too long

View File

@ -1,16 +1,58 @@
#include "lvgl.h"
/***
* It is needed to have a reference on two header_titles because when
* switching from one screen using a header to an other screen which is also using one
* the header of the new screen will be created BEFORE the header of the previous screen
* is deleted ...
*/
/* A reference to the current and previous header title */
static lv_obj_t *header_title[2] = {NULL, NULL};
/* Pointer to the header_title to use */
lv_obj_t **header_title_p = &header_title[0];
static void cleanup_event_cb(lv_event_t * e)
{
lv_obj_t **header_title_deleted_p = e->user_data;
*header_title_deleted_p = NULL;
LV_LOG_USER("header_title cleanup");
}
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height)
{
if(header_title[0] == NULL)
header_title_p = &header_title[0];
else if(header_title[1] == NULL)
header_title_p = &header_title[1];
else
{
LV_LOG_ERROR("no free header_title");
return;
}
lv_obj_t *header = lv_obj_create(parent);
lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN);
lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height);
lv_obj_set_style_radius(header, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(header, 0, LV_PART_MAIN);
lv_obj_clear_flag(header, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *header_title = lv_label_create(header);
lv_label_set_text_static(header_title, title);
lv_obj_set_style_text_color(header_title, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(header_title, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_align(header_title, LV_ALIGN_CENTER);
*header_title_p = lv_label_create(header);
lv_label_set_text_static(*header_title_p, title);
lv_obj_set_style_text_align(*header_title_p, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(*header_title_p, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(*header_title_p, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_width(*header_title_p, 150);
lv_obj_set_align(*header_title_p, LV_ALIGN_CENTER);
lv_label_set_long_mode(*header_title_p, LV_LABEL_LONG_SCROLL_CIRCULAR);
/* Once the current header_title is destroyed, mark it as NULL to prevent any crashes when trying to change it's title */
lv_obj_add_event_cb(*header_title_p, &(cleanup_event_cb), LV_EVENT_DELETE, header_title_p);
}
void common_screen_header_update_title(const char * title)
{
if(!*header_title_p)return;
lv_label_set_text_static(*header_title_p, title);
}

View File

@ -3,6 +3,20 @@
#include "lvgl.h"
/**
* @brief Adds a screen header with the defined title to the screen passed as parent with the provided height.
*
* @param parent the screen to which the header will be added
* @param title a string used as the header's title
* @param height the height in pixel of the header
*/
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height);
/**
* @brief Updates the current title of displayed screen header
*
* @param title a string used as the new header's title
*/
void common_screen_header_update_title(const char * title);
#endif //COMMON_SCREEN_COMPONENTS_H

View File

@ -3,6 +3,7 @@
#include "lvgl.h"
#include "compass_screen.h"
#include "menu_screen.h"
#include "app_config.h"
static const char *cardinals[] =
{
@ -71,9 +72,13 @@ static void rotate_cardinal(CompassCardinal_t *cardinal, uint16_t azimuth)
{
lv_coord_t rotated_x, rotated_y;
float azimuth_in_rads = (float)azimuth*M_PI/180.0;
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
rotated_x = (float)(cardinal->position.x-120+cardinal->offset.x)*cos(azimuth_in_rads) - (float)(cardinal->position.y-120+cardinal->offset.y)*sin(azimuth_in_rads) + 120-cardinal->offset.x;
rotated_y = (float)(cardinal->position.y-120+cardinal->offset.y)*cos(azimuth_in_rads) + (float)(cardinal->position.x-120+cardinal->offset.x)*sin(azimuth_in_rads) + 120-cardinal->offset.y;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
rotated_x = (float)(cardinal->position.x-120+cardinal->offset.x)*cos(azimuth_in_rads) + (float)(cardinal->position.y-120+cardinal->offset.y)*sin(azimuth_in_rads) + 120-cardinal->offset.x;
rotated_y = (float)(cardinal->position.y-120+cardinal->offset.y)*cos(azimuth_in_rads) - (float)(cardinal->position.x-120+cardinal->offset.x)*sin(azimuth_in_rads) + 120-cardinal->offset.y;
#endif
lv_obj_set_pos(cardinal->label, rotated_x, rotated_y);
}
@ -102,7 +107,11 @@ void compass_screen_set_azimuth(CompassScreen_t * const compassScreen, uint16_t
//We make sure the azimuth is in the right range ie 0 to 359
azimuth %= 360;
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
uint16_t azimuthAdjusted = 359 - azimuth;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
uint16_t azimuthAdjusted = azimuth;
#endif
uint8_t index;
@ -129,7 +138,11 @@ void compass_screen_set_azimuth(CompassScreen_t * const compassScreen, uint16_t
//Rotate each cardinal with the current azimuth
rotate_cardinal(&compassScreen->northCardinal, azimuth);
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
lv_img_set_angle(compassScreen->northMarker, azimuth*10);
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
lv_img_set_angle(compassScreen->northMarker, -azimuth*10);
#endif
//lv_meter_set_scale_range(compassScreen->compassGraduation.meter, compassScreen->compassGraduation.scale, 0, 330, 330, azimuth-90);
rotate_cardinal(&compassScreen->eastCardinal, azimuth);

View File

@ -17,18 +17,18 @@
#include "watch_peripherals.h"
#include "watch_settings.h"
#include "ble_modem.h"
#include "ble_service.h"
static void date_time_cb(struct tm * const dateTime)
{
if(!dateTime)return;
tls_get_rtc(dateTime);
//APP_LOG_DEBUG("RTC time : %d:%d:%d", dateTime->tm_hour, dateTime->tm_min, dateTime->tm_sec);
}
static uint8_t battery_percentage = 100;
static uint8_t battery_indicator_cb(void)
{
return battery_percentage;
}
static void _perform_deferred_display_wake_up_set_sleeping(void);
static void _perform_deferred_display_wake_up_set_timestamp(void);
static void _perform_deferred_display_wake_up(uint8_t deferred_time_in_ms);
WatchFace_t watchFace;
MenuScreen_t menuScreen;
@ -39,69 +39,238 @@ struct bma4_dev bma;
struct bma4_accel_config accel_conf;
struct bma456w_wrist_wear_wakeup_params setting;
struct bma4_int_pin_config pin_config;
uint16_t int_status;
static void setBrightness(uint8_t brightness)
static struct
{
extern LCDConfig_t LCDConfig;
lcd_set_backlight(&LCDConfig, brightness);
uint16_t int_status;
bool battery_controller_status;
} _interrupts_statuses = {.int_status = 0, .battery_controller_status = false};
static struct
{
uint16_t battery_voltage;
uint8_t battery_percentage;
} _battery_stats = {.battery_voltage = 0, .battery_percentage = 100};
/* This call back is automatically called by the watch face when it wants to refresh the battery */
static void battery_indicator_cb(uint8_t *levelInPercent, BatteryState_e *batteryState)
{
*levelInPercent = _battery_stats.battery_percentage;
*batteryState = watch_peripherals_get_battery_controller_status();
}
static void setBrightnessCb(uint8_t brightness)
static void battery_controller_status_on_change_cb(battery_controller_status_e old, battery_controller_status_e new)
{
persistency_get_settings()->display.brightness = brightness;
setBrightness(brightness);
_interrupts_statuses.battery_controller_status = true;
}
static void setGetBrightnessCb(uint8_t *brightness, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*brightness = persistency_get_settings()->display.display_brightness;
}
else
{
// Updates the settings in the watch settings structure
watch_settings_display_set_brightness(*brightness);
// Physically apply the setting to the hardware
watch_peripherals_set_brightness(*brightness);
}
}
static void setTimeCb(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t month, uint8_t year)
static void setTimeCb(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *day, uint8_t *month, uint8_t *year, SettingMode_e mode)
{
struct tm timeToSet;
//First we get the current time from the RTC
tls_get_rtc(&timeToSet);
if(hour != 0xFF)
timeToSet.tm_hour = hour;
if(SETTING_MODE_GET == mode)
{
*hour = timeToSet.tm_hour;
*minute = timeToSet.tm_min;
*second = timeToSet.tm_sec;
*day = timeToSet.tm_mday;
*month = timeToSet.tm_mon;
*year = timeToSet.tm_year;
}
else
{
if(*hour != 0xFF)
timeToSet.tm_hour = *hour;
if(minute != 0xFF)
timeToSet.tm_min = minute;
if(*minute != 0xFF)
timeToSet.tm_min = *minute;
if(second != 0xFF)
timeToSet.tm_sec = second;
if(*second != 0xFF)
timeToSet.tm_sec = *second;
if(day != 0xFF)
timeToSet.tm_mday = day;
if(*day != 0xFF)
timeToSet.tm_mday = *day;
if(month != 0xFF)
timeToSet.tm_mon = month;
if(*month != 0xFF)
timeToSet.tm_mon = *month;
if(year != 0xFF)
timeToSet.tm_year = year + 100;
if(*year != 0xFF)
timeToSet.tm_year = *year;
tls_set_rtc(&timeToSet);
tls_set_rtc(&timeToSet);
}
}
static void setTimeoutCb(uint8_t timeout)
static void setDisplayVibrationDuration(uint8_t *duration, SettingMode_e mode)
{
persistency_get_settings()->display.sleep_timeout = timeout;
if(SETTING_MODE_GET == mode)
{
*duration = persistency_get_settings()->display.display_vibrate_on_touch_duration;
}
else
{
watch_settings_display_set_vibrate_on_touch_duration(*duration);
}
}
static void setOrientationCb(uint8_t orientation)
static void setDisplayVibrationStrength(uint8_t *strength, SettingMode_e mode)
{
extern LCDConfig_t LCDConfig;
lcd_orientation(&LCDConfig, orientation);
persistency_get_settings()->display.orientation = orientation;
// Forces to redraw the full screen to avoid strange artifact
lv_obj_invalidate(lv_scr_act());
if(SETTING_MODE_GET == mode)
{
*strength = persistency_get_settings()->display.display_vibrate_on_touch_strength;
}
else
{
watch_settings_display_set_vibrate_on_touch_strength(*strength);
}
}
static void setTimeoutCb(uint8_t *timeout, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*timeout = persistency_get_settings()->display.display_delay_before_sleep;
}
else
{
watch_settings_display_set_delay_before_sleep(*timeout);
}
}
static void setOrientationCb(uint8_t *orientation, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*orientation = persistency_get_settings()->display.display_orientation;
}
else
{
watch_settings_display_set_orientation(*orientation);
watch_peripherals_set_orientation(*orientation);
// Forces to redraw the full screen to avoid strange artifacts
lv_obj_invalidate(lv_scr_act());
}
}
static void setBLEEnabledCb(bool *enabled, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*enabled = persistency_get_settings()->connectivity.connectivity_ble_enabled;
}
else
{
watch_settings_connectivity_set_ble_enabled(*enabled);
//Let's turn the BLE on or OFF here
if(*enabled)
{
if(!ble_modem_on(true))
APP_LOG_ERROR("Failed to start BLE modem with service");
else
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
}
else
{
if(!ble_modem_off())
APP_LOG_ERROR("Failed to stop BLE modem with service");
else
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_OFF);
}
}
}
/* This may never get implemented due to power consumption */
static void setWiFiEnabledCb(bool *enabled, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*enabled = persistency_get_settings()->connectivity.connectivity_wifi_enabled;
}
else
{
watch_settings_connectivity_set_wifi_enabled(*enabled);
}
}
static void setLanguageCb(uint8_t *language, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*language = persistency_get_settings()->languageAndUI.language;
}
else
{
watch_settings_language_and_UI_set_language(*language);
}
}
static void getBLEDeviceNameCb(const char **dev_name)
{
*dev_name = BLE_DEVICE_NAME;
}
static void getBatteryVoltageCb(uint16_t *battery_voltage)
{
*battery_voltage = _battery_stats.battery_voltage;
}
static void saveSettingsToFlashCb(void)
{
/*if(!persistency_save_settings_to_flash())
{
APP_LOG_ERROR("Failed to save watch settings to flash");
}*/
}
static void performFactoryResetCb()
{
// Reload factory settings
persistency_factory_reset();
if(!persistency_save_settings_to_flash())
{
APP_LOG_ERROR("Failed to save factory reset settings to flash");
return;
}
// We do a hardware reset of the watch
tls_sys_reset();
}
SettingsScreenAPIInterface_t settingsScreenAPIInterface =
{
.setBrightnessSettingsCb = setBrightnessCb,
.setTimeSettingsCb = setTimeCb,
.setTimeoutSettingsCb = setTimeoutCb,
.setOrientationSettingsCb = setOrientationCb,
.setTimeSettingsCb = &(setTimeCb),
.setBrightnessSettingsCb = &(setGetBrightnessCb),
.setTimeoutSettingsCb = &(setTimeoutCb),
.setDisplayVibrationDurationSettingsCb = &(setDisplayVibrationDuration),
.setDisplayVibrationStrengthSettingsCb = &(setDisplayVibrationStrength),
.setOrientationSettingsCb = &(setOrientationCb),
.setBLEEnabledSettingsCb = &(setBLEEnabledCb),
.setWiFiEnabledSettingsCb = &(setWiFiEnabledCb),
.setLanguageSettingsCb = &(setLanguageCb),
.getBLEDeviceNameCb = &(getBLEDeviceNameCb),
.getBatteryVoltageCb = &(getBatteryVoltageCb),
.saveSettingsCb = &(saveSettingsToFlashCb),
.factoryResetCb = &(performFactoryResetCb),
};
static uint16_t angle_with_offset(uint16_t angle, uint16_t offset)
@ -133,6 +302,32 @@ static void delay_us(uint32_t period, void *intf_ptr)
tls_os_time_delay(pdMS_TO_TICKS(period / 1000));
}
static void ble_service_nus_data_rx_cb(const uint8_t *data, uint16_t length)
{
for (uint16_t i = 0; i < length; i++)
{
if (data[i] < 32)
printf("[%u]", data[i]);
else
printf("%c", data[i]);
}
}
static void ble_service_state_change_cb(ble_service_state_e ble_service_state)
{
switch(ble_service_state)
{
case BLE_SERVICE_MODE_CONNECTED:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_CONNECTED);
break;
case BLE_SERVICE_MODE_ADVERTISING:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
break;
default:
break;
}
}
static void scan_result_cb(void)
{
size_t buffer_size = sizeof(struct tls_scan_bss_format2_t) + sizeof(struct tls_bss_info_format2_t) * 10;
@ -170,9 +365,41 @@ static void scan_result_cb(void)
tls_mem_free(buffer);
}
extern LCDConfig_t LCDConfig;
void gfx_task(void *param)
{
APP_LOG_TRACE("starting");
APP_LOG_TRACE("GFX task starting");
/* Init and load watch settings using the persistency layer */
persistency_init();
if(!persistency_load_settings_from_flash())
{
APP_LOG_ERROR("Failed to retrieve watch settings from flash");
}
//persistency_debug();
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */
watch_peripherals_init(27);
watch_peripherals_register_battery_controller_status_change_cb(&(battery_controller_status_on_change_cb));
/* Make the first battery voltage reading here */
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
/* Check whether the RTC is running or not, if not, then the board was reset
So we start the RTC */
if(!tls_is_rtc_running())
{
struct tm curr_time = {
.tm_mday = 1,
.tm_mon = 1,
.tm_year = 22, // Starting from 2000
};
tls_set_rtc(&curr_time);
}
/* Initialize the lvgl library and peripherals (display and input device)*/
lv_init();
@ -194,9 +421,7 @@ void gfx_task(void *param)
lv_scr_load(watchFace.display);
/* Let's init the I2C interface */
i2c_init(I2C_SDA, I2C_SCL, 100000);
uint8_t aliveCounter = 0;
i2c_init(I2C_SDA, I2C_SCL, I2C_CLOCK_SPEED);
/* Init the magnetometer */
if(!QMC5883L_init())
@ -269,7 +494,7 @@ void gfx_task(void *param)
else
APP_LOG_INFO("BMA456 accel en failed");
bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, 1, &bma);
bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, BMA4_ENABLE, &bma);
bma456w_get_wrist_wear_wakeup_param_config(&setting, &bma);
@ -296,23 +521,26 @@ void gfx_task(void *param)
else
APP_LOG_INFO("BMA456 set pin conf failed");
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */
watch_peripherals_init(27);
/* Make the first battery voltage reading here */
uint16_t battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV);
battery_percentage = battery_voltage_to_percentage(battery_voltage);
watch_face_set_battery_indicator(&watchFace, battery_percentage);
/* Configure BMA's step counter */
if(bma456w_feature_enable(BMA456W_STEP_CNTR, BMA4_ENABLE, &bma) == BMA4_OK)
APP_LOG_INFO("BMA456 step cnter feature enable ok");
else
APP_LOG_INFO("BMA456 step cnter feature enable failed");
/* Configure and register BLE stack and services callbacks */
ble_service_register_nus_data_rx_cb(&(ble_service_nus_data_rx_cb));
ble_service_register_state_change_cb(&(ble_service_state_change_cb));
/* Once we are done with the initializing steps we
don't forget to turn the backlight on ! */
setBrightness(persistency_get_settings()->display.brightness);
watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
/* Enable WiFi hotspot scanning for antenna performance test purposes */
tls_wifi_scan_result_cb_register(&(scan_result_cb));
//tls_wifi_scan_result_cb_register(&(scan_result_cb));
extern LCDConfig_t LCDConfig;
float temperature = 0;
float pressure = 0;
uint32_t update_tick = 0;
for(;;)
{
@ -336,38 +564,44 @@ void gfx_task(void *param)
}
uint8_t rslt = bma456w_read_int_status(&int_status, &bma);
uint8_t rslt = bma456w_read_int_status(&_interrupts_statuses.int_status, &bma);
if(rslt != BMA4_OK)
APP_LOG_DEBUG("Failed to read int status");
APP_LOG_DEBUG("Failed to read int status");
if((BMA4_OK == rslt) && (int_status & BMA456W_WRIST_WEAR_WAKEUP_INT))
if((BMA4_OK == rslt) && (_interrupts_statuses.int_status & BMA456W_WRIST_WEAR_WAKEUP_INT))
{
APP_LOG_DEBUG("Wrist tilt");
}
if(++aliveCounter % 200 == 0)
if(lv_tick_elaps(update_tick) > 5000)
{
uint32_t steps = 0;
if(bma456w_step_counter_output(&steps, &bma) != BMA4_OK)
APP_LOG_DEBUG("Failed to read step counts");
watch_face_set_step_count_indicator(&watchFace, steps);
pressure = BMP280_get_pressure(&temperature);
BMP280_trigger_measurement();
battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV);
battery_percentage = battery_voltage_to_percentage(battery_voltage);
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, bat : %u mV <-> %u %%",
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, battery(%s) : %u mV <-> %u %%",
temperature,
pressure/100,
battery_voltage,
battery_percentage);
battery_controller_status_2_str(watch_peripherals_get_battery_controller_status()),
_battery_stats.battery_voltage,
_battery_stats.battery_percentage);
//APP_LOG_DEBUG("Scanning WiFi : %d", tls_wifi_scan());
aliveCounter = 0;
update_tick = lv_tick_get();
}
/* Handle inactivity periods : */
if( persistency_get_settings()->display.sleep_timeout != 0 &&
lv_disp_get_inactive_time(NULL) > (persistency_get_settings()->display.sleep_timeout * 1000))
if( persistency_get_settings()->display.display_delay_before_sleep != 0 &&
lv_disp_get_inactive_time(NULL) > (persistency_get_settings()->display.display_delay_before_sleep * 5 * 1000))
{
// First, we disable the display backlight and we set all the peripherals in their low power mode
setBrightness(0);
watch_peripherals_set_brightness(0);
//lcd_on(&LCDConfig, false);
lcd_sleep(&LCDConfig, true);
QMC5883L_set_power_mode(Standby);
@ -384,9 +618,14 @@ void gfx_task(void *param)
QMC5883L_set_power_mode(Continuous);
//lcd_on(&LCDConfig, true);
lcd_sleep(&LCDConfig, false);
setBrightness(persistency_get_settings()->display.brightness);
//watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
//lcd_on(&LCDConfig, false);
_perform_deferred_display_wake_up_set_timestamp();
}
/* Will wake the display up after some ms to avoid seeing the second hand jumping */
_perform_deferred_display_wake_up(30);
/* Throttle CPU freq down when inactive to save power or to increase responsiveness */
tls_sys_clk clk;
tls_sys_clk_get(&clk);
@ -406,5 +645,37 @@ void gfx_task(void *param)
APP_LOG_DEBUG("CPU 160Mhz");
}
}
/* Handle any interrupts status */
if(_interrupts_statuses.battery_controller_status)
{
_interrupts_statuses.battery_controller_status = false;
//Let's refresh the battery percentage as well:
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
watch_face_set_battery_indicator(&watchFace, _battery_stats.battery_percentage, watch_peripherals_get_battery_controller_status());
}
}
}
/* This handling logic should be moved somewhere ! I just don't know where yet ... */
static uint32_t _ticks = 0;
static bool _was_sleeping = false;
static void _perform_deferred_display_wake_up_set_timestamp(void)
{
_ticks = lv_tick_get();
_was_sleeping = true;
}
static void _perform_deferred_display_wake_up(uint8_t deferred_time_in_ms)
{
if(_was_sleeping && lv_tick_elaps(_ticks) > deferred_time_in_ms)
{
_was_sleeping = false;
lcd_on(&LCDConfig, true);
watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
}
}

View File

@ -4,6 +4,7 @@
#include "settings_screen.h"
#include "watch_face.h"
#include "compass_screen.h"
#include "translation.h"
#define array_size(array) (sizeof(array)/sizeof(array[0]))
@ -60,10 +61,11 @@ void menu_screen_init(MenuScreen_t * const menuScreen)
static void menu_screen_add_item(lv_obj_t *scroll_item_container, uint8_t position, const lv_img_dsc_t *itemImg,const char *itemTitle, lv_event_cb_t itemClickEventCb)
{
//We add the image button with the icon of the item
lv_obj_t *item_btn = lv_imgbtn_create(scroll_item_container);
lv_obj_t *item_btn = lv_img_create(scroll_item_container);
lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_pos(item_btn, 42, 52 * position);
lv_imgbtn_set_src(item_btn, LV_IMGBTN_STATE_RELEASED, NULL, itemImg, NULL);
lv_img_set_src(item_btn, itemImg);
lv_obj_add_event_cb(item_btn, itemClickEventCb, LV_EVENT_CLICKED, (void *)(uint32_t)position);
//We add the click-able label with the title of the item
@ -105,12 +107,12 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
menuScreen->display = lv_obj_create(NULL);
//We add the screen header
common_screen_header_component(menuScreen->display, "Menu", 65);
common_screen_header_component(menuScreen->display, "Menu", 50);
lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-65);
lv_obj_set_pos(scroll_item_container, 0, 65);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-50);
lv_obj_set_pos(scroll_item_container, 0, 50);
lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(scroll_item_container, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(scroll_item_container, 20, LV_PART_MAIN);
@ -118,14 +120,14 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
lv_obj_set_style_border_width(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(scroll_item_container, 15, LV_PART_SCROLLBAR);
menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, "Watch", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 1, &watch_menu_compass_icon, "Compass", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 2, &watch_menu_alarm_icon, "Alarm", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, translation_get_word(TRANSLATION_WATCH), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 1, &watch_menu_compass_icon, translation_get_word(TRANSLATION_COMPASS), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 2, &watch_menu_alarm_icon, translation_get_word(TRANSLATION_ALARM), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 7, &watch_menu_settings_icon, "Settings", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 7, &watch_menu_settings_icon, translation_get_word(TRANSLATION_SETTINGS), &(menu_item_cb));
//We register the event callback to handle the cleanup
lv_obj_add_event_cb(menuScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, menuScreen);

File diff suppressed because it is too large Load Diff

View File

@ -3,24 +3,73 @@
#include "lvgl.h"
typedef enum SettingMode
{
SETTING_MODE_GET = 0,
SETTING_MODE_SET
} SettingMode_e;
typedef struct SettingsScreenAPIInterface
{
void (*setBrightnessSettingsCb)(uint8_t brightness);
void (*setTimeSettingsCb)(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t month, uint8_t year);
void (*setTimeoutSettingsCb)(uint8_t timeout);
void (*setOrientationSettingsCb)(uint8_t orientation);
void (*setTimeSettingsCb)(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *day, uint8_t *month, uint8_t *year, SettingMode_e mode);
void (*setBrightnessSettingsCb)(uint8_t *brightness, SettingMode_e mode);
void (*setTimeoutSettingsCb)(uint8_t *timeout, SettingMode_e mode);
void (*setOrientationSettingsCb)(uint8_t *orientation, SettingMode_e mode);
void (*setWristTiltSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setDisplayVibrationDurationSettingsCb)(uint8_t *duration, SettingMode_e mode);
void (*setDisplayVibrationStrengthSettingsCb)(uint8_t *strength, SettingMode_e mode);
void (*setBLEEnabledSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setWiFiEnabledSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setLanguageSettingsCb)(uint8_t *language, SettingMode_e mode);
void (*getBLEDeviceNameCb)(const char **dev_name);
void (*getBatteryVoltageCb)(uint16_t *battery_voltage);
void (*saveSettingsCb)(void);
void (*factoryResetCb)(void);
} SettingsScreenAPIInterface_t;
typedef struct SettingsScreen
{
SettingsScreenAPIInterface_t settingsScreenAPIInterface;
/* Menu list items */
lv_obj_t *time_and_date_item;
lv_obj_t *display_item;
lv_obj_t *notifications_item;
lv_obj_t *connectivity_item;
lv_obj_t *language_item;
lv_obj_t *about_item;
lv_obj_t *side_screen;
/* Menu widgets */
lv_obj_t *hour_roller;
lv_obj_t *minute_roller;
lv_obj_t *second_roller;
lv_obj_t *checkbox_time_12H;
lv_obj_t *checkbox_time_24H;
lv_obj_t *day_roller;
lv_obj_t *month_roller;
lv_obj_t *year_roller;
lv_obj_t *wrist_tilt_switch;
lv_obj_t *ble_switch;
lv_obj_t *wifi_switch;
struct
{
lv_obj_t *current_time_label;
char current_time_text[20];
} currentTime;
struct
{
lv_obj_t *batteryVoltageLabel;
char batteryVoltageText[8];
} batteryVoltage;
/* Main screen */
lv_obj_t *display;
/* Other */
lv_timer_t *about_refresh_timer;
} SettingsScreen_t;
void settings_screen_init(SettingsScreen_t * const settingsScreen);
@ -31,6 +80,4 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen);
void settings_screen_destroy(SettingsScreen_t * const settingsScreen);
void settings_screen(void);
#endif //SETTINGS_SCREEN_H

View File

@ -4,6 +4,27 @@
#include <stdio.h>
#include "app_log.h"
LV_IMG_DECLARE(battery_low_icon)
LV_IMG_DECLARE(battery_charging_icon)
LV_IMG_DECLARE(battery_charged_icon)
static void _set_bluetooth_indicator(WatchFace_t * const watchFace)
{
switch(watchFace->bluetoothIndicator.bluetoothState)
{
case BLUETOOTH_STATE_ON:
lv_obj_set_style_img_recolor_opa(watchFace->bluetoothIndicator.bluetoothIcon, 185, LV_PART_MAIN);
lv_obj_clear_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
break;
case BLUETOOTH_STATE_CONNECTED:
lv_obj_set_style_img_recolor_opa(watchFace->bluetoothIndicator.bluetoothIcon, 0, LV_PART_MAIN);
lv_obj_clear_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
break;
default:
lv_obj_add_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
}
}
static void gesture_event_cb(lv_event_t * e)
{
WatchFace_t *watchFace = e->user_data;
@ -17,6 +38,7 @@ static void gesture_event_cb(lv_event_t * e)
case LV_DIR_RIGHT:
LV_LOG_USER("GESTURE : RIGHT");
// We delete the timer
lv_timer_del(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_timer_del(watchFace->handAnimationTimer);
// We create the menu screen and switch to it
extern MenuScreen_t menuScreen;
@ -60,11 +82,17 @@ static void update_watch_hands_angles(WatchFace_t * const watchFace, uint8_t inc
//Don't forget to update the day date window
sprintf(watchFace->dateWindow.dateWindowText, "%s%d", watchFace->dateTime.tm_mday < 10 ? " " : "", watchFace->dateTime.tm_mday);
lv_obj_invalidate(watchFace->dateWindow.dateWindowWidget);
lv_label_set_text_static(watchFace->dateWindow.dateWindowWidget, watchFace->dateWindow.dateWindowText);
APP_LOG_DEBUG("Syncing time");
if(watchFace->batteryIndicatorCb)
watch_face_set_battery_indicator(watchFace, watchFace->batteryIndicatorCb());
{
uint8_t levelInPercent = 0;
BatteryState_e batteryState = BATTERY_STATE_DISCHARGING;
watchFace->batteryIndicatorCb(&levelInPercent, &batteryState);
watch_face_set_battery_indicator(watchFace, levelInPercent, batteryState);
}
}
else
{
@ -93,6 +121,57 @@ static void hand_timer_anim_cb(lv_timer_t *timer)
update_watch_hands_angles(watchFace, 12);
}
static void battery_timer_anim_cb(lv_timer_t *timer)
{
WatchFace_t *watchFace = timer->user_data;
if(lv_obj_has_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
}
static void set_battery_state_icon(WatchFace_t * const watchFace)
{
switch(watchFace->batteryIndicator.batteryState)
{
case BATTERY_STATE_CHARGING:
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_charging_icon);
break;
case BATTERY_STATE_CHARGED:
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_charged_icon);
break;
default:
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_low_icon);
break;
}
}
static void hide_hour_and_minutes_hand_cb(lv_event_t *e)
{
WatchFace_t *watchFace = e->user_data;
if(lv_obj_has_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN);
}
}
void watch_face_init(WatchFace_t * const watchFace)
{
if(!watchFace)
@ -101,6 +180,7 @@ void watch_face_init(WatchFace_t * const watchFace)
return;
}
memset(watchFace, 0, sizeof(WatchFace_t));
strcpy(watchFace->stepCounter.text, "0");
}
void watch_face_register_date_time_cb(WatchFace_t * const watchFace, DateTimeCb_t dateTimeCb)
@ -139,7 +219,8 @@ void watch_face_create(WatchFace_t * const watchFace)
LV_IMG_DECLARE(watch_casio_minute_hand_asset)
LV_IMG_DECLARE(watch_casio_second_hand_asset)
LV_IMG_DECLARE(watch_casio_medium_hand_asset)
LV_IMG_DECLARE(watch_casio_small_hand_asset)
//LV_IMG_DECLARE(watch_casio_small_hand_asset)
LV_IMG_DECLARE(bluetooth_icon)
//We create our parent screen :
if(watchFace->display)
@ -148,34 +229,35 @@ void watch_face_create(WatchFace_t * const watchFace)
lv_obj_del(watchFace->display);
watchFace->display = NULL;
}
watchFace->display = lv_obj_create(NULL);
//Our display is the watch face image :
watchFace->display = lv_img_create(NULL);
lv_img_set_src(watchFace->display, &watch_casio_face_asset);
lv_obj_set_style_bg_color(watchFace->display, lv_color_black(), LV_PART_MAIN);
//We load our assets :
lv_obj_t *watchFaceImg = lv_img_create(watchFace->display);
lv_img_set_src(watchFaceImg, &watch_casio_face_asset);
lv_obj_add_event_cb(watchFace->display, &(hide_hour_and_minutes_hand_cb), LV_EVENT_LONG_PRESSED, watchFace);
lv_obj_t *smallHandImg = lv_img_create(watchFace->display);
//We load our other assets :
/*lv_obj_t *smallHandImg = lv_img_create(watchFace->display);
lv_img_set_src(smallHandImg, &watch_casio_small_hand_asset);
lv_obj_set_pos(smallHandImg, 69, 98);
lv_img_set_pivot(smallHandImg, 4, 20);
lv_img_set_pivot(smallHandImg, 4, 20);*/
//Battery arc is created here
if(watchFace->batteryIndicator.battery_arc)
if(watchFace->batteryIndicator.batteryArc)
{
LV_LOG_ERROR("battery_arc should be NULL here !");
lv_obj_del(watchFace->batteryIndicator.battery_arc);
watchFace->batteryIndicator.battery_arc = NULL;
LV_LOG_ERROR("batteryArc should be NULL here !");
lv_obj_del(watchFace->batteryIndicator.batteryArc);
watchFace->batteryIndicator.batteryArc = NULL;
}
watchFace->batteryIndicator.battery_arc = lv_arc_create(watchFace->display);
lv_obj_remove_style(watchFace->batteryIndicator.battery_arc, NULL, LV_PART_KNOB);
lv_obj_clear_flag(watchFace->batteryIndicator.battery_arc, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(watchFace->batteryIndicator.battery_arc, 60, 60);
lv_obj_align(watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, -1, 45);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.battery_arc, 5, LV_PART_INDICATOR);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.battery_arc, 0, LV_PART_MAIN);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.battery_arc, lv_color_make(228, 233, 236), LV_PART_INDICATOR);
lv_arc_set_value(watchFace->batteryIndicator.battery_arc, 100);
watchFace->batteryIndicator.batteryArc = lv_arc_create(watchFace->display);
lv_obj_remove_style(watchFace->batteryIndicator.batteryArc, NULL, LV_PART_KNOB);
lv_obj_clear_flag(watchFace->batteryIndicator.batteryArc, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(watchFace->batteryIndicator.batteryArc, 60, 60);
lv_obj_align(watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, -1, 45);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.batteryArc, 5, LV_PART_INDICATOR);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.batteryArc, 0, LV_PART_MAIN);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.batteryArc, lv_color_make(228, 233, 236), LV_PART_INDICATOR);
lv_arc_set_value(watchFace->batteryIndicator.batteryArc, 100);
if(watchFace->batteryIndicator.label)
{
@ -188,9 +270,57 @@ void watch_face_create(WatchFace_t * const watchFace)
strcpy(watchFace->batteryIndicator.text, "100 %");
lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text);
lv_obj_set_style_text_color(watchFace->batteryIndicator.label, lv_color_white(), LV_PART_MAIN);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, 0, 0);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, 0, -5);
// Battery icon is created here
if(watchFace->batteryIndicator.batteryIcon)
{
LV_LOG_ERROR("batteryIcon should be NULL here !");
lv_obj_del(watchFace->batteryIndicator.batteryIcon);
watchFace->batteryIndicator.batteryIcon = NULL;
}
watchFace->batteryIndicator.batteryIcon = lv_img_create(watchFace->display);
set_battery_state_icon(watchFace);
lv_img_set_zoom(watchFace->batteryIndicator.batteryIcon, 141);
lv_obj_align_to(watchFace->batteryIndicator.batteryIcon, watchFace->batteryIndicator.label, LV_ALIGN_OUT_BOTTOM_MID, 0, -9);
if(watchFace->batteryIndicator.lowBatteryAnimationTimer)
{
LV_LOG_ERROR("battery animation timer should be NULL here !");
lv_timer_del(watchFace->batteryIndicator.lowBatteryAnimationTimer);
watchFace->batteryIndicator.lowBatteryAnimationTimer = NULL;
}
watchFace->batteryIndicator.lowBatteryAnimationTimer = lv_timer_create(&(battery_timer_anim_cb), 500, watchFace);
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
// Bluetooth status icon is created here
if(watchFace->bluetoothIndicator.bluetoothIcon)
{
LV_LOG_ERROR("bluetoothIcon be NULL here !");
lv_obj_del(watchFace->bluetoothIndicator.bluetoothIcon);
watchFace->bluetoothIndicator.bluetoothIcon = NULL;
}
watchFace->bluetoothIndicator.bluetoothIcon = lv_img_create(watchFace->display);
lv_img_set_src(watchFace->bluetoothIndicator.bluetoothIcon, &bluetooth_icon);
lv_img_set_zoom(watchFace->bluetoothIndicator.bluetoothIcon, 128);
lv_obj_add_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
lv_obj_set_style_img_recolor(watchFace->bluetoothIndicator.bluetoothIcon, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN);
lv_obj_align_to(watchFace->bluetoothIndicator.bluetoothIcon, watchFace->batteryIndicator.batteryArc, LV_ALIGN_OUT_LEFT_BOTTOM, -9, 0);
_set_bluetooth_indicator(watchFace);
// StepCounter label is created here
if(watchFace->stepCounter.label)
{
LV_LOG_ERROR("stepCounter should be NULL here !");
lv_obj_del(watchFace->stepCounter.label);
watchFace->stepCounter.label = NULL;
}
watchFace->stepCounter.label = lv_label_create(watchFace->display);
lv_label_set_text_static(watchFace->stepCounter.label, watchFace->stepCounter.text);
lv_obj_set_style_text_color(watchFace->stepCounter.label, lv_color_white(), LV_PART_MAIN);
lv_obj_set_pos(watchFace->stepCounter.label, 63, 111);
if(watchFace->mediumHand24h.handImg)
{
@ -259,6 +389,9 @@ void watch_face_create(WatchFace_t * const watchFace)
//We set the appropriate angles to each of the hands
update_watch_hands_angles(watchFace, 0);
//Don't forget to make the background image clickable to be able to use gestures on it.
lv_obj_add_flag(watchFace->display, LV_OBJ_FLAG_CLICKABLE);
//We register the event callback to handle gestures
lv_obj_add_event_cb(watchFace->display, &(gesture_event_cb), LV_EVENT_GESTURE, watchFace);
//We register the event callback to handle the cleanup
@ -275,20 +408,7 @@ void watch_face_create(WatchFace_t * const watchFace)
watchFace->handAnimationTimer = lv_timer_create(&(hand_timer_anim_cb), 199, watchFace);
}
void watch_face_force_sync(WatchFace_t *const watchFace)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(!watchFace->display) return;
update_watch_hands_angles(watchFace, 0);
}
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t percentage)
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t levelInPercent, BatteryState_e batteryState)
{
if(!watchFace)
{
@ -300,18 +420,73 @@ void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t per
lv_color_t arc_color = lv_color_make(228, 233, 236);
if(percentage <= 10)
if(levelInPercent <= 10)
arc_color = lv_color_make(228, 33, 81);
else if(percentage <= 30)
else if(levelInPercent <= 30)
arc_color = lv_color_make(247, 148, 29);
else if(percentage <= 50)
else if(levelInPercent <= 50)
arc_color = lv_color_make(226, 175, 58);
lv_arc_set_value(watchFace->batteryIndicator.battery_arc, percentage);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.battery_arc, arc_color, LV_PART_INDICATOR);
sprintf(watchFace->batteryIndicator.text, "%u %%", percentage);
lv_arc_set_value(watchFace->batteryIndicator.batteryArc, levelInPercent);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.batteryArc, arc_color, LV_PART_INDICATOR);
sprintf(watchFace->batteryIndicator.text, "%u %%", levelInPercent);
lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, 0, 0);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, 0, -5);
//We save the new battery state only if it's different, this allows to have a trigger when it changes :
if(watchFace->batteryIndicator.batteryState != batteryState)
{
watchFace->batteryIndicator.batteryState = batteryState;
set_battery_state_icon(watchFace);
}
//Finally we check if it's time to show the battery low indicator by enabling it's timer
if(levelInPercent <= 10 && watchFace->batteryIndicator.batteryState == BATTERY_STATE_DISCHARGING)
{
lv_timer_resume(watchFace->batteryIndicator.lowBatteryAnimationTimer);
}
else if(watchFace->batteryIndicator.batteryState == BATTERY_STATE_DISCHARGING)
{
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
}
void watch_face_set_bluetooth_indicator(WatchFace_t * const watchFace, BluetoothState_e bluetoothState)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(watchFace->bluetoothIndicator.bluetoothState == bluetoothState) return;
watchFace->bluetoothIndicator.bluetoothState = bluetoothState;
if(!watchFace->display) return;
_set_bluetooth_indicator(watchFace);
}
void watch_face_set_step_count_indicator(WatchFace_t * const watchFace, uint32_t step_count)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(step_count < 1000)
sprintf(watchFace->stepCounter.text, "%u", step_count);
else if(step_count < 9996)
sprintf(watchFace->stepCounter.text, "%.2fk", step_count/1000.0);
else
sprintf(watchFace->stepCounter.text, "%.1fk", step_count/1000.0);
if(!watchFace->display) return;
lv_label_set_text_static(watchFace->stepCounter.label, watchFace->stepCounter.text);
}
void watch_face_destroy(WatchFace_t * const watchFace)
@ -329,7 +504,34 @@ void watch_face_destroy(WatchFace_t * const watchFace)
watchFace->minuteHand.handImg = NULL;
watchFace->secondHand.handImg = NULL;
watchFace->mediumHand24h.handImg = NULL;
watchFace->batteryIndicator.battery_arc = NULL;
watchFace->batteryIndicator.batteryArc = NULL;
watchFace->batteryIndicator.label = NULL;
watchFace->batteryIndicator.batteryIcon = NULL;
watchFace->batteryIndicator.lowBatteryAnimationTimer = NULL;
watchFace->stepCounter.label = NULL;
watchFace->bluetoothIndicator.bluetoothIcon = NULL;
}
void watch_face_force_sync(WatchFace_t *const watchFace)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(!watchFace->display) return;
update_watch_hands_angles(watchFace, 0);
}
bool watch_face_is_in_use(WatchFace_t * const watchFace)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return false;
}
return watchFace->display != NULL;
}

View File

@ -4,8 +4,23 @@
#include "lvgl.h"
#include <time.h>
typedef enum BatteryState
{
BATTERY_STATE_DISCHARGING = 0,
BATTERY_STATE_CHARGING,
BATTERY_STATE_CHARGED,
} BatteryState_e;
typedef enum BluetoothState
{
BLUETOOTH_STATE_OFF = 0,
BLUETOOTH_STATE_ON,
BLUETOOTH_STATE_CONNECTED
} BluetoothState_e;
typedef void (*DateTimeCb_t)(struct tm * const dateTime);
typedef uint8_t (*BatteryIndicatorCb_t)(void);
typedef void (*BatteryIndicatorCb_t)(uint8_t *levelInPercent, BatteryState_e *batteryState);
typedef struct DateWindow
{
@ -22,10 +37,25 @@ typedef struct WatchHand
typedef struct BatteryIndicator
{
lv_obj_t *label;
lv_obj_t *battery_arc;
lv_obj_t *batteryArc;
lv_obj_t *batteryIcon;
lv_timer_t *lowBatteryAnimationTimer;
char text[7];
BatteryState_e batteryState:2;
} BatteryIndicator_t;
typedef struct BluetoothIndicator
{
lv_obj_t *bluetoothIcon;
BluetoothState_e bluetoothState;
} BluetoothIndicator_t;
typedef struct StepCounter
{
lv_obj_t *label;
char text[7];
} StepCounter_t;
/* Watch face context object */
typedef struct WatchFace
{
@ -39,7 +69,8 @@ typedef struct WatchFace
lv_obj_t *display;
DateWindow_t dateWindow;
BatteryIndicator_t batteryIndicator;
StepCounter_t stepCounter;
BluetoothIndicator_t bluetoothIndicator;
struct tm dateTime;
} WatchFace_t;
@ -76,7 +107,31 @@ void watch_face_create(WatchFace_t * const watchFace);
* @param watchFace a pointer to the watch face context structure.
* @param percentage the value to set the indicator to in percent.
*/
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t percentage);
/**
* @brief Sets the battery level in percent as well as it's current state to draw on the watch face.
*
* @param watchFace a pointer to the watch face context structure.
* @param levelInPercent the level to set the indicator to in percent.
* @param batteryState the current state of the battery : BATTERY_STATE_DISCHARGING, BATTERY_STATE_CHARGING or BATTERY_STATE_CHARGED
*/
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t levelInPercent, BatteryState_e batteryState);
/**
* @brief Sets the current bluetooth state to display on the watch face
*
* @param watchFace a pointer to the watch face context structure.
* @param bluetoothState the state of the bluetooth modem to show, can be : BLUETOOTH_STATE_OFF, BLUETOOTH_STATE_ON or BLUETOOTH_STATE_CONNECTED
*/
void watch_face_set_bluetooth_indicator(WatchFace_t * const watchFace, BluetoothState_e bluetoothState);
/**
* @brief Shows the current step count passed as parameter on the watch face.
*
* @param watchFace a pointer to the watch face context structure.
* @param step_count the step count to show on the watch face.
*/
void watch_face_set_step_count_indicator(WatchFace_t * const watchFace, uint32_t step_count);
/**
* @brief Forces the watch face to sync up with the RTC by calling the provided date_time_cb
@ -85,6 +140,15 @@ void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t per
*/
void watch_face_force_sync(WatchFace_t * const watchFace);
/**
* @brief Returns true if the watch face screen is currently being used and displayed.
*
* @param watchFace a pointer to the watch face context structure.
* @return true if the watch face screen is being used
* @return false if the watch face screen is not being used/displayed currently
*/
bool watch_face_is_in_use(WatchFace_t * const watchFace);
/**
* @brief Frees all resources used by the WatchFace object
*

View File

@ -38,9 +38,13 @@ void user_task_main(void *param)
if(buf)
{
UBaseType_t writtenSize = vTaskList((char *)buf, 800);
APP_LOG_INFO("Available RAM (bytes)/Total RAM (bytes) : %u/%u"NEW_LINE"Reset reason : %d"NEW_LINE"Clk : apb(%u), cpu(%u), wlan(%u)"NEW_LINE"Tasks (%lu) :"NEW_LINE,
tls_mem_get_avail_heapsize(),
total_mem_size,
APP_LOG_INFO("Available RAM (bytes)/Total RAM (bytes) : %u/%u"NEW_LINE
"FreeRTOS free heap/total heap : %u/%u byte(s)"NEW_LINE
"Reset reason : %d"NEW_LINE
"Clk : apb(%u), cpu(%u), wlan(%u)"NEW_LINE
"Tasks (%lu) :"NEW_LINE,
tls_mem_get_avail_heapsize(), total_mem_size,
xPortGetFreeHeapSize(), configTOTAL_HEAP_SIZE,
tls_sys_get_reboot_reason(),
clk.apbclk, clk.cpuclk, clk.wlanclk,
writtenSize);

View File

@ -1,13 +1,210 @@
#include "watch_settings.h"
#include "wm_internal_flash.h"
#include "app_log.h"
#include "translation.h"
/* WatchSetting object with default values */
static WatchSettings_t watchSettings =
/**
* @brief WatchSetting object with default values.
*
* @note Used to restore factory settings for example or as default values when first start.
*/
static const WatchSettings_t defaultWatchSettings =
{
.timeAndDate = {.hour_format = 0, .date_format = 0, .automatic_time_and_date = 0},
.display = {.brightness = 255, .sleep_timeout = 0,},
.first_time_init = false,
.timeAndDate = {
.time_and_date_hour_format = 0,
.time_and_date_date_format = 0,
.time_and_date_automatic = 0,
},
.display = {
.display_brightness = 200,
.display_delay_before_sleep = 0,
.display_orientation = LCD_ORIENTATION_DEFAULT,
.display_vibrate_on_touch_duration = 0,
.display_vibrate_on_touch_strength = 6,
.display_wrist_wakeup = true,
},
.notification = {
.notification_vibration_duration = 3,
.notification_vibration_strength = 6,
.vibrate_on_email = true,
.vibrate_on_sms = true,
},
.connectivity = {
.connectivity_ble_enabled = false,
.connectivity_wifi_enabled = false,
},
.languageAndUI = {
.language = TRANSLATION_ENGLISH,
},
};
/**
* @brief Actual watchSettings object which can change and lives in RAM memory.
*
*/
static WatchSettings_t watchSettings;
/**
* @brief Internal variable used to know if something has to be saved or not because some settings changed.
*
* @note This is designed to prevent excessive wear and tear on the flash.
*
*/
static bool _params_changed = false;
void watch_settings_time_and_date_set_hour_format(bool hour_24H_format)
{
watchSettings.timeAndDate.time_and_date_hour_format = hour_24H_format;
_params_changed = true;
}
void watch_settings_time_and_date_set_date_format(uint8_t date_format)
{
watchSettings.timeAndDate.time_and_date_date_format = date_format;
_params_changed = true;
}
void watch_settings_time_and_date_set_automatic(bool automatic)
{
watchSettings.timeAndDate.time_and_date_automatic = automatic;
_params_changed = true;
}
void watch_settings_display_set_brightness(uint8_t brightness)
{
watchSettings.display.display_brightness = brightness;
_params_changed = true;
}
void watch_settings_display_set_delay_before_sleep(uint8_t delay)
{
watchSettings.display.display_delay_before_sleep = delay;
_params_changed = true;
}
void watch_settings_display_set_orientation(LCDOrientation_e orientation)
{
watchSettings.display.display_orientation = orientation;
_params_changed = true;
}
void watch_settings_display_set_wrist_wakeup(bool wakeup)
{
watchSettings.display.display_wrist_wakeup = wakeup;
_params_changed = true;
}
void watch_settings_display_set_vibrate_on_touch_strength(uint8_t level)
{
watchSettings.display.display_vibrate_on_touch_strength = level;
_params_changed = true;
}
void watch_settings_display_set_vibrate_on_touch_duration(uint8_t duration)
{
watchSettings.display.display_vibrate_on_touch_duration = duration;
_params_changed = true;
}
void watch_settings_notification_set_vibration_strength(uint8_t level)
{
watchSettings.notification.notification_vibration_strength = level;
_params_changed = true;
}
void watch_settings_notification_set_vibration_duration(uint8_t duration)
{
watchSettings.notification.notification_vibration_duration = duration;
_params_changed = true;
}
void watch_settings_connectivity_set_ble_enabled(bool enabled)
{
watchSettings.connectivity.connectivity_ble_enabled = enabled;
_params_changed = true;
}
void watch_settings_connectivity_set_wifi_enabled(bool enabled)
{
watchSettings.connectivity.connectivity_wifi_enabled = enabled;
_params_changed = true;
}
void watch_settings_language_and_UI_set_language(TranslationLanguage_e language)
{
watchSettings.languageAndUI.language = language;
_params_changed = true;
}
void persistency_init(void)
{
memcpy(&watchSettings, &defaultWatchSettings, sizeof(WatchSettings_t));
}
WatchSettings_t *persistency_get_settings(void)
{
return &watchSettings;
}
bool persistency_save_settings_to_flash(void)
{
if(!_params_changed)
{
APP_LOG_INFO("Nothing to save, no params changed");
return true;
}
uint8_t status = TLS_FLS_STATUS_OK;
if(TLS_FLS_STATUS_OK != (status = tls_fls_write(WATCH_SETTINGS_FLASH_STORAGE_ADDRESS, (uint8_t *) &watchSettings, sizeof watchSettings)))
{
APP_LOG_ERROR("Failed to write settings to flash : %u", status);
return false;
}
// Don't forget to reset the state variable here
_params_changed = false;
return true;
}
bool persistency_load_settings_from_flash(void)
{
uint8_t status = TLS_FLS_STATUS_OK;
if(TLS_FLS_STATUS_OK != (status = tls_fls_read(WATCH_SETTINGS_FLASH_STORAGE_ADDRESS, (uint8_t *) &watchSettings, sizeof watchSettings)))
{
APP_LOG_ERROR("Failed to read settings to flash : %u", status);
return false;
}
// If it is the first time that we read the settings from flash,
// we load the factory ones instead and we save'em.
if(watchSettings.first_time_init)
{
persistency_factory_reset();
return persistency_save_settings_to_flash();
}
return true;
}
void persistency_factory_reset(void)
{
memcpy(&watchSettings, &defaultWatchSettings, sizeof(WatchSettings_t));
_params_changed = true;
}
void persistency_debug(void)
{
uint32_t *p = (uint32_t *)&watchSettings;
APP_LOG_DEBUG("%u %u %u %u %u %u",
p[0],
p[1],
p[2],
p[3],
p[4],
p[5]);
}

View File

@ -2,48 +2,228 @@
#define WATCH_SETTINGS_H
#include "wm_type_def.h"
#include "lcd.h"
#include "translation.h"
/* Time and Date Settings */
/**
* @brief The address in flash storage where the settings are saved
*
*/
#define WATCH_SETTINGS_FLASH_STORAGE_ADDRESS (0x1E0000)
/**
* @brief Time and Date Settings
*
*/
typedef struct TimeAndDate
{
uint32_t hour_format:1;
uint32_t date_format:2;
uint32_t automatic_time_and_date:1;
uint32_t time_and_date_hour_format:1,
time_and_date_date_format:2,
time_and_date_automatic:1;
} TimeAndDate_t;
/* Display Settings */
/**
* @brief Display Settings
*
*/
typedef struct Display
{
uint8_t brightness;
uint8_t sleep_timeout;
uint8_t orientation:2;
uint32_t display_brightness:8,
display_delay_before_sleep:4,
display_orientation:2,
display_wrist_wakeup:1,
display_vibrate_on_touch_strength:3,
display_vibrate_on_touch_duration:3;
} Display_t;
/* Connectivity Settings */
/**
* @brief Notification Settings
*
*/
typedef struct Notification
{
uint32_t vibrate_on_sms:1,
vibrate_on_email:1,
notification_vibration_strength:3,
notification_vibration_duration:3;
} Notification_t;
/**
* @brief Connectivity Settings
*
*/
typedef struct Connectivity
{
uint32_t connectivity_ble_enabled:1,
connectivity_wifi_enabled:1;
} Connectivity_t;
/* Language and UI Settings */
/**
* @brief Language and UI Settings
*
* @note Languages : English, French and German will be available
*
*/
typedef struct LanguageAndUI
{
uint32_t language:3;
} LanguageAndUI_t;
/* Main setting structure */
/**
* @brief Main setting structure
*
*/
typedef struct WatchSettings
{
uint32_t first_time_init:1;
TimeAndDate_t timeAndDate;
Display_t display;
Notification_t notification;
Connectivity_t connectivity;
LanguageAndUI_t languageAndUI;
} WatchSettings_t;
/**
* @brief
*
* @param hour_24H_format
*/
void watch_settings_time_and_date_set_hour_format(bool hour_24H_format);
/**
* @brief
*
* @param date_format
*/
void watch_settings_time_and_date_set_date_format(uint8_t date_format);
/**
* @brief
*
* @param automatic
*/
void watch_settings_time_and_date_set_automatic(bool automatic);
/**
* @brief
*
* @param brightness
*/
void watch_settings_display_set_brightness(uint8_t brightness);
/**
* @brief
*
* @param delay
*/
void watch_settings_display_set_delay_before_sleep(uint8_t delay);
/**
* @brief
*
* @param orientation
*/
void watch_settings_display_set_orientation(LCDOrientation_e orientation);
/**
* @brief
*
* @param wakeup
*/
void watch_settings_display_set_wrist_wakeup(bool wakeup);
/**
* @brief
*
* @param level
*/
void watch_settings_display_set_vibrate_on_touch_strength(uint8_t level);
/**
* @brief
*
* @param duration
*/
void watch_settings_display_set_vibrate_on_touch_duration(uint8_t duration);
/**
* @brief
*
* @param level
*/
void watch_settings_notification_set_vibration_strength(uint8_t level);
/**
* @brief
*
* @param duration
*/
void watch_settings_notification_set_vibration_duration(uint8_t duration);
/**
* @brief
*
* @param enabled
*/
void watch_settings_connectivity_set_ble_enabled(bool enabled);
/**
* @brief
*
* @param enabled
*/
void watch_settings_connectivity_set_wifi_enabled(bool enabled);
/**
* @brief
*
* @param language
*/
void watch_settings_language_and_UI_set_language(TranslationLanguage_e language);
/**
* @brief Initializes the persistency layer. Must be called first before any other persistency API functions.
*
*/
void persistency_init(void);
/**
* @brief Returns the watchSettings structure living in RAM
*
* @return WatchSettings_t* a pointer to the WatchSettings structure
*/
WatchSettings_t *persistency_get_settings(void);
bool persistency_save_settings(void);
/**
* @brief Writes the current watchSettings settings to flash
*
* @return true on success
* @return false on failure
*/
bool persistency_save_settings_to_flash(void);
bool persistency_load_settings(void);
/**
* @brief Reads the stored settings in the flash to put them in the watchSettings object
* which lives in RAM.
* @note If it is the first time that the settings are read from flash, this will also write default settings to it.
*
* @return true on success
* @return false on failure
*/
bool persistency_load_settings_from_flash(void);
/**
* @brief Reloads every settings of the watchSettings data structure with their default value.
* @note The call to this function DOES NOT save the new settings to flash.
* Call @ref persistency_save_settings_to_flash for that.
*
* @return true on success
* @return false on failure
*/
void persistency_factory_reset(void);
void persistency_debug(void);
#endif //WATCH_SETTINGS_H

View File

@ -0,0 +1,15 @@
TOP_DIR = ../..
sinclude $(TOP_DIR)/tools/w800/conf.mk
ifndef PDIR
GEN_LIBS = libtranslation$(LIB_EXT)
endif
#DEFINES +=
sinclude $(TOP_DIR)/tools/w800/rules.mk
INCLUDES := $(INCLUDES) -I $(PDIR)include
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

View File

@ -0,0 +1,39 @@
#include "wm_type_def.h"
#include "translation.h"
#include "watch_settings.h"
static const char * const translation_dictionary[][TRANSLATED_LANGUAGES_COUNT] =
{
[TRANSLATION_WATCH] = {
[TRANSLATION_FRENCH] = "Montre",
[TRANSLATION_GERMAN] = "Uhr",
[TRANSLATION_ENGLISH]= "Watch"
},
[TRANSLATION_ALARM] = {
[TRANSLATION_FRENCH] = "Reveil",
[TRANSLATION_GERMAN] = "Wecker",
[TRANSLATION_ENGLISH]= "Alarm"
},
[TRANSLATION_COMPASS] = {
[TRANSLATION_FRENCH] = "Boussole",
[TRANSLATION_GERMAN] = "Kompass",
[TRANSLATION_ENGLISH]= "Compass"
},
[TRANSLATION_ALTIMETER] = {
[TRANSLATION_FRENCH] = "Altimetre",
[TRANSLATION_GERMAN] = "Hohenmesser",
[TRANSLATION_ENGLISH]= "Altimeter"
},
[TRANSLATION_SETTINGS] = {
[TRANSLATION_FRENCH] = "Parametres",
[TRANSLATION_GERMAN] = "Einstellungen",
[TRANSLATION_ENGLISH]= "Settings"
},
};
const char *translation_get_word(TranslationWord_e word)
{
uint8_t word_count = sizeof translation_dictionary / sizeof(*translation_dictionary);
uint8_t language = persistency_get_settings()->languageAndUI.language;
return translation_dictionary[word % word_count][language % TRANSLATED_LANGUAGES_COUNT];
}

View File

@ -0,0 +1,24 @@
#ifndef TRANSLATION_H
#define TRANSLATION_H
#define TRANSLATED_LANGUAGES_COUNT (3)
typedef enum TranslationLanguage
{
TRANSLATION_FRENCH = 0,
TRANSLATION_GERMAN,
TRANSLATION_ENGLISH
} TranslationLanguage_e;
typedef enum TranslationWord
{
TRANSLATION_WATCH = 0,
TRANSLATION_ALARM,
TRANSLATION_COMPASS,
TRANSLATION_ALTIMETER,
TRANSLATION_SETTINGS
} TranslationWord_e;
const char * translation_get_word(TranslationWord_e word);
#endif //TRANSLATION_H

View File

@ -58,6 +58,18 @@ void tls_set_rtc(struct tm *tblock);
*/
void tls_get_rtc(struct tm *tblock);
/** NOT PART OF THE OFFICIAL SDK **/
/**
* @brief Checks if the RTC peripheral is running or not
*
* @return true
* @return false
*/
bool tls_is_rtc_running(void);
/**********************************/
/**
* @brief This function is used to register pmu rtc interrupt
*

View File

@ -24,7 +24,7 @@
#define TLS_CONFIG_ONLY_FACTORY_ATCMD CFG_OFF
/**Host Interface&Command**/
#define TLS_CONFIG_HOSTIF CFG_ON
#define TLS_CONFIG_HOSTIF CFG_OFF
#define TLS_CONFIG_AT_CMD (CFG_ON && TLS_CONFIG_HOSTIF)
#define TLS_CONFIG_RI_CMD (CFG_ON && TLS_CONFIG_HOSTIF)
#define TLS_CONFIG_RMMS (CFG_ON && TLS_CONFIG_HOSTIF)
@ -36,15 +36,15 @@
/** SOCKET CONFIG **/
#define TLS_CONFIG_SOCKET_STD CFG_ON
#define TLS_CONFIG_SOCKET_RAW CFG_ON
#define TLS_CONFIG_SOCKET_RAW CFG_OFF
#define TLS_CONFIG_CMD_USE_RAW_SOCKET (CFG_ON && TLS_CONFIG_SOCKET_RAW)
#define TLS_CONFIG_CMD_NET_USE_LIST_FTR CFG_ON
#define TLS_CONFIG_CMD_NET_USE_LIST_FTR CFG_OFF
#define TLS_CONFIG_HARD_CRYPTO CFG_ON
#define TLS_CONFIG_HARD_CRYPTO CFG_OFF
#define TLS_CONFIG_NTO CFG_ON
#define TLS_CONFIG_NTO CFG_OFF
#define TLS_CONFIG_CRYSTAL_24M CFG_OFF
/** HTTP CLIENT **/
@ -54,17 +54,17 @@ HTTPS Lib
SSL LIB
CRYPTO
*/
#define TLS_CONFIG_HTTP_CLIENT (CFG_ON)
#define TLS_CONFIG_HTTP_CLIENT (CFG_OFF)
#define TLS_CONFIG_HTTP_CLIENT_PROXY CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH (TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC || TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST)
#define TLS_CONFIG_HTTP_CLIENT_SECURE (CFG_ON && (TLS_CONFIG_USE_POLARSSL || TLS_CONFIG_USE_MBEDTLS))
#define TLS_CONFIG_HTTP_CLIENT_TASK (CFG_ON && TLS_CONFIG_HTTP_CLIENT)
#define TLS_CONFIG_HTTP_CLIENT_SECURE (CFG_OFF && (TLS_CONFIG_USE_POLARSSL || TLS_CONFIG_USE_MBEDTLS))
#define TLS_CONFIG_HTTP_CLIENT_TASK (CFG_OFF && TLS_CONFIG_HTTP_CLIENT)
/*MatrixSSL will be used except one of the following two Macros is CFG_ON*/
#define TLS_CONFIG_USE_POLARSSL CFG_OFF
#define TLS_CONFIG_USE_MBEDTLS CFG_ON
#define TLS_CONFIG_USE_MBEDTLS CFG_OFF
#define TLS_CONFIG_SERVER_SIDE_SSL (CFG_ON && TLS_CONFIG_HTTP_CLIENT_SECURE && TLS_CONFIG_USE_MBEDTLS) /*MUST configure TLS_CONFIG_HTTP_CLIENT_SECURE CFG_ON */
@ -73,7 +73,7 @@ CRYPTO
#define TLS_CONFIG_IGMP CFG_ON
#define TLS_CONFIG_NTP CFG_ON
#define TLS_CONFIG_NTP CFG_OFF
#if NIMBLE_FTR
#define TLS_CONFIG_BLE CFG_ON

View File

@ -49,7 +49,7 @@
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (40 * 1024U) /*[bytes]*/
#define LV_MEM_SIZE (30 * 1024U) /*[bytes]*/
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
#define LV_MEM_ADR 0 /*0: unused*/

View File

@ -15,6 +15,7 @@
#include "lcd.h"
#include "CST816D.h"
#include "watch_peripherals.h"
#include "watch_settings.h"
#include "app_log.h"
@ -50,17 +51,22 @@ static void touch_panel_isr(void *arg)
CST816D_read_touch_event(p);
}
void touch_panel_feedback_cb(struct _lv_indev_drv_t *lv_indev_drv, uint8_t lv_event_code)
static void touch_panel_feedback_cb(struct _lv_indev_drv_t *lv_indev_drv, uint8_t lv_event_code)
{
(void)lv_indev_drv;
uint16_t vibration_strength = persistency_get_settings()->display.display_vibrate_on_touch_strength*32;
uint32_t vibration_duration_ms = 0;
if(persistency_get_settings()->display.display_vibrate_on_touch_duration)
vibration_duration_ms = persistency_get_settings()->display.display_vibrate_on_touch_duration*50 + 50;
switch(lv_event_code)
{
case LV_EVENT_LONG_PRESSED:
watch_peripherals_vibrate(255, 200);
watch_peripherals_vibrate(255, vibration_duration_ms);
break;
case LV_EVENT_PRESSED:
watch_peripherals_vibrate(200, 200);
watch_peripherals_vibrate(vibration_strength > 255 ? 255 : vibration_strength, vibration_duration_ms);
break;
}
}
@ -135,6 +141,7 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
// Set the last pressed coordinates taking into account the current display orientation
switch(LCDConfig.LCDOrientation)
{
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
case LCD_ORIENTATION_90:
data->point.x = 239-last_y;
data->point.y = last_x;
@ -151,6 +158,24 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
data->point.x = 239-last_x;
data->point.y = 239-last_y;
break;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
case LCD_ORIENTATION_90:
data->point.x = last_y;
data->point.y = 239-last_x;
break;
case LCD_ORIENTATION_180:
data->point.x = 239-last_x;
data->point.y = 239-last_y;
break;
case LCD_ORIENTATION_270:
data->point.x = 239-last_y;
data->point.y = last_x;
break;
default:
data->point.x = last_x;
data->point.y = last_y;
break;
#endif
}
}

View File

@ -82,6 +82,13 @@ void tls_get_rtc(struct tm *tblock)
tblock->tm_sec = ctrl1 & 0x0000003f;
}
bool tls_is_rtc_running(void)
{
int ctrl2 = tls_reg_read32(HR_PMU_RTC_CTRL2);
return ctrl2 & (1 << 16) ? true : false;
}
void PMU_RTC_IRQHandler(void)
{
tls_reg_write32(HR_PMU_INTERRUPT_SRC, BIT(4)); /* clear rtc interrupt */

View File

@ -95,7 +95,7 @@ void _mutex_release (u32 *mutex)
u8 *TaskStartStk = NULL;
tls_os_task_t tststarthdl = NULL;
#define TASK_USERMAIN_STK_SIZE 1024
#define TASK_USERMAIN_STK_SIZE 512
u8 *TaskUsermainStk = NULL;
tls_os_task_t tstusermainhdl = NULL;

View File

@ -167,14 +167,14 @@ tls_bt_init(uint8_t uart_idx)
ble_hs_cfg.gatts_register_cb = on_svr_register_cb;
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
/* Initialize all packages. */
nimble_port_init();
nimble_port_init(); // 7 k ram gone --> 112691
/*Application levels code entry*/
tls_ble_gap_init();
tls_bt_util_init();
tls_ble_gap_init(); // 0k ram gone
tls_bt_util_init(); // 0k ram gone
/*Initialize the vuart interface and enable controller*/
ble_hci_vuart_init(uart_idx);
ble_hci_vuart_init(uart_idx); // 47k gone --> 65423
/* As the last thing, process events from default event queue. */
tls_nimble_start();
tls_nimble_start(); // 3k gone --> 62175
while(bt_adapter_state == WM_BT_STATE_OFF) {
tls_os_time_delay(10);

View File

@ -15,6 +15,11 @@
extern "C" {
#endif
/** NOT PART OF THE OFFICIAL SDK **/
int tls_bt_init(uint8_t uart_idx);
int tls_bt_deinit(void);
/**********************************/
typedef enum {
WM_BT_SYSTEM_ACTION_IDLE,

View File

@ -109,9 +109,6 @@ const char *tls_bt_gap_evt_2_str(uint32_t event)
}
}
#define BLE_HS_ENOERR 0
const char *tls_bt_rc_2_str(uint32_t event)
{
switch(event) {
@ -153,7 +150,33 @@ const char *tls_bt_rc_2_str(uint32_t event)
}
}
const char *tls_bt_addr_type_2_str(uint8_t addr_type)
{
switch(addr_type)
{
CASE_RETURN_STR(BLE_OWN_ADDR_PUBLIC)
CASE_RETURN_STR(BLE_OWN_ADDR_RANDOM)
CASE_RETURN_STR(BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT)
CASE_RETURN_STR(BLE_OWN_ADDR_RPA_RANDOM_DEFAULT)
default:
return "unknown addr_type";
}
}
const char *tls_bt_access_opt_2_str(uint8_t op)
{
switch(op)
{
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_READ_CHR)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_WRITE_CHR)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_READ_DSC)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_WRITE_DSC)
default:
return "unknown operation type";
}
}
static void async_evt_func(struct ble_npl_event *ev)
{

View File

@ -47,12 +47,15 @@ extern tls_bt_log_level_t tls_appl_trace_level;
#define TLS_BT_APPL_TRACE_EVENT(...)
#define TLS_BT_APPL_TRACE_DEBUG(...)
#define TLS_BT_APPL_TRACE_VERBOSE(...)
#endif
#define BLE_HS_ENOERR 0
void tls_bt_log(uint32_t trace_set_mask, const char *fmt_str, ...);
const char *tls_bt_gap_evt_2_str(uint32_t event);
const char *tls_bt_rc_2_str(uint32_t event);
const char *tls_bt_addr_type_2_str(uint8_t addr_type);
const char *tls_bt_access_opt_2_str(uint8_t op);
extern int tls_bt_util_init(void);
extern int tls_bt_util_deinit(void);

View File

@ -61,11 +61,11 @@
#endif
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT
#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (24)
#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (10)
#endif
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE
#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (292)
#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (100) // Default 292
#endif
#ifndef MYNEWT_VAL_MSYS_1_SANITY_MIN_COUNT
@ -425,7 +425,7 @@
/*** @apache-mynewt-nimble/nimble/host */
#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (512)
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (256) // 512
#endif
#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO
@ -925,7 +925,7 @@
/*** @apache-mynewt-nimble/nimble/transport/socket */
#ifndef MYNEWT_VAL_BLE_ACL_BUF_COUNT
#define MYNEWT_VAL_BLE_ACL_BUF_COUNT (36)
#define MYNEWT_VAL_BLE_ACL_BUF_COUNT (8) // Default 36
#endif
#ifndef MYNEWT_VAL_BLE_ACL_BUF_SIZE
@ -947,11 +947,11 @@
#endif
#ifndef MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT
#define MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT (16)
#define MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT (5) // Default 16
#endif
#ifndef MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT
#define MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT (96)
#define MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT (5) // Default 96
#endif
#ifndef MYNEWT_VAL_BLE_SOCK_CLI_SYSINIT_STAGE

View File

@ -17,7 +17,7 @@ void tls_nimble_start(void)
{
tls_host_task_stack_ptr = (void *)tls_mem_alloc(MYNEWT_VAL(OS_HS_STACK_SIZE) * sizeof(uint32_t));
assert(tls_host_task_stack_ptr != NULL);
tls_os_task_create(&tls_host_task_hdl, "bth",
tls_os_task_create(&tls_host_task_hdl, "ble_svc",
nimble_host_task,
(void *)0,
(void *)tls_host_task_stack_ptr,

View File

@ -77,7 +77,7 @@
#define configTICK_RATE_HZ ( ( portTickType ) 500u )
#define configMAX_PRIORITIES (63)
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) 12 * 1024 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) 4 * 1024 )
#define configMAX_TASK_NAME_LEN ( 10 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0

View File

@ -43,20 +43,22 @@ INCLUDES += -I $(TOP_DIR)/src/os/rtos/include
INCLUDES += -I $(TOP_DIR)/src/app/factorycmd
INCLUDES += -I $(TOP_DIR)/src/app/bleapp
INCLUDES += -I $(TOP_DIR)/app/app_include
INCLUDES += -I $(TOP_DIR)/app
INCLUDES += -I $(TOP_DIR)/app/app_drivers/lcd
INCLUDES += -I $(TOP_DIR)/app/app_drivers/mmc_sdio
INCLUDES += -I $(TOP_DIR)/app/app_drivers/i2c
INCLUDES += -I $(TOP_DIR)/app/app_drivers/watch_peripherals
INCLUDES += -I $(TOP_DIR)/app/persistency
INCLUDES += -I $(TOP_DIR)/app/app_include
INCLUDES += -I $(TOP_DIR)/app/ble
INCLUDES += -I $(TOP_DIR)/app/gfx
INCLUDES += -I $(TOP_DIR)/app
INCLUDES += -I $(TOP_DIR)/app/persistency
INCLUDES += -I $(TOP_DIR)/app/translation
#lvgl include
INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_v8.3
INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_port
#nimble host
INCLUDES += -I $(TOP_DIR)/src/bt/blehost/ext/tinycrypt/include
INCLUDES += -I $(TOP_DIR)/src/bt/blehost/nimble/host/include

View File

@ -44,6 +44,9 @@
<Option compilerVar="CC" />
</Unit>
<Unit filename="altimeter_screen.h" />
<Unit filename="altimeter_screen_assets.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="common_screen_components.c">
<Option compilerVar="CC" />
</Unit>
@ -55,9 +58,7 @@
<Option compilerVar="CC" />
</Unit>
<Unit filename="compass_screen.h" />
<Unit filename="hour_hand.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="firmware_version.h" />
<Unit filename="lv_conf.h" />
<Unit filename="lv_drivers/display/ILI9341.h" />
<Unit filename="lv_drivers/display/R61581.h" />
@ -1648,13 +1649,7 @@
<Option compilerVar="CC" />
</Unit>
<Unit filename="menu_screen.h" />
<Unit filename="minute_hand.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="rsrc/hour_hand.png" />
<Unit filename="second_hand.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="settings_screen.c">
<Option compilerVar="CC" />
</Unit>
@ -1666,9 +1661,6 @@
<Option compilerVar="CC" />
</Unit>
<Unit filename="watch_face.h" />
<Unit filename="watch_img.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="watch_mask.c">
<Option compilerVar="CC" />
</Unit>

View File

@ -2,24 +2,39 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1969" topLine="47" />
<Cursor1 position="29532" topLine="612" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869" topLine="0" />
<Cursor1 position="1135" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="722" topLine="32" />
<Cursor1 position="7126" topLine="230" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="440" topLine="14" />
<Cursor1 position="585" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\spinbox\lv_spinbox.h" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4262" topLine="120" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10562" topLine="336" />
</Cursor>
</File>
<File name="compass_assets.c" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="143" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -27,39 +42,44 @@
<Cursor1 position="9059" topLine="238" />
</Cursor>
</File>
<File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="715" topLine="26" />
<Cursor1 position="721" topLine="16" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="menu_screen.c" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="524" topLine="954" />
<Cursor1 position="3627" topLine="67" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7730" topLine="167" />
<Cursor1 position="0" topLine="138" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="539" topLine="9" />
<Cursor1 position="1282774" topLine="472" />
</Cursor>
</File>
<File name="menu_screen.c" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1391" topLine="23" />
<Cursor1 position="1299" topLine="36" />
</Cursor>
</File>
<File name="compass_screen.c" open="1" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6408" topLine="136" />
<Cursor1 position="615" topLine="25" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="456" topLine="6" />
<Cursor1 position="1969" topLine="47" />
</Cursor>
</File>
<File name="firmware_version.h" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="160" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -67,29 +87,44 @@
<Cursor1 position="14405" topLine="323" />
</Cursor>
</File>
<File name="watch_face.c" open="1" top="1" tabpos="11" split="0" active="1" splitpos="702" zoom_1="-1" zoom_2="-1">
<File name="altimeter_screen.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3268" topLine="76" />
<Cursor1 position="1028" topLine="30" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8169" topLine="288" />
<Cursor1 position="7631" topLine="141" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="56" />
<Cursor1 position="715" topLine="26" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="15" />
<Cursor1 position="7842" topLine="283" />
</Cursor>
</File>
<File name="common_screen_components.c" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="246" topLine="0" />
<Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5230" topLine="191" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.h" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="635" topLine="36" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5517" topLine="93" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -97,14 +132,141 @@
<Cursor1 position="2184" topLine="61" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1789" topLine="60" />
<Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2129" topLine="53" />
</Cursor>
</File>
<File name="compass_screen.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1253" topLine="18" />
</Cursor>
</File>
<File name="watch_face.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="702" zoom_1="-1" zoom_2="-1">
<Cursor>
<Cursor1 position="649" topLine="389" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3034" topLine="107" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="456" topLine="6" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1234" topLine="139" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6907" topLine="258" />
<Cursor1 position="10782" topLine="316" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5053" topLine="144" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2082" topLine="62" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="440" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3321" topLine="109" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="common_screen_components.c" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="498" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3835" topLine="68" />
</Cursor>
</File>
<File name="settings_screen.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="527" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1863" topLine="59" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2447" topLine="75" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5535" topLine="120" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3791697" topLine="77" />
</Cursor>
<Folding>
<Collapse line="8" />
<Collapse line="994" />
<Collapse line="1386" />
<Collapse line="1915" />
<Collapse line="2436" />
<Collapse line="2584" />
<Collapse line="2752" />
<Collapse line="2969" />
<Collapse line="3186" />
<Collapse line="3403" />
</Folding>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1988" topLine="67" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2825" topLine="122" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8074" topLine="159" />
</Cursor>
</File>
<File name="compass_screen.c" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6172" topLine="154" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1789" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -117,210 +279,24 @@
<Cursor1 position="1563" topLine="27" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7631" topLine="141" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
</Cursor>
</File>
<File name="settings_screen.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="860" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1299" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5784" topLine="170" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1135" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3011" topLine="100" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3835" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1857" topLine="35" />
</Cursor>
</File>
<File name="altimeter_screen.h" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="151" topLine="6" />
<Cursor1 position="11123" topLine="327" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="615" topLine="25" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="28878" topLine="605" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2557" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2447" topLine="75" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1282774" topLine="472" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7136" topLine="245" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="823" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12525" topLine="363" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6812" topLine="211" />
</Cursor>
</File>
<File name="menu_screen.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="menu_screen.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="48" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7018" topLine="202" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="18315" topLine="576" />
</Cursor>
</File>
<File name="watch_img.c" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4150889" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3706" topLine="117" />
</Cursor>
</File>
<File name="settings_screen.c" open="0" top="0" tabpos="8" split="2" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5410" topLine="32" />
<Cursor2 position="10475" topLine="18" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2767" topLine="86" />
</Cursor>
</File>
<File name="altimeter_screen.c" open="1" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1511" topLine="33" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2252" topLine="0" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3451942" topLine="1065" />
</Cursor>
<Folding>
<Collapse line="8" />
<Collapse line="995" />
</Folding>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_fmt_txt.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="24" />
</Cursor>
</File>
<File name="watch_menu_icons.c" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="951965" topLine="439" />
</Cursor>
<Folding>
<Collapse line="2" />
<Collapse line="195" />
<Collapse line="388" />
<Collapse line="581" />
<Collapse line="774" />
<Collapse line="967" />
<Collapse line="1546" />
<Collapse line="1729" />
<Collapse line="1739" />
</Folding>
</File>
<File name="lv_drivers\lv_drv_conf_template.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10670" topLine="390" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1261" topLine="45" />
<Cursor1 position="524" topLine="954" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -328,74 +304,59 @@
<Cursor1 position="5065" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="579" topLine="17" />
<Cursor1 position="5784" topLine="170" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1234" topLine="34" />
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="altimeter_screen.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="624" topLine="31" />
<Cursor1 position="13638" topLine="409" />
</Cursor>
</File>
<File name="common_screen_components.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="229" topLine="0" />
<Cursor1 position="722" topLine="32" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="402" topLine="16" />
<Cursor1 position="6210" topLine="113" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="common_screen_components.h" open="1" top="1" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7293" topLine="150" />
<Cursor1 position="215" topLine="0" />
</Cursor>
</File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="585" topLine="0" />
<Cursor1 position="869" topLine="0" />
</Cursor>
</File>
<File name="compass_screen.h" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="main.c" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1253" topLine="23" />
<Cursor1 position="1457" topLine="45" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\menu\lv_menu.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1085" topLine="33" />
<Cursor1 position="3706" topLine="117" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\lv_drv_conf_template.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2825" topLine="122" />
<Cursor1 position="10670" topLine="390" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="settings_screen.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="950" topLine="43" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3034" topLine="107" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1873" topLine="48" />
</Cursor>
</File>
<File name="watch_face.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="989" topLine="16" />
<Cursor1 position="4139" topLine="82" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_indev.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -403,34 +364,64 @@
<Cursor1 position="3566" topLine="102" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="610" topLine="17" />
<Cursor1 position="2557" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\label\lv_label.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5535" topLine="120" />
<Cursor1 position="5648" topLine="194" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="950" topLine="43" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_fmt_txt.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="15" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3011" topLine="100" />
</Cursor>
</File>
<File name="lv_conf.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12839" topLine="299" />
<Cursor1 position="12839" topLine="10" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\chart\lv_chart.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="29967" topLine="918" />
<Cursor1 position="11658" topLine="336" />
</Cursor>
</File>
<File name="minute_hand.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="52426" topLine="414" />
<Cursor1 position="823" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2129" topLine="53" />
<Cursor1 position="4439" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -442,9 +433,79 @@
<Collapse line="995" />
</Folding>
</File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11123" topLine="327" />
<Cursor1 position="19855" topLine="604" />
</Cursor>
</File>
<File name="watch_face.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="713" topLine="33" />
</Cursor>
</File>
<File name="altimeter_screen_assets.c" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="96342" topLine="161" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8562" topLine="290" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="56" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.c" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<Cursor>
<Cursor1 position="2391" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="539" topLine="9" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12525" topLine="363" />
</Cursor>
</File>
<File name="watch_menu_icons.c" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869291" topLine="156" />
</Cursor>
<Folding>
<Collapse line="2" />
<Collapse line="185" />
<Collapse line="195" />
<Collapse line="378" />
<Collapse line="388" />
<Collapse line="571" />
<Collapse line="581" />
<Collapse line="764" />
<Collapse line="774" />
<Collapse line="957" />
<Collapse line="967" />
<Collapse line="1150" />
<Collapse line="1160" />
<Collapse line="1343" />
<Collapse line="1353" />
<Collapse line="1536" />
<Collapse line="1546" />
<Collapse line="1729" />
</Folding>
</File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="579" topLine="17" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7730" topLine="167" />
</Cursor>
</File>
</CodeBlocks_layout_file>

View File

@ -1,7 +1,19 @@
#include <stdio.h>
#include "altimeter_screen.h"
#include "menu_screen.h"
static void gesture_event_cb(lv_event_t * e)
static void create_pressure_content(AltimeterScreen_t * const altimeterScreen);
static void create_altitude_content(AltimeterScreen_t * const altimeterScreen);
static void create_altitude_setting_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_pressure_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_altitude_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_altitude_setting_content(AltimeterScreen_t * const altimeterScreen);
static void update_min_and_max_pressure_data(AltimeterScreen_t * const altimeterScreen, float minPressure, float maxPressure);
static void gesture_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
@ -22,38 +34,234 @@ static void gesture_event_cb(lv_event_t * e)
break;
case LV_DIR_TOP:
LV_LOG_USER("GESTURE : TOP");
if(altimeterScreen->displayedView != ALTITUDE_VIEW && altimeterScreen->displayedView != ALTITUDE_SETTING_VIEW)
{
destroy_pressure_content(altimeterScreen);
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
}
break;
case LV_DIR_BOTTOM:
LV_LOG_USER("GESTURE : BOTTOM");
if(altimeterScreen->displayedView != PRESSURE_VIEW && altimeterScreen->displayedView != ALTITUDE_SETTING_VIEW)
{
destroy_altitude_content(altimeterScreen);
create_pressure_content(altimeterScreen);
altimeterScreen->displayedView = PRESSURE_VIEW;
}
break;
default:
LV_LOG_USER("GESTURE : %u", gesture);
}
}
static void cleanup_event_cb(lv_event_t * e)
/*static lv_chart_cursor_t * cursor;
static void chart_event_cb(lv_event_t * e)
{
static int32_t last_id = -1;
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
AltimeterScreen_t *altimeterScreen = e->user_data;
if(code == LV_EVENT_VALUE_CHANGED)
{
last_id = lv_chart_get_pressed_point(obj);
if(last_id != LV_CHART_POINT_NONE)
{
lv_chart_set_cursor_point(obj, cursor, NULL, last_id);
}
}
else if(code == LV_EVENT_DRAW_PART_END)
{
lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
if(!lv_obj_draw_part_check_type(dsc, &lv_chart_class, LV_CHART_DRAW_PART_CURSOR)) return;
if(dsc->p1 == NULL || dsc->p2 == NULL || dsc->p1->y != dsc->p2->y || last_id < 0) return;
lv_coord_t * data_array = altimeterScreen->pressure_data_points;
lv_coord_t v = data_array[last_id];
char buf[16];
lv_snprintf(buf, sizeof(buf), "%d", v);
lv_point_t size;
lv_txt_get_size(&size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE);
lv_area_t a;
a.y2 = dsc->p1->y - 5;
a.y1 = a.y2 - size.y - 10;
a.x1 = dsc->p1->x + 10;
a.x2 = a.x1 + size.x + 10;
lv_draw_rect_dsc_t draw_rect_dsc;
lv_draw_rect_dsc_init(&draw_rect_dsc);
draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_BLUE);
draw_rect_dsc.radius = 3;
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
lv_draw_label_dsc_t draw_label_dsc;
lv_draw_label_dsc_init(&draw_label_dsc);
draw_label_dsc.color = lv_color_white();
a.x1 += 5;
a.x2 -= 5;
a.y1 += 5;
a.y2 -= 5;
lv_draw_label(dsc->draw_ctx, &draw_label_dsc, &a, buf, NULL);
}
}*/
static void cleanup_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
altimeter_screen_destroy(altimeterScreen);
LV_LOG_USER("cleanup");
}
static void reset_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
update_min_and_max_pressure_data(altimeterScreen, 0.0, 0.0); //NULL to reset
memset(altimeterScreen->pressure_data_points, 0, sizeof(altimeterScreen->pressure_data_points));
memset(altimeterScreen->pressure_data_points_float, 0, sizeof(altimeterScreen->pressure_data_points_float));
//Update the chart if it is currently on the screen
if(altimeterScreen->pressureChart.chart)
{
lv_chart_refresh(altimeterScreen->pressureChart.chart);
}
LV_LOG_USER("reset event cb");
}
static void update_altitude_info(AltimeterScreen_t * const altimeterScreen)
{
sprintf(altimeterScreen->mainValue.value_text, "%.1f", altimeterScreen->lastReadAltitude - altimeterScreen->altitudeOffset);
sprintf(altimeterScreen->vsiValue.value_unit_text, "VSI : %s%.1f\nm/s", altimeterScreen->vsiFloat > 0 ? "+":"", altimeterScreen->vsiFloat);
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
lv_label_set_text_static(altimeterScreen->vsiValue.value_unit, altimeterScreen->vsiValue.value_unit_text);
}
static void calibrate_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
//If an offset was applied we clear it
if(altimeterScreen->altitudeOffset)
{
altimeterScreen->altitudeOffset = 0;
}
else
{
//We compute the offset needed to set the altitude to zero
altimeterScreen->altitudeOffset = altimeterScreen->lastReadAltitude;
}
altimeterScreen->vsiFloat = 0;
update_altitude_info(altimeterScreen);
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
LV_LOG_USER("calibrate altitude event cb");
}
static void set_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
destroy_altitude_content(altimeterScreen);
//Hide the main value
lv_obj_add_flag(altimeterScreen->mainValue.value, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(altimeterScreen->mainValue.unit, LV_OBJ_FLAG_HIDDEN);
create_altitude_setting_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_SETTING_VIEW;
LV_LOG_USER("set altitude event cb");
}
//Set button clicked on the altitude setting page
static void apply_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
int32_t spinbox_value = lv_spinbox_get_value(altimeterScreen->altitudeOffset_spinbox);
destroy_altitude_setting_content(altimeterScreen);
//Show the main value
lv_obj_clear_flag(altimeterScreen->mainValue.value, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(altimeterScreen->mainValue.unit, LV_OBJ_FLAG_HIDDEN);
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
altimeterScreen->altitudeOffset = altimeterScreen->lastReadAltitude - (spinbox_value / 10.0);
altimeterScreen->vsiFloat = 0;
update_altitude_info(altimeterScreen);
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
LV_LOG_USER("apply altitude event cb");
}
static void lv_spinbox_increment_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
lv_spinbox_increment(altimeterScreen->altitudeOffset_spinbox);
}
}
static void lv_spinbox_decrement_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
lv_spinbox_decrement(altimeterScreen->altitudeOffset_spinbox);
}
}
static void measurements_update_timer_cb(lv_timer_t *timer)
{
AltimeterScreen_t *altimeterScreen = timer->user_data;
if(altimeterScreen->measurementCb)
{
float temperature, pressure, altitude;
float temperature, pressure;
LV_LOG_USER("Updating measurements");
altimeterScreen->measurementCb(&temperature, &pressure, &altitude);
altimeterScreen->measurementCb(&temperature, &pressure, &altimeterScreen->lastReadAltitude);
//Compute and display the VSI
//We multiply by 2 because one measurement is done every 0.5 second.
altimeterScreen->vsiFloat = (altimeterScreen->lastReadAltitude - altimeterScreen->vsiFloat) * 2;
switch(altimeterScreen->displayedView)
{
case ALTITUDE_VIEW:
update_altitude_info(altimeterScreen);
break;
case PRESSURE_VIEW:
sprintf(altimeterScreen->mainValue.value_text, "%.2f", pressure);
break;
default:
break;
}
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
if(altimeterScreen->mainValue.value)
{
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
}
//Mock up part needs to be changed on embedded target
altimeter_screen_shift_chart_pressure_measurement(altimeterScreen, pressure);
}
else
{
LV_LOG_USER("measurementCb is NULL, be sure to register a callback !");
}
}
void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen)
@ -78,6 +286,50 @@ void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimete
altimeterScreen->measurementCb = MeasurementCb;
}
void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure)
{
if(!altimeterScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
uint8_t numberOfDataPoints = sizeof(altimeterScreen->pressure_data_points) / sizeof(altimeterScreen->pressure_data_points[0]);
memmove(altimeterScreen->pressure_data_points_float, &altimeterScreen->pressure_data_points_float[1], (numberOfDataPoints - 1) * sizeof(altimeterScreen->pressure_data_points_float[0]));
altimeterScreen->pressure_data_points_float[numberOfDataPoints-1] = pressure;
memmove(altimeterScreen->pressure_data_points, &altimeterScreen->pressure_data_points[1], (numberOfDataPoints - 1) * sizeof(altimeterScreen->pressure_data_points[0]));
altimeterScreen->pressure_data_points[(numberOfDataPoints - 1)] = pressure;
uint8_t minIndex = 0, maxIndex = 0;
float min = altimeterScreen->pressure_data_points_float[0], max = altimeterScreen->pressure_data_points_float[0];
//Recompute the min and max of the series :
for(uint8_t i = 1; i < numberOfDataPoints; i++)
{
if(min > altimeterScreen->pressure_data_points_float[i])
{
min = altimeterScreen->pressure_data_points_float[i];
minIndex = i;
}
if(max < altimeterScreen->pressure_data_points_float[i])
{
max = altimeterScreen->pressure_data_points_float[i];
maxIndex = i;
}
}
//Update the chart if it is currently on the screen
if(altimeterScreen->pressureChart.chart)
{
//Set the range of the Y axis of the chart using the min and max
lv_chart_set_range(altimeterScreen->pressureChart.chart, LV_CHART_AXIS_PRIMARY_Y, altimeterScreen->pressure_data_points[minIndex], altimeterScreen->pressure_data_points[maxIndex]);
lv_chart_refresh(altimeterScreen->pressureChart.chart);
}
update_min_and_max_pressure_data(altimeterScreen, min, max);
}
void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen)
{
if(!altimeterScreen)
@ -97,13 +349,55 @@ void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen)
}
altimeterScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(85, 88, 90), LV_PART_MAIN);
lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);/*
lv_obj_set_style_radius(altimeterScreen->display, LV_RADIUS_CIRCLE, LV_PART_MAIN);*/
lv_obj_t *inner_circle = lv_obj_create(altimeterScreen->display);
lv_obj_center(inner_circle);
lv_obj_set_size(inner_circle, 210, 210);
lv_obj_set_style_radius(inner_circle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
if(altimeterScreen->inner_circle)
{
LV_LOG_ERROR("inner_circle should be NULL here !");
lv_obj_del(altimeterScreen->inner_circle);
altimeterScreen->inner_circle = NULL;
}
altimeterScreen->inner_circle = lv_obj_create(altimeterScreen->display);
lv_obj_center(altimeterScreen->inner_circle);
lv_obj_set_size(altimeterScreen->inner_circle, 240, 240);
lv_obj_set_style_radius(altimeterScreen->inner_circle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_set_style_border_color(altimeterScreen->inner_circle, lv_color_make(22, 145, 147), LV_PART_MAIN);
lv_obj_set_style_border_width(altimeterScreen->inner_circle, 15, LV_PART_MAIN);
//Set up common label
if(altimeterScreen->mainValue.value || altimeterScreen->mainValue.unit)
{
LV_LOG_ERROR("value or unit should be NULL here !");
lv_obj_del(altimeterScreen->mainValue.value);
lv_obj_del(altimeterScreen->mainValue.unit);
altimeterScreen->mainValue.value = NULL;
altimeterScreen->mainValue.unit = NULL;
}
altimeterScreen->mainValue.value = lv_label_create(altimeterScreen->display);
lv_obj_set_style_text_font(altimeterScreen->mainValue.value, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_align(altimeterScreen->mainValue.value, LV_ALIGN_TOP_MID, 0, 40);
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
altimeterScreen->mainValue.unit = lv_label_create(altimeterScreen->display);
lv_obj_set_style_text_font(altimeterScreen->mainValue.unit, &lv_font_montserrat_30, LV_PART_MAIN);
//Setup the right screen content
switch(altimeterScreen->displayedView)
{
case ALTITUDE_VIEW:
create_altitude_content(altimeterScreen);
break;
case PRESSURE_VIEW:
create_pressure_content(altimeterScreen);
break;
default : //We probably left when in setting mode, so force altitude view
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
}
//We register the event callback to handle gestures
lv_obj_add_event_cb(altimeterScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, altimeterScreen);
@ -132,3 +426,184 @@ void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen)
memset(altimeterScreen, 0, offsetof(AltimeterScreen_t, displayedView));
}
static void create_pressure_content(AltimeterScreen_t * const altimeterScreen)
{
//We declare all the needed assets by the pressure content
LV_IMG_DECLARE(watch_asset_reset_icon)
lv_obj_t *reset_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(reset_btn, &watch_asset_reset_icon);
lv_obj_align(reset_btn, LV_ALIGN_CENTER, 0 ,0);
lv_obj_add_flag(reset_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(reset_btn, &(reset_event_cb), LV_EVENT_CLICKED, altimeterScreen);
lv_label_set_text_static(altimeterScreen->mainValue.unit, "hPa");
lv_obj_align_to(altimeterScreen->mainValue.unit, altimeterScreen->mainValue.value, LV_ALIGN_CENTER, 0, 25);
//Set the min and max text
if(altimeterScreen->minValue.value_unit || altimeterScreen->maxValue.value_unit)
{
LV_LOG_ERROR("minValue or maxValue should be NULL here !");
lv_obj_del(altimeterScreen->minValue.value_unit);
lv_obj_del(altimeterScreen->maxValue.value_unit);
altimeterScreen->minValue.value_unit = NULL;
altimeterScreen->maxValue.value_unit = NULL;
}
altimeterScreen->minValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(altimeterScreen->minValue.value_unit, &lv_font_montserrat_14, LV_PART_MAIN);
lv_obj_align(altimeterScreen->minValue.value_unit, LV_ALIGN_BOTTOM_LEFT, 0, -50);
sprintf(altimeterScreen->minValue.value_unit_text, "min:\n%.2f hPa", altimeterScreen->minValueFloat);
lv_label_set_text_static(altimeterScreen->minValue.value_unit, altimeterScreen->minValue.value_unit_text);
altimeterScreen->maxValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(altimeterScreen->maxValue.value_unit, &lv_font_montserrat_14, LV_PART_MAIN);
lv_obj_align(altimeterScreen->maxValue.value_unit, LV_ALIGN_BOTTOM_RIGHT, 0, -50);
lv_obj_set_style_text_align(altimeterScreen->maxValue.value_unit, LV_TEXT_ALIGN_RIGHT, LV_PART_MAIN);
sprintf(altimeterScreen->maxValue.value_unit_text, "max:\n%.2f hPa", altimeterScreen->maxValueFloat);
lv_label_set_text_static(altimeterScreen->maxValue.value_unit, altimeterScreen->maxValue.value_unit_text);
//Pressure chart and trend part:
if(altimeterScreen->pressureChart.chart)
{
LV_LOG_ERROR("chart should be NULL here !");
lv_obj_del(altimeterScreen->pressureChart.chart);
altimeterScreen->pressureChart.chart = NULL;
}
altimeterScreen->pressureChart.chart = lv_chart_create(altimeterScreen->inner_circle);
lv_obj_align(altimeterScreen->pressureChart.chart, LV_ALIGN_CENTER, 0, 65);
lv_obj_set_size(altimeterScreen->pressureChart.chart, 165, 45);
lv_chart_set_type(altimeterScreen->pressureChart.chart, LV_CHART_TYPE_LINE);
lv_chart_set_point_count(altimeterScreen->pressureChart.chart, sizeof(altimeterScreen->pressure_data_points) / sizeof(altimeterScreen->pressure_data_points[0]));
lv_obj_set_style_border_width(altimeterScreen->pressureChart.chart, 0, LV_PART_MAIN);
lv_obj_set_style_radius(altimeterScreen->pressureChart.chart, 0, LV_PART_MAIN);
//cursor = lv_chart_add_cursor(altimeterScreen->pressureChart.chart, lv_palette_main(LV_PALETTE_BLUE), LV_DIR_LEFT | LV_DIR_BOTTOM);
lv_chart_series_t *primary_Y_series = lv_chart_add_series(altimeterScreen->pressureChart.chart, lv_color_make(139, 180, 150), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_ext_y_array(altimeterScreen->pressureChart.chart, primary_Y_series, altimeterScreen->pressure_data_points);
//lv_obj_add_event_cb(altimeterScreen->pressureChart.chart, &(chart_event_cb), LV_EVENT_ALL, altimeterScreen);
}
static void create_altitude_content(AltimeterScreen_t * const altimeterScreen)
{
//We declare all the needed assets by the pressure content
LV_IMG_DECLARE(altimeter_asset_calibration_icon)
LV_IMG_DECLARE(watch_menu_settings_icon)
lv_label_set_text_static(altimeterScreen->mainValue.unit, "m");
lv_obj_align_to(altimeterScreen->mainValue.unit, altimeterScreen->mainValue.value, LV_ALIGN_CENTER, 0, 25);
lv_obj_t *calibration_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(calibration_btn, &altimeter_asset_calibration_icon);
lv_obj_align(calibration_btn, LV_ALIGN_CENTER, 52 ,5);
lv_obj_add_flag(calibration_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(calibration_btn, &(calibrate_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
lv_obj_t *setting_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(setting_btn, &watch_menu_settings_icon);
lv_obj_align(setting_btn, LV_ALIGN_CENTER, -52 ,5);
lv_obj_add_flag(setting_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(setting_btn, &(set_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
//Create VSI label
if(altimeterScreen->vsiValue.value_unit)
{
LV_LOG_ERROR("vsiValue should be NULL here !");
lv_obj_del(altimeterScreen->vsiValue.value_unit);
altimeterScreen->vsiValue.value_unit = NULL;
}
altimeterScreen->vsiValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_align(altimeterScreen->vsiValue.value_unit, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_style_text_color(altimeterScreen->vsiValue.value_unit, lv_color_make(51, 102, 255), LV_PART_MAIN);
lv_obj_set_style_text_font(altimeterScreen->vsiValue.value_unit, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_set_style_text_align(altimeterScreen->vsiValue.value_unit, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
sprintf(altimeterScreen->vsiValue.value_unit_text, "VSI : 0.0\nm/s");
lv_label_set_text_static(altimeterScreen->vsiValue.value_unit, altimeterScreen->vsiValue.value_unit_text);
}
static void create_altitude_setting_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_t *desc = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(desc, &lv_font_montserrat_16, LV_PART_MAIN);
lv_obj_align(desc, LV_ALIGN_CENTER, 0, -45);
lv_label_set_text(desc, "Set altitude to :");
if(altimeterScreen->altitudeOffset_spinbox)
{
LV_LOG_ERROR("spinner should be NULL here !");
lv_obj_del(altimeterScreen->altitudeOffset_spinbox);
altimeterScreen->altitudeOffset_spinbox = NULL;
}
altimeterScreen->altitudeOffset_spinbox = lv_spinbox_create(altimeterScreen->inner_circle);
lv_obj_set_align(altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_CENTER);
lv_obj_set_width(altimeterScreen->altitudeOffset_spinbox, lv_pct(50));
lv_spinbox_set_digit_format(altimeterScreen->altitudeOffset_spinbox, 5, 4);
//Max 9000 and min -1000 since we have a digit after the comma
lv_spinbox_set_range(altimeterScreen->altitudeOffset_spinbox, -10000, 90000);
lv_spinbox_set_cursor_pos(altimeterScreen->altitudeOffset_spinbox, 3);
lv_coord_t spinbox_height = lv_obj_get_height(altimeterScreen->altitudeOffset_spinbox);
lv_obj_t *inc_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_set_size(inc_btn, spinbox_height, spinbox_height);
lv_obj_align_to(inc_btn, altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
lv_obj_set_style_bg_img_src(inc_btn, LV_SYMBOL_PLUS, LV_PART_MAIN);
lv_obj_add_event_cb(inc_btn, &(lv_spinbox_increment_event_cb), LV_EVENT_ALL, altimeterScreen);
lv_obj_t *dec_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_set_size(dec_btn, spinbox_height, spinbox_height);
lv_obj_align_to(dec_btn, altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_OUT_LEFT_MID, -5, 0);
lv_obj_set_style_bg_img_src(dec_btn, LV_SYMBOL_MINUS, LV_PART_MAIN);
lv_obj_add_event_cb(dec_btn, &(lv_spinbox_decrement_event_cb), LV_EVENT_ALL, altimeterScreen);
lv_obj_t *set_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_align(set_btn, LV_ALIGN_CENTER, 0, 50);
lv_obj_t *set_btn_lbl = lv_label_create(set_btn);
lv_label_set_text(set_btn_lbl, "Set");
lv_obj_center(set_btn_lbl);
lv_obj_add_event_cb(set_btn, &(apply_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
}
static void destroy_pressure_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->maxValue.value_unit = NULL;
altimeterScreen->minValue.value_unit = NULL;
altimeterScreen->pressureChart.chart = NULL;
}
static void destroy_altitude_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->vsiValue.value_unit = NULL;
}
static void destroy_altitude_setting_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->altitudeOffset_spinbox = NULL;
}
static void update_min_and_max_pressure_data(AltimeterScreen_t * const altimeterScreen, float minPressure, float maxPressure)
{
altimeterScreen->minValueFloat = minPressure;
altimeterScreen->maxValueFloat = maxPressure;
if(altimeterScreen->minValue.value_unit)
{
sprintf(altimeterScreen->minValue.value_unit_text, "min:\n%.2f hPa", altimeterScreen->minValueFloat);
lv_label_set_text_static(altimeterScreen->minValue.value_unit, altimeterScreen->minValue.value_unit_text);
}
if(altimeterScreen->maxValue.value_unit)
{
sprintf(altimeterScreen->maxValue.value_unit_text, "max:\n%.2f hPa", altimeterScreen->maxValueFloat);
lv_label_set_text_static(altimeterScreen->maxValue.value_unit, altimeterScreen->maxValue.value_unit_text);
}
}

View File

@ -6,7 +6,8 @@
typedef enum DisplayedView
{
PRESSURE_VIEW = 0,
ALTITUDE_VIEW
ALTITUDE_VIEW,
ALTITUDE_SETTING_VIEW
} DisplayedView_e;
typedef struct MainValue
@ -14,34 +15,51 @@ typedef struct MainValue
lv_obj_t *value;
lv_obj_t *unit;
char value_text[10];
char value_unit[5];
} MainValue_t;
typedef struct MinMaxValue
typedef struct MinMaxVSIValue
{
lv_obj_t *value_unit;
char value_unit_text[20];
} MinMaxValue_t;
} MinMaxVSIValue_t;
typedef void(*MeasurementCb_t)(float * const temperature, float * const pressure, float * const altitude);
typedef struct PressureChart
{
lv_obj_t *chart;
} PressureChart_t;
typedef struct AltimeterScreen
{
//Can be erased attributes
lv_obj_t *display;
lv_obj_t *inner_circle;
lv_obj_t *altitudeOffset_spinbox;
PressureChart_t pressureChart;
lv_timer_t *measurementUpdateTimer;
MainValue_t mainValue;
MinMaxValue_t minValue;
MinMaxValue_t maxValue;
MinMaxVSIValue_t minValue;
MinMaxVSIValue_t maxValue;
MinMaxVSIValue_t vsiValue;
float vsiFloat;
float lastReadAltitude;
//Should not be erased attributes
DisplayedView_e displayedView;
MeasurementCb_t measurementCb;
float minValueFloat;
float maxValueFloat;
float altitudeOffset;
lv_coord_t pressure_data_points[10];
float pressure_data_points_float[10];
} AltimeterScreen_t;
void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen);
void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb);
void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure);
void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen);
void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen);

View File

@ -0,0 +1,194 @@
#include "lvgl.h"
const LV_ATTRIBUTE_LARGE_CONST uint8_t calibration_icon_chroma_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x6e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x72, 0x72, 0x6e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x76, 0xbf, 0xbf, 0xbf, 0xbf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x76, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xdf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x72, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x72, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x97, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x72, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x6e, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x76, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0xbb, 0xbb,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x9b, 0xdf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x9b, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x6e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x72, 0x97, 0x9b, 0x76, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x6e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x97, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0x98, 0xa5, 0xb8, 0xa5, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x97, 0xa5, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xcd, 0x4a, 0x0d, 0x4b, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x2e, 0x53, 0xcd, 0x4a, 0x2e, 0x53, 0x31, 0x64, 0x51, 0x6c, 0x8f, 0x5b, 0xcc, 0x4a, 0x0d, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0xcc, 0x4a, 0xf3, 0x74, 0x5c, 0xa7, 0xfe, 0xaf, 0xfe, 0xb7, 0xbd, 0xaf, 0xd6, 0x85, 0xed, 0x4a, 0x0d, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2d, 0x53, 0xcd, 0x4a, 0xf3, 0x74, 0xfe, 0xb7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xff, 0xb7, 0x17, 0x8e, 0xed, 0x4a, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x2e, 0x53, 0x9c, 0xa7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x31, 0x64, 0xed, 0x4a, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xcd, 0x4a, 0x31, 0x64, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x75, 0x7d, 0xcc, 0x4a, 0x2e, 0x53, 0xed, 0x4a, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d,
0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xcc, 0x4a, 0x51, 0x6c, 0xfe, 0xb7, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xdd, 0xaf, 0xfe, 0xb7, 0xb6, 0x85, 0xac, 0x4a, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95,
0xd8, 0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xed, 0x4a, 0x8f, 0x5b, 0xdd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x92, 0x6c, 0xcd, 0x4a, 0x2e, 0x53, 0xed, 0x4a, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x9d, 0xb8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0xd8, 0xa5,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2d, 0x53, 0xcc, 0x4a, 0xd6, 0x85, 0xff, 0xb7, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x1a, 0x9f, 0x0d, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x97, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x53, 0xed, 0x4a, 0x17, 0x8e, 0xfe, 0xb7, 0xfe, 0xb7, 0xff, 0xb7, 0xfe, 0xb7, 0xfa, 0x9e, 0x6f, 0x53, 0xed, 0x4a, 0x0d, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x97, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x53, 0x0d, 0x53, 0xed, 0x4a, 0x11, 0x64, 0x75, 0x7d, 0x96, 0x85, 0x92, 0x6c, 0x2d, 0x53, 0xed, 0x4a, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xcc, 0x4a, 0xcc, 0x4a, 0xcd, 0x4a, 0x0d, 0x53, 0x2d, 0x53, 0x0d, 0x4b, 0x6f, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x36, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x36, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xb8, 0xa5, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x76, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xb8, 0xa5, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0xb8, 0xa5, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0xa5, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0xa5, 0x98, 0xa5, 0xb8, 0x9d, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0x97, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x76, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x4b, 0x0d, 0x4a, 0xed, 0x4a, 0xcd, 0x4b, 0x0d, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x2e, 0x4a, 0xcd, 0x53, 0x2e, 0x64, 0x31, 0x6c, 0x51, 0x5b, 0x8f, 0x4a, 0xcc, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x4a, 0xcc, 0x74, 0xf3, 0xa7, 0x5c, 0xaf, 0xfe, 0xb7, 0xfe, 0xaf, 0xbd, 0x85, 0xd6, 0x4a, 0xed, 0x53, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x76, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2d, 0x4a, 0xcd, 0x74, 0xf3, 0xb7, 0xfe, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xff, 0x8e, 0x17, 0x4a, 0xed, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x2e, 0xa7, 0x9c, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x64, 0x31, 0x4a, 0xed, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xcd, 0x64, 0x31, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x7d, 0x75, 0x4a, 0xcc, 0x53, 0x2e, 0x4a, 0xed, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56,
0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xcc, 0x6c, 0x51, 0xb7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xdd, 0xb7, 0xfe, 0x85, 0xb6, 0x4a, 0xac, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56,
0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xb8, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xed, 0x5b, 0x8f, 0xaf, 0xdd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x6c, 0x92, 0x4a, 0xcd, 0x53, 0x2e, 0x4a, 0xed, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0xa5, 0xb8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0xd8,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2d, 0x4a, 0xcc, 0x85, 0xd6, 0xb7, 0xff, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x9f, 0x1a, 0x53, 0x0d, 0x4b, 0x0d, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x97, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x0d, 0x4a, 0xed, 0x8e, 0x17, 0xb7, 0xfe, 0xb7, 0xfe, 0xb7, 0xff, 0xb7, 0xfe, 0x9e, 0xfa, 0x53, 0x6f, 0x4a, 0xed, 0x53, 0x0d, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0xa5, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x0d, 0x53, 0x0d, 0x4a, 0xed, 0x64, 0x11, 0x7d, 0x75, 0x85, 0x96, 0x6c, 0x92, 0x53, 0x2d, 0x4a, 0xed, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x0d, 0x53, 0x2e, 0x4a, 0xed, 0x4a, 0xcc, 0x4a, 0xcc, 0x4a, 0xcd, 0x53, 0x0d, 0x53, 0x2d, 0x4b, 0x0d, 0x53, 0x6f, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x36, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x36, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0xb8, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x76, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x76, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0xb8, 0x9d, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0xa5, 0xb8, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
#endif
#if LV_COLOR_DEPTH == 32
/*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xad, 0x98, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xbb, 0xb0, 0x9c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb9, 0xae, 0x9a, 0xff, 0xbc, 0xb1, 0x9d, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xae, 0xa4, 0x91, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb6, 0xac, 0x97, 0xff, 0xc2, 0xb3, 0xa1, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb8, 0xaf, 0x9c, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb5, 0xac, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa5, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xae, 0xa4, 0x91, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbc, 0xb3, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb6, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6e, 0x65, 0x4d, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6e, 0x65, 0x50, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x65, 0x5a, 0x48, 0xff, 0x64, 0x59, 0x47, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6a, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6a, 0x61, 0x4b, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x64, 0x59, 0x47, 0xff, 0x6e, 0x65, 0x4e, 0xff, 0x88, 0x84, 0x61, 0xff, 0x8b, 0x87, 0x64, 0xff, 0x76, 0x6e, 0x54, 0xff, 0x63, 0x58, 0x47, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb8, 0xae, 0x9a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa8, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc2, 0xb3, 0xa1, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x63, 0x57, 0x46, 0xff, 0x99, 0x9a, 0x6d, 0xff, 0xde, 0xe9, 0xa0, 0xff, 0xee, 0xff, 0xab, 0xff, 0xf0, 0xff, 0xac, 0xff, 0xe5, 0xf4, 0xa5, 0xff, 0xb2, 0xb8, 0x7f, 0xff, 0x67, 0x5c, 0x49, 0xff, 0x6b, 0x60, 0x4c, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xaa, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xac, 0x98, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x64, 0x58, 0x47, 0xff, 0x99, 0x9a, 0x6e, 0xff, 0xf1, 0xff, 0xad, 0xff, 0xee, 0xff, 0xab, 0xff, 0xe9, 0xfc, 0xa7, 0xff, 0xe9, 0xfc, 0xa7, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xf6, 0xff, 0xb1, 0xff, 0xb8, 0xc0, 0x84, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x6c, 0x62, 0x4c, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb8, 0xae, 0x9a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x5f, 0x4b, 0xff, 0x6e, 0x65, 0x4e, 0xff, 0xdf, 0xef, 0xa0, 0xff, 0xee, 0xfe, 0xaa, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xf1, 0xff, 0xad, 0xff, 0x86, 0x82, 0x60, 0xff, 0x65, 0x5a, 0x48, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x64, 0x58, 0x47, 0xff, 0x88, 0x84, 0x61, 0xff, 0xee, 0xfd, 0xab, 0xff, 0xe8, 0xfc, 0xa6, 0xff, 0xeb, 0xfd, 0xa8, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xfe, 0xaf, 0xff, 0xa9, 0xad, 0x79, 0xff, 0x62, 0x56, 0x45, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x69, 0x5d, 0x48, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa5, 0x92, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff,
0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x63, 0x57, 0x46, 0xff, 0x8b, 0x88, 0x64, 0xff, 0xf0, 0xfe, 0xac, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xe8, 0xf9, 0xa7, 0xff, 0xf3, 0xfe, 0xaf, 0xff, 0xad, 0xb3, 0x7c, 0xff, 0x61, 0x55, 0x44, 0xff, 0x6d, 0x65, 0x4f, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa5, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff,
0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x67, 0x5d, 0x4a, 0xff, 0x76, 0x6e, 0x54, 0xff, 0xe6, 0xf6, 0xa5, 0xff, 0xeb, 0xfc, 0xa8, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xff, 0xae, 0xff, 0x92, 0x91, 0x68, 0xff, 0x64, 0x58, 0x47, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x69, 0x5d, 0x48, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb5, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x63, 0x57, 0x46, 0xff, 0xb2, 0xb8, 0x80, 0xff, 0xf6, 0xff, 0xb1, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xe8, 0xfb, 0xa7, 0xff, 0xe8, 0xfb, 0xa7, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xff, 0xae, 0xff, 0xd2, 0xdf, 0x97, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x60, 0x4b, 0xff, 0x6c, 0x62, 0x4c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x67, 0x5c, 0x49, 0xff, 0xb8, 0xc0, 0x84, 0xff, 0xf1, 0xff, 0xad, 0xff, 0xf3, 0xff, 0xaf, 0xff, 0xf4, 0xff, 0xaf, 0xff, 0xf3, 0xff, 0xae, 0xff, 0xd1, 0xdd, 0x96, 0xff, 0x74, 0x6c, 0x53, 0xff, 0x68, 0x5d, 0x4a, 0xff, 0x6a, 0x61, 0x4c, 0xff, 0x70, 0x65, 0x4f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb8, 0xaf, 0x9c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x60, 0x4c, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x86, 0x81, 0x5f, 0xff, 0xa9, 0xac, 0x79, 0xff, 0xae, 0xb1, 0x7c, 0xff, 0x92, 0x90, 0x68, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x68, 0x5d, 0x4a, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb7, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x6a, 0x60, 0x4c, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x62, 0x56, 0x46, 0xff, 0x62, 0x56, 0x45, 0xff, 0x64, 0x59, 0x47, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x75, 0x6a, 0x52, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6e, 0x65, 0x4f, 0xff, 0x6e, 0x65, 0x4f, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6c, 0x63, 0x4d, 0xff, 0x70, 0x65, 0x4f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc0, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa5, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb7, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xac, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc1, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xad, 0xa4, 0x90, 0xff, 0xc3, 0xb9, 0xa3, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc3, 0xb8, 0xa3, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xbc, 0xb3, 0x9d, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xaa, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xaa, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb7, 0xac, 0x98, 0xff, 0xc1, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xad, 0x98, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0xb9, 0xaf, 0x9a, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb7, 0xad, 0x99, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0xc0, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbd, 0xb3, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
#endif
};
const lv_img_dsc_t altimeter_asset_calibration_icon = {
.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 42,
.header.h = 42,
.data_size = 1764 * LV_COLOR_SIZE / 8,
.data = calibration_icon_chroma_map,
};

View File

@ -1,16 +1,58 @@
#include "lvgl.h"
/***
* It is needed to have a reference on two header_titles because when
* switching from one screen using a header to an other screen which is also using one
* the header of the new screen will be created BEFORE the header of the previous screen
* is deleted ...
*/
/* A reference to the current and previous header title */
static lv_obj_t *header_title[2] = {NULL, NULL};
/* Pointer to the header_title to use */
lv_obj_t **header_title_p = &header_title[0];
static void cleanup_event_cb(lv_event_t * e)
{
lv_obj_t **header_title_deleted_p = e->user_data;
*header_title_deleted_p = NULL;
LV_LOG_USER("header_title cleanup");
}
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height)
{
if(header_title[0] == NULL)
header_title_p = &header_title[0];
else if(header_title[1] == NULL)
header_title_p = &header_title[1];
else
{
LV_LOG_ERROR("no free header_title");
return;
}
lv_obj_t *header = lv_obj_create(parent);
lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN);
lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height);
lv_obj_set_style_radius(header, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(header, 0, LV_PART_MAIN);
lv_obj_clear_flag(header, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *header_title = lv_label_create(header);
lv_label_set_text_static(header_title, title);
lv_obj_set_style_text_color(header_title, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(header_title, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_align(header_title, LV_ALIGN_CENTER);
*header_title_p = lv_label_create(header);
lv_label_set_text_static(*header_title_p, title);
lv_obj_set_style_text_align(*header_title_p, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(*header_title_p, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(*header_title_p, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_width(*header_title_p, 150);
lv_obj_set_align(*header_title_p, LV_ALIGN_CENTER);
lv_label_set_long_mode(*header_title_p, LV_LABEL_LONG_SCROLL_CIRCULAR);
/* Once the current header_title is destroyed, mark it as NULL to prevent any crashes when trying to change it's title */
lv_obj_add_event_cb(*header_title_p, &(cleanup_event_cb), LV_EVENT_DELETE, header_title_p);
}
void common_screen_header_update_title(const char * title)
{
if(!*header_title_p)return;
lv_label_set_text_static(*header_title_p, title);
}

View File

@ -3,6 +3,20 @@
#include "lvgl.h"
/**
* @brief Adds a screen header with the defined title to the screen passed as parent with the provided height.
*
* @param parent the screen to which the header will be added
* @param title a string used as the header's title
* @param height the height in pixel of the header
*/
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height);
/**
* @brief Updates the current title of displayed screen header
*
* @param title a string used as the new header's title
*/
void common_screen_header_update_title(const char * title);
#endif //COMMON_SCREEN_COMPONENTS_H

View File

@ -0,0 +1,7 @@
#ifndef FIRMWARE_VERSION_H
#define FIRMWARE_VERSION_H
#define FIRMWARE_VERSION "0.0.1" //Firmware creation
#define FIRMWARE_TIME_DATE (__TIME__" "__DATE__)
#endif //FIRMWARE_VERSION_H

View File

@ -1,338 +0,0 @@
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_HOUR_HAND
#define LV_ATTRIBUTE_IMG_HOUR_HAND
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_HOUR_HAND uint8_t hour_hand_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x49, 0xc0, 0x6d, 0xff, 0x49, 0xff, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xb6, 0x45, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xb7, 0x6f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x54, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x32, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x39, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xb7, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x45, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xb7, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xb6, 0x66, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x92, 0xff, 0x92, 0x59, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xb6, 0x68, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x24, 0x1d, 0x24, 0xd2, 0x24, 0xff, 0x25, 0xff, 0x49, 0xff, 0x6d, 0x35, 0x00, 0x00,
0x00, 0x00, 0x92, 0xbd, 0x6d, 0xde, 0x49, 0x56, 0x6e, 0x56, 0x49, 0xc6, 0x49, 0xd9, 0x6d, 0x38,
0x00, 0x00, 0xb7, 0xb2, 0x92, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x24, 0x78,
0xb7, 0xff, 0xb7, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2f, 0x92, 0xdc,
0xb7, 0xff, 0xb7, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0d, 0x49, 0xaa,
0xb6, 0xff, 0x6e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x40, 0xdb, 0xf1,
0x00, 0x00, 0x92, 0xec, 0x49, 0x64, 0x24, 0x11, 0x6e, 0x0c, 0x25, 0x3c, 0x92, 0xa1, 0xdb, 0x79,
0x00, 0x00, 0x49, 0x8a, 0x25, 0xea, 0x00, 0xbb, 0x00, 0xb6, 0x49, 0xe6, 0x92, 0xc1, 0x92, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6d, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6d, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x92, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6e, 0xbd, 0xdb, 0xff, 0xdb, 0xff, 0xb7, 0xfb, 0xb7, 0x2f, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0xc0, 0xcb, 0x5a, 0xff, 0x8a, 0x52, 0xff, 0xc3, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0xc0, 0x00, 0x00, 0xff, 0xa2, 0x10, 0xff, 0xa6, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x8e, 0x73, 0xff, 0x92, 0x94, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x35, 0xad, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x35, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x75, 0xad, 0xff, 0x96, 0xb5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xf3, 0x9c, 0xff, 0x75, 0xad, 0x6f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb2, 0x94, 0xff, 0xb6, 0xb5, 0x54, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x14, 0xa5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x75, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0xb7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x14, 0xa5, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0xf4, 0xa4, 0xff, 0xd7, 0xbd, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x96, 0xb5, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x34, 0xa5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xf4, 0xa4, 0xff, 0xd7, 0xbd, 0x39, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xd7, 0xbd, 0xff, 0x96, 0xb5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb3, 0x9c, 0xff, 0xb6, 0xb5, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb3, 0x9c, 0xff, 0xd7, 0xbd, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb6, 0xb5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xd3, 0x9c, 0xff, 0xd7, 0xbd, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x75, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb7, 0xbd, 0xff, 0x55, 0xad, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0xd3, 0x9c, 0xff, 0xb3, 0x9c, 0x66, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0x8a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0x8a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x61, 0x08, 0xff, 0x51, 0x8c, 0xff, 0x10, 0x84, 0x59, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0xcb, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xc3, 0x18, 0xff, 0x49, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0xcb, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb6, 0xb5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x35, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x96, 0xb5, 0xff, 0xd3, 0x9c, 0x68, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x92, 0x94, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xe3, 0x18, 0x1d, 0xe4, 0x20, 0xd2, 0xe4, 0x20, 0xff, 0x25, 0x29, 0xff, 0x49, 0x4a, 0xff, 0xaa, 0x52, 0x35, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xef, 0x7b, 0xbd, 0xcb, 0x5a, 0xde, 0xa6, 0x31, 0x56, 0x8e, 0x73, 0x56, 0x29, 0x4a, 0xc6, 0x49, 0x4a, 0xd9, 0xeb, 0x5a, 0x38,
0x00, 0x00, 0x00, 0x35, 0xad, 0xb2, 0x10, 0x84, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0x6c, 0x04, 0x21, 0x78,
0x55, 0xad, 0xff, 0x55, 0xad, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0x2f, 0x8e, 0x73, 0xdc,
0x76, 0xb5, 0xff, 0x34, 0xa5, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x29, 0x0d, 0x86, 0x31, 0xaa,
0xd3, 0x9c, 0xff, 0x4d, 0x6b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x5a, 0x40, 0xd7, 0xbd, 0xf1,
0x00, 0x00, 0x00, 0x72, 0x94, 0xec, 0xa6, 0x31, 0x64, 0x04, 0x21, 0x11, 0x6d, 0x6b, 0x0c, 0x65, 0x29, 0x3c, 0x31, 0x8c, 0xa1, 0x18, 0xc6, 0x79,
0x00, 0x00, 0x00, 0xe7, 0x39, 0x8a, 0x04, 0x21, 0xea, 0x82, 0x10, 0xbb, 0x41, 0x08, 0xb6, 0x69, 0x4a, 0xe6, 0x10, 0x84, 0xc1, 0xae, 0x73, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x0c, 0x63, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x0c, 0x63, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xaa, 0x52, 0xff, 0x10, 0x84, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x73, 0xbd, 0x18, 0xc6, 0xff, 0xd7, 0xbd, 0xff, 0x96, 0xb5, 0xfb, 0x96, 0xb5, 0x2f, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0xc0, 0x5a, 0xcb, 0xff, 0x52, 0x8a, 0xff, 0x18, 0xc3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x62, 0xc0, 0x00, 0x00, 0xff, 0x10, 0xa2, 0xff, 0x31, 0xa6, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0x73, 0x8e, 0xff, 0x94, 0x92, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x35, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x35, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x75, 0xff, 0xb5, 0x96, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x9c, 0xf3, 0xff, 0xad, 0x75, 0x6f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x94, 0xb2, 0xff, 0xb5, 0xb6, 0x54, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xa5, 0x14, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x75, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xbd, 0xb7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa5, 0x14, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa4, 0xf4, 0xff, 0xbd, 0xd7, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x96, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa5, 0x34, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xa4, 0xf4, 0xff, 0xbd, 0xd7, 0x39, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xbd, 0xd7, 0xff, 0xb5, 0x96, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xb3, 0xff, 0xb5, 0xb6, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xb3, 0xff, 0xbd, 0xd7, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0xb6, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xd3, 0xff, 0xbd, 0xd7, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xad, 0x75, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xbd, 0xb7, 0xff, 0xad, 0x55, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0x9c, 0xd3, 0xff, 0x9c, 0xb3, 0x66, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x52, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x52, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x61, 0xff, 0x8c, 0x51, 0xff, 0x84, 0x10, 0x59, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x5a, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xc3, 0xff, 0x4a, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x5a, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0xb6, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0xad, 0x35, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0xb5, 0x96, 0xff, 0x9c, 0xd3, 0x68, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x94, 0x92, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0xe3, 0x1d, 0x20, 0xe4, 0xd2, 0x20, 0xe4, 0xff, 0x29, 0x25, 0xff, 0x4a, 0x49, 0xff, 0x52, 0xaa, 0x35, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7b, 0xef, 0xbd, 0x5a, 0xcb, 0xde, 0x31, 0xa6, 0x56, 0x73, 0x8e, 0x56, 0x4a, 0x29, 0xc6, 0x4a, 0x49, 0xd9, 0x5a, 0xeb, 0x38,
0x00, 0x00, 0x00, 0xad, 0x35, 0xb2, 0x84, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x49, 0x6c, 0x21, 0x04, 0x78,
0xad, 0x55, 0xff, 0xad, 0x55, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0x2f, 0x73, 0x8e, 0xdc,
0xb5, 0x76, 0xff, 0xa5, 0x34, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x45, 0x0d, 0x31, 0x86, 0xaa,
0x9c, 0xd3, 0xff, 0x6b, 0x4d, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xab, 0x40, 0xbd, 0xd7, 0xf1,
0x00, 0x00, 0x00, 0x94, 0x72, 0xec, 0x31, 0xa6, 0x64, 0x21, 0x04, 0x11, 0x6b, 0x6d, 0x0c, 0x29, 0x65, 0x3c, 0x8c, 0x31, 0xa1, 0xc6, 0x18, 0x79,
0x00, 0x00, 0x00, 0x39, 0xe7, 0x8a, 0x21, 0x04, 0xea, 0x10, 0x82, 0xbb, 0x08, 0x41, 0xb6, 0x4a, 0x69, 0xe6, 0x84, 0x10, 0xc1, 0x73, 0xae, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x63, 0x0c, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x63, 0x0c, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x52, 0xaa, 0xff, 0x84, 0x10, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x8e, 0xbd, 0xc6, 0x18, 0xff, 0xbd, 0xd7, 0xff, 0xb5, 0x96, 0xfb, 0xb5, 0x96, 0x2f, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x3e, 0xc0, 0x59, 0x59, 0x59, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0x18, 0x18, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x13, 0x13, 0x13, 0xff, 0x32, 0x32, 0x32, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x06, 0x06, 0x06, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0x90, 0x90, 0x90, 0x45, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xa4, 0xa4, 0xff, 0xb8, 0xb8, 0xb8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xb1, 0xb1, 0xb1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x9a, 0x9a, 0xff, 0xaa, 0xaa, 0xaa, 0x6f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0x92, 0x92, 0x92, 0xff, 0xb3, 0xb3, 0xb3, 0x54, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xb4, 0xb4, 0xb4, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0x9f, 0x9f, 0x9f, 0xff, 0xb8, 0xb8, 0xb8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0xb8, 0xb8, 0xb8, 0x32, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xb6, 0xb6, 0xb6, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x03, 0x03, 0x03, 0xff, 0xa2, 0xa2, 0xa2, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0xb7, 0xb7, 0xb7, 0x39, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0xaf, 0xaf, 0xaf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x95, 0x95, 0x95, 0xff, 0xb3, 0xb3, 0xb3, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x95, 0x95, 0x95, 0xff, 0xb6, 0xb6, 0xb6, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x98, 0x98, 0x98, 0xff, 0xb9, 0xb9, 0xb9, 0x45, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0xa8, 0xa8, 0xa8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x06, 0x06, 0x06, 0xff, 0x97, 0x97, 0x97, 0xff, 0x94, 0x94, 0x94, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x87, 0x87, 0x87, 0xff, 0x7e, 0x7e, 0x7e, 0x59, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x14, 0x14, 0x14, 0xff, 0x57, 0x57, 0x57, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x17, 0x17, 0x17, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x58, 0x58, 0x58, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xad, 0xad, 0xad, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xae, 0xae, 0xae, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xad, 0xad, 0xad, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xae, 0xae, 0xae, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xac, 0xac, 0xac, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x07, 0x07, 0x07, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x07, 0x07, 0x07, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0x98, 0x98, 0x98, 0x68, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x91, 0x91, 0x91, 0xff, 0x66, 0x66, 0x66, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0x1d, 0x1d, 0x1d, 0x1d, 0xd2, 0x1d, 0x1d, 0x1d, 0xff, 0x25, 0x25, 0x25, 0xff, 0x49, 0x49, 0x49, 0xff, 0x52, 0x52, 0x52, 0x35, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b, 0x7b, 0xbd, 0x56, 0x56, 0x56, 0xde, 0x32, 0x32, 0x32, 0x56, 0x6e, 0x6e, 0x6e, 0x56, 0x44, 0x44, 0x44, 0xc6, 0x47, 0x47, 0x47, 0xd9, 0x5b, 0x5b, 0x5b, 0x38,
0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0xa5, 0xb2, 0x80, 0x80, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x47, 0x47, 0x6c, 0x1e, 0x1e, 0x1e, 0x78,
0xa7, 0xa7, 0xa7, 0xff, 0xa9, 0xa9, 0xa9, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x2f, 0x70, 0x70, 0x70, 0xdc,
0xac, 0xac, 0xac, 0xff, 0xa3, 0xa3, 0xa3, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x27, 0x27, 0x0d, 0x30, 0x30, 0x30, 0xaa,
0x96, 0x96, 0x96, 0xff, 0x69, 0x69, 0x69, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x54, 0x54, 0x40, 0xb6, 0xb6, 0xb6, 0xf1,
0x00, 0x00, 0x00, 0x00, 0x8c, 0x8c, 0x8c, 0xec, 0x33, 0x33, 0x33, 0x64, 0x1e, 0x1e, 0x1e, 0x11, 0x6a, 0x6a, 0x6a, 0x0c, 0x2a, 0x2a, 0x2a, 0x3c, 0x85, 0x85, 0x85, 0xa1, 0xbe, 0xbe, 0xbe, 0x79,
0x00, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x3b, 0x8a, 0x20, 0x20, 0x20, 0xea, 0x0f, 0x0f, 0x0f, 0xbb, 0x07, 0x07, 0x07, 0xb6, 0x4b, 0x4b, 0x4b, 0xe6, 0x80, 0x80, 0x80, 0xc1, 0x72, 0x72, 0x72, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x58, 0x58, 0x58, 0xff, 0x5f, 0x5f, 0x5f, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x66, 0x66, 0x66, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x02, 0x02, 0x02, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x68, 0x68, 0x68, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x02, 0x02, 0x02, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x5f, 0x5f, 0x5f, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x03, 0x03, 0x03, 0xff, 0x00, 0x00, 0x00, 0xff, 0x53, 0x53, 0x53, 0xff, 0x80, 0x80, 0x80, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x43, 0x43, 0x43, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x6f, 0x6f, 0xbd, 0xbe, 0xbe, 0xbe, 0xff, 0xb6, 0xb6, 0xb6, 0xff, 0xaf, 0xaf, 0xaf, 0xfb, 0xae, 0xae, 0xae, 0x2f, 0x00, 0x00, 0x00, 0x00,
#endif
};
const lv_img_dsc_t hour_hand = {
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 8,
.header.h = 75,
.data_size = 600 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.data = hour_hand_map,
};

View File

@ -58,6 +58,15 @@ static void date_time_cb(struct tm * const dateTime)
*dateTime = *tm;
}
static void alti_meas_cb(float * const temperature, float * const pressure, float * const altitude)
{
static float a = 425.5;
*temperature = (rand() % 20) + 10;
*pressure = (float)rand()/(float)(RAND_MAX) * 50 + 980;
a += 2;
*altitude = a;//(rand() % 700) + 10.2;
}
WatchFace_t watchFace;
MenuScreen_t menuScreen;
CompassScreen_t compassScreen;
@ -66,6 +75,7 @@ AltimeterScreen_t altimeterScreen;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{
srand(time(NULL));
/*Initialize LittlevGL*/
lv_init();
@ -89,11 +99,15 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
settings_screen_init(&settingsScreen);
altimeter_screen_init(&altimeterScreen);
altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb));
watch_face_register_date_time_cb(&watchFace, &(date_time_cb));
watch_face_create(&watchFace);
lv_scr_load(watchFace.display);
watch_face_set_step_count(&watchFace, 10258);
//settings_screen();
//watch_face();

View File

@ -81,8 +81,7 @@ static void menu_screen_add_item(lv_obj_t *scroll_item_container, uint8_t positi
//lv_obj_t *item_btn = lv_imgbtn_create(scroll_item_container);
lv_obj_t *item_btn = lv_img_create(scroll_item_container);
lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_pos(item_btn, 42, 52 * position);
//lv_imgbtn_set_src(item_btn, LV_IMGBTN_STATE_RELEASED, NULL, itemImg, NULL);
lv_img_set_src(item_btn, itemImg);

View File

@ -1,438 +0,0 @@
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_MINUTE_HAND
#define LV_ATTRIBUTE_IMG_MINUTE_HAND
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MINUTE_HAND uint8_t minute_hand_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0x49, 0xff, 0x6e, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xb7, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x49, 0xff, 0x6d, 0xff, 0x92, 0xff, 0x00, 0x00,
0x00, 0x00, 0x49, 0xff, 0x49, 0x72, 0x00, 0x00, 0x00, 0x00, 0x25, 0xe7, 0xb6, 0xc7,
0x49, 0xee, 0x49, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff,
0x49, 0xff, 0x92, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x49,
0x49, 0xff, 0x92, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xff,
0x00, 0x00, 0x49, 0xff, 0x49, 0x09, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x10, 0xdb, 0xfb,
0x00, 0x00, 0x49, 0x2a, 0x24, 0xff, 0x00, 0xf7, 0x00, 0xf7, 0x49, 0xff, 0xb7, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x24, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x24, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x92, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0xb6, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x52, 0xff, 0x69, 0x4a, 0xff, 0x4d, 0x6b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xc7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0x18, 0xc6, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0xba, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x69, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x69, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xaa, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6d, 0x6b, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xae, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x9a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcf, 0x7b, 0xff, 0x39, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x75, 0xad, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xff, 0x6a, 0x52, 0xff, 0xab, 0x5a, 0xff, 0x8e, 0x73, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x42, 0xff, 0x49, 0x4a, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x31, 0xe7, 0xb2, 0x94, 0xc7,
0x49, 0x4a, 0xee, 0x69, 0x4a, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x39, 0xff,
0x6a, 0x52, 0xff, 0xef, 0x7b, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x31, 0x49,
0x28, 0x42, 0xff, 0xef, 0x7b, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x7b, 0xff,
0x00, 0x00, 0x00, 0xc7, 0x39, 0xff, 0xc7, 0x39, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x52, 0x10, 0xf8, 0xc5, 0xfb,
0x00, 0x00, 0x00, 0x8a, 0x52, 0x2a, 0xc3, 0x18, 0xff, 0x41, 0x08, 0xf7, 0x41, 0x08, 0xf7, 0xa6, 0x31, 0xff, 0x35, 0xad, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0xe3, 0x18, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x20, 0x00, 0xff, 0x82, 0x10, 0xff, 0xe3, 0x18, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x72, 0x94, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x6b, 0xff, 0xb3, 0x9c, 0xff, 0x71, 0x8c, 0xff, 0xf7, 0xbd, 0xff, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xaa, 0xff, 0x4a, 0x69, 0xff, 0x6b, 0x4d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xc7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xe3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc6, 0x18, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xd6, 0xba, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x69, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x69, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x6a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x6a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0xaa, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x2c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x2c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x6d, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0xae, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x9a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x7b, 0xcf, 0xff, 0xce, 0x39, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xad, 0x75, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xff, 0x52, 0x6a, 0xff, 0x5a, 0xab, 0xff, 0x73, 0x8e, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x08, 0xff, 0x4a, 0x49, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x86, 0xe7, 0x94, 0xb2, 0xc7,
0x4a, 0x49, 0xee, 0x4a, 0x69, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc7, 0xff,
0x52, 0x6a, 0xff, 0x7b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x66, 0x49,
0x42, 0x28, 0xff, 0x7b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xef, 0xff,
0x00, 0x00, 0x00, 0x39, 0xc7, 0xff, 0x39, 0xc7, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x8a, 0x10, 0xc5, 0xf8, 0xfb,
0x00, 0x00, 0x00, 0x52, 0x8a, 0x2a, 0x18, 0xc3, 0xff, 0x08, 0x41, 0xf7, 0x08, 0x41, 0xf7, 0x31, 0xa6, 0xff, 0xad, 0x35, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x18, 0xe3, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x20, 0xff, 0x10, 0x82, 0xff, 0x18, 0xe3, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x94, 0x72, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x4d, 0xff, 0x9c, 0xb3, 0xff, 0x8c, 0x71, 0xff, 0xbd, 0xf7, 0xff, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x53, 0xff, 0x4a, 0x4a, 0x4a, 0xff, 0x68, 0x68, 0x68, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3a, 0x3a, 0x3a, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x39, 0x39, 0x39, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3a, 0x3a, 0x3a, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3e, 0x3e, 0x3e, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x3f, 0x3f, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x3f, 0x3f, 0xff, 0xce, 0xce, 0xce, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x41, 0x41, 0x41, 0xff, 0xce, 0xce, 0xce, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x41, 0x41, 0x41, 0xff, 0xce, 0xce, 0xce, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x42, 0x42, 0x42, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x42, 0x42, 0x42, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x43, 0x43, 0x43, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x44, 0x44, 0x44, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x44, 0x44, 0x44, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbe, 0xbe, 0xbe, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x46, 0x46, 0x46, 0xff, 0xd2, 0xd2, 0xd2, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x47, 0x47, 0x47, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xb7, 0xb7, 0xb7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x49, 0x49, 0x49, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4a, 0x4a, 0x4a, 0xff, 0xc7, 0xc7, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4b, 0x4b, 0x4b, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4d, 0x4d, 0x4d, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x50, 0x50, 0x50, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x53, 0x53, 0x53, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x54, 0x54, 0x54, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x55, 0x55, 0x55, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x55, 0x55, 0x55, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x58, 0x58, 0x58, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x59, 0x59, 0x59, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5a, 0x5a, 0x5a, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5d, 0x5d, 0x5d, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5d, 0x5d, 0x5d, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5e, 0x5e, 0x5e, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5f, 0x5f, 0x5f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5f, 0x5f, 0x5f, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x60, 0x60, 0x60, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x62, 0x62, 0x62, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x63, 0x63, 0x63, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x64, 0x64, 0x64, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x65, 0x65, 0x65, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x65, 0x65, 0x65, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x67, 0x67, 0x67, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x67, 0x67, 0x67, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x69, 0x69, 0x69, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6a, 0x6a, 0x6a, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6c, 0x6c, 0x6c, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x70, 0x70, 0x70, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x70, 0x70, 0x70, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x71, 0x71, 0x71, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x72, 0x72, 0x72, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x71, 0x71, 0x71, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x01, 0x01, 0x01, 0xff, 0x77, 0x77, 0x77, 0xff, 0xc4, 0xc4, 0xc4, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0xff, 0x4d, 0x4d, 0x4d, 0xff, 0x54, 0x54, 0x54, 0xff, 0x70, 0x70, 0x70, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0xff, 0x48, 0x48, 0x48, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x2e, 0xe7, 0x93, 0x93, 0x93, 0xc7,
0x46, 0x46, 0x46, 0xee, 0x4a, 0x4a, 0x4a, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x39, 0xff,
0x4d, 0x4d, 0x4d, 0xff, 0x7a, 0x7a, 0x7a, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x49,
0x42, 0x42, 0x42, 0xff, 0x7a, 0x7a, 0x7a, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b, 0x7b, 0xff,
0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x39, 0xff, 0x39, 0x39, 0x39, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0x10, 0xbc, 0xbc, 0xbc, 0xfb,
0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x2a, 0x18, 0x18, 0x18, 0xff, 0x09, 0x09, 0x09, 0xf7, 0x07, 0x07, 0x07, 0xf7, 0x32, 0x32, 0x32, 0xff, 0xa4, 0xa4, 0xa4, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x10, 0x10, 0x10, 0xff, 0x1b, 0x1b, 0x1b, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0e, 0x0e, 0x0e, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0e, 0x0e, 0x0e, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x02, 0x02, 0x02, 0xff, 0x10, 0x10, 0x10, 0xff, 0x1b, 0x1b, 0x1b, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x8c, 0x8c, 0x8c, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x68, 0x68, 0xff, 0x94, 0x94, 0x94, 0xff, 0x8b, 0x8b, 0x8b, 0xff, 0xba, 0xba, 0xba, 0xff, 0x00, 0x00, 0x00, 0x00,
#endif
};
const lv_img_dsc_t minute_hand = {
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 7,
.header.h = 100,
.data_size = 700 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.data = minute_hand_map,
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

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