mirror of
https://github.com/pelgraine/Meck.git
synced 2026-05-11 12:00:10 +02:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6360a167c5 | |||
| ca5283af4f | |||
| b42291c5fc | |||
| 8f0d961048 | |||
| 27e8b8422b | |||
| b57e000496 | |||
| f449385e8f | |||
| 31ac732f08 | |||
| 46413b9858 | |||
| ce6acdfd34 | |||
| 81b3cd2591 | |||
| 5c275a8c23 | |||
| b536e24f8e | |||
| 5b38b713da | |||
| 3e6bcfb031 | |||
| 49f1d91c15 | |||
| 8e3a09e3b1 | |||
| 1c4d5a0daa | |||
| df6c977ee4 | |||
| 7e9e69dd67 | |||
| 6d7fd54b83 | |||
| d2ce070a3f | |||
| 44b68c40af | |||
| a4e8c31a16 | |||
| 8d69b69e1f | |||
| 0c032429eb | |||
| c578dcadc8 | |||
| ec42ac73a8 | |||
| aacf8c777f | |||
| 570776478c | |||
| 4c654c99c6 | |||
| f436f5ba50 | |||
| 0252204d73 | |||
| 9c4c4d2e03 | |||
| 595f0073f9 | |||
| 8aa0f0388e | |||
| b070af39cc | |||
| c939aa577b | |||
| abccfe154e | |||
| 23733ca555 | |||
| 9d45ac52eb | |||
| 424e152d4b |
@@ -15,6 +15,7 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f
|
||||
- [Launcher](#launcher)
|
||||
- [OTA Firmware Update](#ota-firmware-update-v13)
|
||||
- [Path Hash Mode (v0.9.9+)](#path-hash-mode-v099)
|
||||
- [Region Scope (v1.7+)](#region-scope-v17)
|
||||
- [T-Deck Pro](#t-deck-pro)
|
||||
- [Build Variants](#t-deck-pro-build-variants)
|
||||
- [Keyboard Controls](#t-deck-pro-keyboard-controls)
|
||||
@@ -23,11 +24,13 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f
|
||||
- [WiFi Companion](#wifi-companion)
|
||||
- [Clock & Timezone](#clock--timezone)
|
||||
- [Channel Message Screen](#channel-message-screen)
|
||||
- [Channel Picker](#channel-picker)
|
||||
- [Contacts Screen](#contacts-screen)
|
||||
- [Sending a Direct Message](#sending-a-direct-message)
|
||||
- [Roomservers](#roomservers)
|
||||
- [Repeater Admin Screen](#repeater-admin-screen)
|
||||
- [Settings Screen](#settings-screen)
|
||||
- [Font Styles](#font-styles)
|
||||
- [Compose Mode](#compose-mode)
|
||||
- [Symbol Entry (Sym Key)](#symbol-entry-sym-key)
|
||||
- [Emoji Picker](#emoji-picker)
|
||||
@@ -35,14 +38,9 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f
|
||||
- [Web Browser & IRC](#web-browser--irc)
|
||||
- [Alarm Clock (Audio only)](#alarm-clock-audio-only)
|
||||
- [Voice Notes Over LoRa (Audio only)](#voice-notes-over-lora-audio-only)
|
||||
- [Contact Management — Select, Export & Import](#contact-management--select-export--import)
|
||||
- [Lock Screen (T-Deck Pro)](#lock-screen-t-deck-pro)
|
||||
- [Remote Repeater (T-Deck Pro 4G)](#remote-repeater-t-deck-pro-4g)
|
||||
- [Remote Repeater Build Variant](#remote-repeater-build-variant)
|
||||
- [Setting Up HiveMQ Cloud (Free MQTT Broker)](#setting-up-hivemq-cloud-free-mqtt-broker)
|
||||
- [SD Card Configuration](#remote-repeater-sd-card-configuration)
|
||||
- [Deploying the Remote Repeater](#deploying-the-remote-repeater)
|
||||
- [Remote Dashboard (Meck-Mycelium)](#remote-dashboard-meck-mycelium)
|
||||
- [WiFi Repeater](#wifi-repeater)
|
||||
- [T5S3 E-Paper Pro](#t5s3-e-paper-pro)
|
||||
- [Build Variants](#t5s3-build-variants)
|
||||
- [Touch Navigation](#touch-navigation)
|
||||
@@ -58,6 +56,7 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f
|
||||
- [Text & EPUB Reader](TXT___EPUB_Reader_Guide.md)
|
||||
- [Web Browser & IRC Guide](Web_App_Guide.md)
|
||||
- [SMS & Phone App Guide](SMS___Phone_App_Guide.md)
|
||||
- [Audiobook Player Guide](Audiobook_Player_Guide.md)
|
||||
- [Meck-Mycelium Web App](#meck-mycelium-web-app)
|
||||
- [About MeshCore](#about-meshcore)
|
||||
- [What is MeshCore?](#what-is-meshcore)
|
||||
@@ -76,14 +75,16 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f
|
||||
|
||||
## Supported Devices
|
||||
|
||||
Meck currently targets two LilyGo devices:
|
||||
Meck currently targets two LilyGo devices and also supports the Heltec V3 and V4 as remote repeaters:
|
||||
|
||||
| Device | Display | Input | LoRa | Battery | GPS | RTC |
|
||||
|--------|---------|-------|------|---------|-----|-----|
|
||||
| **T-Deck Pro** | 240×320 e-ink (GxEPD2) | TCA8418 keyboard + optional touch | SX1262 | BQ27220 fuel gauge, 1400 mAh | Yes | No (uses GPS time) |
|
||||
| **T5S3 E-Paper Pro** (V2, H752-B) | 960×540 e-ink (FastEPD, parallel) | GT911 capacitive touch (no keyboard) | SX1262 | BQ27220 fuel gauge, 1500 mAh | No (non-GPS variant) | Yes (PCF8563 hardware RTC) |
|
||||
| **Heltec V3** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No |
|
||||
| **Heltec V4** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No |
|
||||
|
||||
Both devices use the ESP32-S3 with 16 MB flash and 8 MB PSRAM.
|
||||
The T-Deck Pro and T5S3 use the ESP32-S3 with 16 MB flash and 8 MB PSRAM. The Heltec V3 and V4 use the ESP32-S3 with 8 MB flash and 8 MB PSRAM.
|
||||
|
||||
---
|
||||
|
||||
@@ -91,7 +92,7 @@ Both devices use the ESP32-S3 with 16 MB flash and 8 MB PSRAM.
|
||||
|
||||
**An SD card is essential for Meck to function properly.** Many features — including the e-book reader, notes, bookmarks, web reader cache, audiobook playback, firmware updates, contact import/export, and WiFi credential storage — rely on files stored on the SD card. Without an SD card inserted, the device will boot and handle mesh messaging, but most extended features will be unavailable or will fail silently.
|
||||
|
||||
**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. MeshCore users have found that **SanDisk** microSD cards are the most reliable across both the T-Deck Pro and T5S3.
|
||||
**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. Meck's extensive feature set — audiobooks, e-books, voice recordings, contact exports, alarm sounds, web reader cache, notes, and firmware images — can accumulate significant storage over time, so a larger card is worthwhile. MeshCore users have found that **SanDisk** microSD cards are the most reliable across both the T-Deck Pro and T5S3.
|
||||
|
||||
---
|
||||
|
||||
@@ -184,21 +185,38 @@ For a detailed explanation of what multibyte path hash means and why it matters,
|
||||
|
||||
---
|
||||
|
||||
## Region Scope (v1.7+)
|
||||
|
||||
Regions limit how far your flood messages propagate through the mesh. When you set a region, outgoing messages are tagged with a transport code that repeaters use to decide whether to forward them. Messages sent without a region reach all repeaters via the default wildcard, same as always.
|
||||
|
||||
Meck does not pre-set any region on a fresh flash. Region names are determined by your local mesh community — check with your local group for the names in use. Common patterns follow ISO 3166 country/subdivision codes (e.g. `au` for Australia, `gb-eng` for England, `us-ca` for California), but communities may also use custom names for their area. Region names must be lowercase alphanumeric characters and hyphens only, max 29 characters.
|
||||
|
||||
**Device-wide default region:** Set in **Settings → Default Region**. This applies to all channels and DMs unless a channel has its own override.
|
||||
|
||||
**Per-channel region:** In Settings → Channels, select a channel and press Enter to edit its region scope. This overrides the device default for that specific channel only.
|
||||
|
||||
**Settings nudge:** When exiting settings, if no region is configured anywhere (no device default and no per-channel scopes), a prompt reminds you to consider setting one. You can dismiss it to stay unscoped.
|
||||
|
||||
Region scope can also be configured via serial commands — see the [Serial Settings Guide](Serial_Settings_Guide.md) for `set region`, `get region`, `set channel.scope`, and `get channel.scope` commands.
|
||||
|
||||
---
|
||||
|
||||
## T-Deck Pro
|
||||
|
||||
### T-Deck Pro Build Variants
|
||||
|
||||
| Variant | Environment | BLE | WiFi | 4G Modem | Audio DAC | Web Reader | Max Contacts |
|
||||
|---------|------------|-----|------|----------|-----------|------------|-------------|
|
||||
| Audio + BLE | `meck_audio_ble` | Yes | Yes (via BLE stack) | — | PCM5102A | Yes | 500 |
|
||||
| Audio + WiFi | `meck_audio_wifi` | — | Yes (TCP:5000) | — | PCM5102A | Yes | 1,500 |
|
||||
| Audio + Standalone | `meck_audio_standalone` | — | — | — | PCM5102A | No | 1,500 |
|
||||
| 4G + BLE | `meck_4g_ble` | Yes | Yes | A7682E | — | Yes | 500 |
|
||||
| 4G + WiFi | `meck_4g_wifi` | — | Yes (TCP:5000) | A7682E | — | Yes | 1,500 |
|
||||
| 4G + Standalone | `meck_4g_standalone` | — | Yes | A7682E | — | Yes | 1,500 |
|
||||
| Audio + BLE | `meck_audio_ble` | Yes | Yes (web reader only) | — | PCM5102A | Yes | 2,000 |
|
||||
| Audio + WiFi | `meck_audio_wifi` | — | Yes (TCP:5000) | — | PCM5102A | Yes | 2,000 |
|
||||
| Audio + Standalone | `meck_audio_standalone` | — | — | — | PCM5102A | No | 2,000 |
|
||||
| 4G + BLE | `meck_4g_ble` | Yes | Yes | A7682E | — | Yes | 2,000 |
|
||||
| 4G + WiFi | `meck_4g_wifi` | — | Yes (TCP:5000) | A7682E | — | Yes | 2,000 |
|
||||
| 4G + Standalone | `meck_4g_standalone` | — | Yes | A7682E | — | Yes | 2,000 |
|
||||
| Remote Repeater (4G) | `meck_remote_repeater` | — | — | A7682E (MQTT) | — | No | — |
|
||||
| WiFi Repeater | `meck_wifi_repeater` | — | Yes (MQTT) | — | — | No | — |
|
||||
|
||||
The audio DAC and 4G modem occupy the same hardware slot and are mutually exclusive. The remote repeater variant operates as a dedicated MeshCore repeater with cellular MQTT management — see [Remote Repeater](#remote-repeater-t-deck-pro-4g) below.
|
||||
The audio DAC and 4G modem occupy the same hardware slot and are mutually exclusive. The remote repeater and WiFi repeater variants operate as dedicated MeshCore repeaters — they forward mesh traffic and respond to guest logins as normal, but **admin management is handled remotely via MQTT** through the [Meck-Mycelium dashboard](https://pelgraine.github.io/Meck-Mycelium), not via the standard mesh admin password login. See [Remote Repeater](#remote-repeater-t-deck-pro-4g) and [WiFi Repeater](#wifi-repeater) below.
|
||||
|
||||
### T-Deck Pro Keyboard Controls
|
||||
|
||||
@@ -220,10 +238,10 @@ The T-Deck Pro firmware includes full keyboard support for standalone messaging
|
||||
| T | Open SMS & Phone app (4G variant only) |
|
||||
| P | Open audiobook player (audio variant only) |
|
||||
| K | Open alarm clock (audio variant only) |
|
||||
| Mic (0) | Open voice messages (audio variant only) |
|
||||
| F | Open node discovery (search for nearby repeaters/nodes) |
|
||||
| H | Open last heard list (passive advert history) |
|
||||
| G | Open map screen (shows contacts with GPS positions) |
|
||||
| Mic | Open voice messages (audio variant only) |
|
||||
| Q | Back to home screen |
|
||||
| Double-click Boot | Lock / unlock screen |
|
||||
|
||||
@@ -248,8 +266,6 @@ Connect the MeshCore web app or meshcore.js to `<device IP>:5000`.
|
||||
|
||||
WiFi is also used by the web reader and IRC client on WiFi variants. The web reader shares the same connection — no extra setup needed.
|
||||
|
||||
> **Tip:** WiFi variants support up to 1,500 contacts (vs 500 for BLE variants) because they are not constrained by the BLE protocol ceiling.
|
||||
|
||||
### Clock & Timezone
|
||||
|
||||
The T-Deck Pro does not include a dedicated RTC chip, so after each reboot the device clock starts unset. The clock will appear in the nav bar (between node name and battery) once the time has been synced by one of these methods:
|
||||
@@ -277,30 +293,99 @@ The GPS page also shows the current time, satellite count, position, altitude, a
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| W / S | Scroll messages up/down |
|
||||
| A / D | Switch between channels (press D past the last channel to reach the DM inbox, A to return) |
|
||||
| A / D | Open channel picker — shows all channels and DM inbox with unread badges. Select a channel and press Enter to switch. |
|
||||
| Enter | Compose new message |
|
||||
| R | Reply to a message — enter reply select mode, scroll to a message with W/S, then press Enter to compose a reply with an @mention |
|
||||
| V | View relay path of the last received message (scrollable, up to 20 hops) |
|
||||
| Q | Back to channel picker |
|
||||
|
||||
### Channel Picker
|
||||
|
||||
Pressing **A** or **D** on the channel messages screen opens the channel picker. All your channels and the DM inbox are shown in a single view with unread message badges, letting you jump directly to any channel instead of cycling through them one at a time.
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| W / S | Navigate up / down |
|
||||
| Enter | Switch to selected channel |
|
||||
| Q | Back to home screen |
|
||||
|
||||
On the T5S3, swiping left or right on the channel messages screen also opens the channel picker, which displays a **vertical bubble list** matching the Meck P4 aesthetic.
|
||||
|
||||
### Contacts Screen
|
||||
|
||||
Press **C** from the home screen to open the contacts list. All known mesh contacts are shown sorted by most recently seen, with their type (Chat, Repeater, Room, Sensor), hop count, and time since last advert.
|
||||
Press **C** from the home screen to open the contacts list. All known mesh contacts are shown sorted by most recently heard, with their type prefix, estimated hop count, and time since last advert.
|
||||
|
||||
**Contact type prefixes**
|
||||
|
||||
| Prefix | Type |
|
||||
|--------|------|
|
||||
| C | Chat node |
|
||||
| R | Repeater |
|
||||
| RS | Room server |
|
||||
| ? | Unknown / sensor |
|
||||
|
||||
**Hop count display**
|
||||
|
||||
| Display | Meaning |
|
||||
|---------|---------|
|
||||
| `D` | Direct path known (path exchange completed) |
|
||||
| `D*` | Direct path, manually locked |
|
||||
| `N` | N-hop path known (e.g. `2` = 2 hops) |
|
||||
| `N*` | N-hop path, manually locked |
|
||||
| `~D` | Heard direct via flood advert (no path exchange yet) |
|
||||
| `~N` | Estimated N hops via flood advert |
|
||||
| `?` | No path information available |
|
||||
|
||||
Flood-based hop estimates (`~D`, `~N`) are drawn from a cache of up to 1,000 recently heard adverts and reset to `?` on reboot until each contact re-advertises. Confirmed path values (`D`, `N`) persist until overwritten by a new path exchange.
|
||||
|
||||
**Normal mode controls**
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| W / S | Scroll up / down through contacts |
|
||||
| A / D | Cycle filter: All → Chat → Repeater → Room → Sensor → Favourites |
|
||||
| Enter | Open DM compose (Chat contact) or repeater admin (Repeater contact) |
|
||||
| Long-press Enter | Enter select mode (see [Contact Management](#contact-management--select-export--import)) |
|
||||
| P | Open Path Editor for selected contact (set direct or multi-hop path) |
|
||||
| X | Export contacts to SD card — exports selected contacts if in select mode, or all contacts otherwise |
|
||||
| R | Import contacts from SD card (auto-selects most recent export by timestamp) |
|
||||
| A / D | Cycle filter: All → Chat → Rptr → Room → Sens → Fav |
|
||||
| Enter | Enter select mode (highlights current contact, enables batch operations) |
|
||||
| P | Open path editor for the highlighted contact |
|
||||
| Q | Back to home screen |
|
||||
|
||||
**Contact limits:** Standalone and WiFi variants support up to 1,500 contacts (stored in PSRAM). BLE variants (Audio-BLE and 4G-BLE) are limited to 500 contacts due to BLE protocol constraints.
|
||||
> **Note:** The **Fav** filter shows only contacts you have marked as favourites. If it appears empty, no contacts have been favourited yet — use select mode (Enter) and then **F** to mark contacts.
|
||||
|
||||
For detailed documentation on select mode, bulk operations, export format, and companion app interoperability, see [Contact Management — Select, Export & Import](#contact-management--select-export--import).
|
||||
**Select mode** — press Enter from the contacts list to enter select mode. The highlighted contact is pre-selected. Use W/S to scroll and Enter to toggle selection on any row.
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| W / S | Scroll up / down |
|
||||
| Enter | Toggle selection on current contact |
|
||||
| A | Select all contacts in current filter |
|
||||
| D | Deselect all |
|
||||
| F | Toggle favourite on all selected contacts |
|
||||
| X | Export selected contacts to SD card |
|
||||
| Backspace | Delete selected contacts |
|
||||
| Q | Exit select mode |
|
||||
|
||||
**Adding contacts**
|
||||
|
||||
Contacts can be added three ways:
|
||||
|
||||
1. **Automatic** — if Settings → Contacts → Add Mode is set to *Auto All*, any node whose advert is heard is added automatically. *Custom* mode adds only nodes matching the enabled type toggles (Companion, Repeater, Room Server, Sensor) — each toggle controls whether receiving an advert of that type triggers an auto-add. *Manual Only* disables all auto-add.
|
||||
|
||||
2. **From the Last Heard screen** — press **H** from the home screen to open the last-heard advert list. Scroll to the node you want and press **Enter** (or tap the row) to add it to contacts. Press **Enter** again on an existing contact to remove it (favourites require a second press within 3 seconds to confirm). Entries show `[+]` if already in contacts, `[★]` if a favourite.
|
||||
|
||||
> **Note:** The Last Heard list holds up to 1,000 entries in PSRAM, and advert data is stored persistently on the SD card — so contacts can be added long after the original advertisement was received, even across reboots. This makes Last Heard especially useful when auto-add is set to *Manual Only*, as it provides a passive catalogue of every node heard on the network.
|
||||
|
||||
3. **From the Discovery screen** — press **F** from the home screen to run an active discovery scan. Nodes that respond appear in a list; press **Enter** on any entry to add it to contacts.
|
||||
|
||||
**Deleting contacts**
|
||||
|
||||
Enter select mode (Enter), select the contacts to remove (Enter to toggle, A to select all), then press **Backspace** to delete. You will be returned to the contacts list once the deletion is complete.
|
||||
|
||||
**Exporting and importing contacts**
|
||||
|
||||
In select mode, press **X** to export. If contacts are selected, only those contacts are exported; if none are selected, all contacts are exported. Contacts are saved as a JSON file to `/meshcore/` on the SD card with a timestamp in the filename. The JSON format is compatible with MeshCore companion apps — you can copy the file from the SD card and import it into the Android, iOS, or web companion app.
|
||||
|
||||
Press **R** on the contacts list (outside select mode) to import contacts from a JSON file on the SD card. The most recent export file in `/meshcore/` is used automatically.
|
||||
|
||||
**Contact limits:** All variants support up to 2,000 contacts (stored in PSRAM).
|
||||
|
||||
### Sending a Direct Message
|
||||
|
||||
@@ -308,7 +393,7 @@ Select a **Chat** contact in the contacts list and press **Enter** to start comp
|
||||
|
||||
Contacts with unread direct messages show a `*` marker next to their name in the contacts list.
|
||||
|
||||
**Reading received DMs:** On the Channel Messages screen, press **D** past the last group channel to reach the **DM inbox**. This shows all received direct messages with sender name and timestamp. Entering the DM inbox marks all DM messages as read and clears the unread indicator. Press **A** to return to group channels.
|
||||
**Reading received DMs:** On the Channel Messages screen, press **A** or **D** to open the channel picker, then select the **DM Inbox** entry to view received direct messages. This shows all received direct messages with sender name and timestamp. Entering the DM inbox marks all DM messages as read and clears the unread indicator.
|
||||
|
||||
### Roomservers
|
||||
|
||||
@@ -366,16 +451,29 @@ Press **S** from the home screen to open settings. On first boot (when the devic
|
||||
| Msg Rcvd LED Pulse | Toggle keyboard backlight flash on new message (Enter to toggle) |
|
||||
| GPS Baud Rate | A / D to cycle (Default 38400 / 4800 / 9600 / 19200 / 38400 / 57600 / 115200), Enter to confirm. **Requires reboot to take effect.** |
|
||||
| Path Hash Mode | W / S to cycle (1-byte / 2-byte / 3-byte), Enter to confirm |
|
||||
| Default Region | Text entry — type a region name (e.g. `au-nsw`), Enter to confirm. Empty = unscoped. See [Region Scope](#region-scope-v17). |
|
||||
| Dark Mode | Toggle inverted display — white text on black background (Enter to toggle) |
|
||||
| Larger Font | Toggle larger text size on channel messages, contacts, DM inbox, and repeater admin screens (Enter to toggle) |
|
||||
| Font Style | A / D to cycle styles (Classic / Noto Sans / Montserrat), Enter to apply. See [Font Styles](#font-styles). |
|
||||
| Auto Lock | A / D to cycle timeout (None / 2 / 5 / 10 / 15 / 30 min), Enter to confirm |
|
||||
| Contacts >> | Opens the Contacts sub-screen (see below) |
|
||||
| Channels >> | Opens the Channels sub-screen (see below) |
|
||||
| OTA Tools >> | Opens the OTA sub-screen — Firmware Update and SD File Manager (see [OTA Firmware Update](#ota-firmware-update-v13)) |
|
||||
| Device Info | Public key and firmware version (read-only) |
|
||||
|
||||
**Contacts sub-screen** — press Enter on the `Contacts >>` row to open. Contains the contact auto-add mode picker (Auto All / Custom / Manual) and, when set to Custom, per-type toggles for Chat, Repeater, Room Server, Sensor, and an Overwrite Oldest option. Press Q to return to the top-level settings list.
|
||||
**Contacts sub-screen** — press Enter on the `Contacts >>` row to open. Contains the contact auto-add mode picker and, when set to Custom, per-type toggles:
|
||||
|
||||
**Channels sub-screen** — press Enter on the `Channels >>` row to open. Lists all current channels, with an option to add hashtag channels or delete non-primary channels (X). Press Q to return to the top-level settings list.
|
||||
| Toggle | Meaning when ON |
|
||||
|--------|----------------|
|
||||
| Companion | Auto-add a chat node when its advert is heard |
|
||||
| Repeater | Auto-add repeaters heard via advert |
|
||||
| Room Server | Auto-add room servers heard via advert |
|
||||
| Sensor | Auto-add sensor nodes heard via advert |
|
||||
| Overwrite Oldest | When the contact list is full, overwrite the oldest non-favourite entry instead of discarding the new contact |
|
||||
|
||||
Press Q to return to the top-level settings list.
|
||||
|
||||
**Channels sub-screen** — press Enter on the `Channels >>` row to open. Lists all current channels with their region scope tags (e.g. `[au-nsw]` or `[*]` for device default). Press Enter on a channel to edit its region scope. Press X to delete non-primary channels. Press Q to return to the top-level settings list.
|
||||
|
||||
The top-level settings screen also displays your node ID and firmware version. On the 4G variant, IMEI, carrier name, and APN details are shown here as well.
|
||||
|
||||
@@ -385,6 +483,14 @@ If you've changed radio parameters, pressing Q will prompt you to apply changes
|
||||
|
||||
> **Tip:** All device settings (plus mesh tuning parameters not available on-screen) can also be configured via USB serial. See the [Serial Settings Guide](Serial_Settings_Guide.md) for complete documentation.
|
||||
|
||||
### Font Styles
|
||||
|
||||
Meck supports three font styles across the entire UI: **Classic** (the original FreeSans look), **Noto Sans** (clean, excellent Latin Extended coverage), and **Montserrat** (geometric, distinctive).
|
||||
|
||||
Change the font in **Settings → Font** — use A/D to cycle with a live preview, then Enter to apply. Press Q to cancel and revert. The selected style applies to all screens including channel messages, contacts, settings, and the e-reader.
|
||||
|
||||
Font styles are available in both Tiny and Larger text size modes. Custom fonts at Tiny size use 7pt glyphs; at Larger size, 9pt — matching the existing FreeSans layout. The font preference is saved and persists across reboots.
|
||||
|
||||
### Compose Mode
|
||||
|
||||
| Key | Action |
|
||||
@@ -421,7 +527,7 @@ Press the **Sym** key then the letter key to enter numbers and symbols:
|
||||
|
||||
### Emoji Picker
|
||||
|
||||
While in compose mode, press the **$** key to open the emoji picker. A scrollable grid of 47 emoji is displayed in a 5-column layout.
|
||||
While in compose mode, press the **$** key to open the emoji picker. A scrollable grid of 76 emoji is displayed in a 5-column layout, with faces and emotions grouped first. Scrolling wraps around — pressing W on the first row goes to the last row and vice versa.
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
@@ -503,14 +609,12 @@ Record and send voice messages of up to 12 seconds over LoRa. Audio is encoded o
|
||||
|
||||
Voice notes can be sent to another T-Deck Pro Audio device (plays automatically through the headphone jack) or to any MeshCore companion device connected to the [Meck-Mycelium web app](https://pelgraine.github.io/Meck-Mycelium) (plays through your phone's speaker as a tappable bubble in the DM view).
|
||||
|
||||
**Before sending, your contact must have a path set.** Go to Contacts (press **C**), select your contact, and press **P** to open the Path Editor. Set a direct (zero-hop) or multi-hop path and save.
|
||||
|
||||
**Sending a voice note:**
|
||||
|
||||
1. Press the **Microphone key** to open the Voice Messages screen
|
||||
2. Press and **hold** the Microphone key to record — release to stop (max 12 seconds)
|
||||
3. Press **S** to open the contact picker — contacts with a direct path appear at the top
|
||||
4. Tap or scroll to your contact, then press **Enter** to send
|
||||
4. Scroll to your contact and press **Enter** to send
|
||||
|
||||
Packets are sent with staggered 3-second delays to avoid congesting the channel. On a 62.5 kHz / SF7 radio preset (e.g. Australia Narrow), a 5-second voice note arrives in roughly 20 seconds and a 12-second recording in about 42 seconds.
|
||||
|
||||
@@ -519,30 +623,15 @@ Packets are sent with staggered 3-second delays to avoid congesting the channel.
|
||||
* **On a T-Deck Pro Audio device:** the voice message screen opens automatically and the message plays through the headphone jack. **Headphones are recommended** — the built-in speaker is very quiet.
|
||||
* **Via Meck-Mycelium:** voice messages appear as "🎙️ Voice message" bubbles in the DM view. Tap to play. Codec2 decoding happens entirely in the browser via WebAssembly.
|
||||
|
||||
> **Note:** Voice recording and sending requires the **Audio variant** hardware (PCM5102A DAC). 4G and standalone variants cannot record or send voice notes, but any device connected to Meck-Mycelium can receive and play them.
|
||||
> **Note:** Voice recording and sending requires the **Audio variant** hardware (PCM5102A DAC). Receiving and playback works on all Audio variants. Non-audio Meck devices can receive and relay voice packets but cannot play them locally — use the Meck-Mycelium web app for playback on those devices.
|
||||
|
||||
### Contact Management — Select, Export & Import
|
||||
|
||||
The contacts screen supports a **select mode** for fine-grained contact management, as well as full export and import with MeshCore companion app compatibility.
|
||||
|
||||
**Select mode (T-Deck Pro):** Long-press **Enter** on the Contacts screen to enter select mode. Use **W / S** to scroll and press **Enter** to toggle selection on individual contacts.
|
||||
|
||||
**Select mode (T5S3):** Long-press the screen on the Contacts screen to enter select mode. Tap individual contacts to toggle their selection.
|
||||
|
||||
| Action | T-Deck Pro | T5S3 |
|
||||
|--------|-----------|------|
|
||||
| Enter select mode | Long-press Enter | Long-press screen |
|
||||
| Toggle selection | Enter | Tap |
|
||||
| Export selected | X | — |
|
||||
| Bulk delete selected | Shift+Del (double-confirm) | — |
|
||||
| Toggle favourite | F | — |
|
||||
| Exit select mode | Q | Boot button |
|
||||
|
||||
**Exporting contacts:** Press **X** to export. If contacts are selected in select mode, only those contacts are exported. If no contacts are selected (pressing **X** outside select mode), all contacts are exported. Contacts are saved as a JSON file to `/meshcore/meshcore_contacts.json` on the SD card with a timestamp in the filename. The JSON format is compatible with MeshCore companion apps — you can transfer the file to your phone or computer and import it into the Android, iOS, or web companion app.
|
||||
|
||||
**Importing contacts:** Press **R** on the Contacts screen (outside select mode) to import. The importer automatically finds the most recent export file by looking at the timestamp in the filename. Import is a non-destructive merge — new contacts are added without removing existing ones.
|
||||
|
||||
**Viewing and transferring exports:** Browse and download your exported JSON files using **OTA Tools → SD File Manager** (Settings → OTA Tools → SD File Manager — connects via WiFi AP and browser), or remove the SD card and copy the files directly.
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| Mic (hold) | Record voice note |
|
||||
| Mic (release) | Stop recording |
|
||||
| S | Open contact picker to send |
|
||||
| Enter | Send to selected contact |
|
||||
| Q | Back to home screen |
|
||||
|
||||
### Lock Screen (T-Deck Pro)
|
||||
|
||||
@@ -556,90 +645,42 @@ An auto-lock timer can be configured in **Settings → Auto Lock** (None / 2 / 5
|
||||
|
||||
## Remote Repeater (T-Deck Pro 4G)
|
||||
|
||||
The remote repeater firmware turns a T-Deck Pro 4G into a self-contained MeshCore repeater with remote management over the internet. Insert an active SIM card with a data plan, configure your MQTT broker credentials on the SD card, and you can log in and manage the repeater from anywhere in the world via the [Meck-Mycelium remote dashboard](https://pelgraine.github.io/Meck-Mycelium).
|
||||
> **TODO — This section needs full documentation.** The feature is implemented and shipping. Draft outline below.
|
||||
|
||||
The device connects to a free HiveMQ Cloud MQTT broker over the cellular network, publishing status updates (uptime, battery, signal strength, temperature, neighbour count) and subscribing to commands. The web dashboard lets you view live telemetry, sync the repeater's clock, trigger adverts, reboot the device, and more — all from a browser.
|
||||
The remote repeater variant (`meck_remote_repeater`) turns a T-Deck Pro 4G board into a dedicated MeshCore repeater with cellular MQTT remote management. The repeater functions as a normal MeshCore repeater on the mesh — it forwards packets and responds to guest logins — but **admin management (clock sync, send advert, reboot, get status, configuration) is performed remotely via MQTT** through the [Meck-Mycelium dashboard](https://pelgraine.github.io/Meck-Mycelium), not via the standard mesh admin password login. The device connects to an MQTT broker (HiveMQ Cloud recommended — free tier available) over cellular data, publishing telemetry (uptime, battery, signal strength, temperature, neighbour count) and subscribing to admin commands.
|
||||
|
||||
This is ideal for deploying repeaters in remote or hard-to-reach locations where you can't physically visit to administer them, but where cellular coverage exists.
|
||||
**Sections to write:**
|
||||
|
||||
### Remote Repeater Build Variant
|
||||
- **Requirements** — T-Deck Pro 4G (A7682E), active SIM with data plan, SD card, MQTT broker account
|
||||
- **Setting up HiveMQ Cloud** — step-by-step free account creation, cluster setup, credentials
|
||||
- **SD card configuration** — `/remote/mqtt.cfg` (broker, port, username, password, device ID) and optional `/remote/apn.cfg`
|
||||
- **Deploying** — flash `meck_remote_repeater`, insert SIM and SD, boot sequence, display status indicators
|
||||
- **Dashboard usage** — connecting Meck-Mycelium to your MQTT broker, available commands (clock sync, send advert, reboot, get status), telemetry display
|
||||
- **Troubleshooting** — common issues (SIM not registering, MQTT auth failures, APN auto-detection)
|
||||
|
||||
| Variant | Environment | Companion | 4G Modem | Audio | Max Contacts |
|
||||
|---------|------------|-----------|----------|-------|-------------|
|
||||
| Remote Repeater (4G) | `meck_remote_repeater` | — | A7682E (MQTT) | — | — |
|
||||
---
|
||||
|
||||
The remote repeater variant does not function as a companion device or chat client. It operates exclusively as a MeshCore repeater node with cellular MQTT telemetry and remote command support.
|
||||
## WiFi Repeater
|
||||
|
||||
### Setting Up HiveMQ Cloud (Free MQTT Broker)
|
||||
> **TODO — This section needs full documentation.** The feature is implemented. Draft outline below.
|
||||
|
||||
The remote repeater requires an MQTT broker to relay telemetry and commands between the device and the web dashboard. [HiveMQ Cloud](https://www.hivemq.com/mqtt-cloud-broker/) offers a free tier that is more than sufficient.
|
||||
The WiFi repeater variants turn a device into a dedicated MeshCore repeater with WiFi MQTT remote management — similar to the cellular remote repeater but using WiFi instead of 4G. The repeater forwards mesh traffic and responds to guest logins as normal, but **admin management is performed remotely via MQTT** through the Meck-Mycelium dashboard, not via the standard mesh admin password login. Available for the following platforms:
|
||||
|
||||
**Step 1 — Create a HiveMQ Cloud account:**
|
||||
| Variant | Environment | Platform |
|
||||
|---------|------------|----------|
|
||||
| T-Deck Pro WiFi Repeater | `meck_wifi_repeater` | LilyGo T-Deck Pro |
|
||||
| T5S3 WiFi Repeater | `meck_wifi_repeater_t5s3` | LilyGo T5S3 E-Paper Pro |
|
||||
| Heltec V3 WiFi Repeater | `meck_wifi_repeater_heltec_v3` | Heltec V3 |
|
||||
| Heltec V4 WiFi Repeater | `meck_wifi_repeater_heltec_v4` | Heltec V4 |
|
||||
| Heltec V4 WiFi Repeater (headless) | `meck_wifi_repeater_heltec_v4_headless` | Heltec V4 (no display) |
|
||||
|
||||
1. Go to https://console.hivemq.cloud/ and sign up for a free account
|
||||
2. After logging in, a **Serverless** cluster is created automatically
|
||||
3. Note the **cluster URL** shown on the overview page — it will look something like `abc123def456.s1.eu.hivemq.cloud`
|
||||
4. Note the **port** — for the T-Deck Pro 4G, use the TLS port which is typically **8883**
|
||||
**Sections to write:**
|
||||
|
||||
**Step 2 — Create MQTT credentials:**
|
||||
|
||||
1. In the HiveMQ console, go to **Access Management**
|
||||
2. Create a new set of credentials — enter a **username** and **password**
|
||||
3. Save these — you'll need them for the SD card configuration file
|
||||
|
||||
**Step 3 — Note your connection details:**
|
||||
|
||||
You'll need these four values for the config file:
|
||||
- **Host:** your cluster URL (e.g. `abc123def456.s1.eu.hivemq.cloud`)
|
||||
- **Port:** `8883`
|
||||
- **Username:** the credentials you just created
|
||||
- **Password:** the credentials you just created
|
||||
|
||||
### Remote Repeater SD Card Configuration
|
||||
|
||||
Create a file called `mqtt.cfg` in the root of the SD card with your MQTT broker details:
|
||||
|
||||
```
|
||||
abc123.s1.eu.hivemq.cloud
|
||||
8883
|
||||
your_hivemq_username
|
||||
your_hivemq_password
|
||||
repeater-name
|
||||
```
|
||||
|
||||
The `topic` field sets the base MQTT topic. The device publishes status to `<topic>/status` and subscribes to commands on `<topic>/cmd`. If you're running multiple remote repeaters, give each one a unique topic (e.g. `meck/repeater/hilltop`, `meck/repeater/valley`).
|
||||
|
||||
**SD Card Folder Structure:**
|
||||
|
||||
```
|
||||
SD Card
|
||||
├── mqtt.cfg (MQTT broker credentials — required)
|
||||
├── meshcore/
|
||||
│ ├── contacts.bin (auto-created, repeater contact table)
|
||||
│ └── ...
|
||||
└── ...
|
||||
```
|
||||
|
||||
### Deploying the Remote Repeater
|
||||
|
||||
1. Flash `v1.6-Meck-Remote-Repeater-merged.bin` to your T-Deck Pro 4G using the MeshCore Web Flasher or esptool.py
|
||||
2. Insert a nano SIM card with an active data plan
|
||||
3. Insert an SD card with your `mqtt.cfg` file
|
||||
4. Power on the device — the modem will register on the cellular network (red LED indicates modem power)
|
||||
5. The device boots as a MeshCore repeater, connects to the cellular network, and begins publishing status updates to your MQTT broker
|
||||
6. Open the Meck-Mycelium remote dashboard to connect and manage it
|
||||
|
||||
The e-ink display shows the repeater's current status including node name, uptime, battery level, LoRa activity, cellular signal strength, and MQTT connection state.
|
||||
|
||||
### Remote Dashboard (Meck-Mycelium)
|
||||
|
||||
Open https://pelgraine.github.io/Meck-Mycelium and navigate to the **Remote** tab. Enter the same MQTT broker credentials and topic from your `mqtt.cfg` file. The dashboard connects directly to HiveMQ Cloud via secure WebSocket (no data passes through any third-party server) and displays live telemetry from your remote repeater.
|
||||
|
||||
**Dashboard features:**
|
||||
- Live status: uptime, battery, cellular signal strength, temperature, neighbour count
|
||||
- Clock sync: push your browser's clock to the repeater
|
||||
- Send advert: trigger a MeshCore advertisement broadcast
|
||||
- Reboot: remotely restart the device
|
||||
- **Requirements** — device, WiFi network, MQTT broker account, SD card (T-Deck Pro / T5S3) or SPIFFS config (Heltec V4)
|
||||
- **SD card configuration** — `/remote/wifi.cfg` (supports multiple SSIDs) and `/remote/mqtt.cfg`
|
||||
- **Heltec V4 specifics** — no SD card slot, config stored in SPIFFS, headless vs display variant
|
||||
- **OTA updates** — NTP time sync, HTTP firmware download over WiFi
|
||||
- **Dashboard** — same Meck-Mycelium dashboard as the cellular remote repeater
|
||||
|
||||
---
|
||||
|
||||
@@ -651,11 +692,12 @@ The LilyGo T5S3 E-Paper Pro (V2, H752-B) is a 4.7-inch e-ink device with capacit
|
||||
|
||||
| Variant | Environment | BLE | WiFi | Web Reader | Max Contacts |
|
||||
|---------|------------|-----|------|------------|-------------|
|
||||
| Standalone | `meck_t5s3_standalone` | — | — | No | 1,500 |
|
||||
| BLE Companion | `meck_t5s3_ble` | Yes | — | No | 500 |
|
||||
| WiFi Companion | `meck_t5s3_wifi` | — | Yes (TCP:5000) | Yes | 1,500 |
|
||||
| Standalone | `meck_t5s3_standalone` | — | — | No | 2,000 |
|
||||
| BLE Companion | `meck_t5s3_ble` | Yes | — | No | 2,000 |
|
||||
| WiFi Companion | `meck_t5s3_wifi` | — | Yes (TCP:5000) | Yes | 2,000 |
|
||||
| WiFi Repeater | `meck_wifi_repeater_t5s3` | — | Yes (MQTT) | No | — |
|
||||
|
||||
The WiFi variant connects to the MeshCore web app or meshcore.js over your local network. The web reader shares the same WiFi connection — no extra setup needed.
|
||||
The WiFi variant connects to the MeshCore web app or meshcore.js over your local network. The web reader shares the same WiFi connection — no extra setup needed. The WiFi Repeater variant is a dedicated remote repeater — see [WiFi Repeater](#wifi-repeater) for details on MQTT-based admin management.
|
||||
|
||||
### Touch Navigation
|
||||
|
||||
@@ -719,7 +761,9 @@ Since the T5S3 has no physical keyboard, a full-screen QWERTY virtual keyboard a
|
||||
The virtual keyboard supports:
|
||||
- QWERTY letter layout with a symbol/number layer (tap the **123** key to switch)
|
||||
- Shift toggle for uppercase
|
||||
- Backspace and Enter keys
|
||||
- Backspace (UTF-8 aware — correctly deletes multi-byte emoji) and Enter keys
|
||||
- **Emoji picker** — tap the **$** key to open a scrollable 8-column grid of 76 emoji sprites with page indicators. Tap an emoji to insert it inline in your message. Tap **Back** to return to the keyboard. Faces and emotions are grouped first for quick access.
|
||||
- Inline emoji rendering — emoji appear as pixel sprites in the text field as you type
|
||||
- Phantom keystroke prevention (a brief cooldown after the keyboard opens prevents accidental taps)
|
||||
|
||||
Tap keys to type. Tap **Enter** to submit, or press the **Boot button** to cancel and close the keyboard.
|
||||
@@ -732,12 +776,13 @@ The CardKB is auto-detected on the I2C bus at address `0x5F`. No configuration i
|
||||
|
||||
### Display Settings
|
||||
|
||||
The T5S3 Settings screen includes one additional display option not available on the T-Deck Pro:
|
||||
The T5S3 Settings screen includes display options shared with the T-Deck Pro, plus one T5S3-specific setting:
|
||||
|
||||
| Setting | Description |
|
||||
|---------|-------------|
|
||||
| **Dark Mode** | Inverts the display — white text on black background. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. |
|
||||
| **Larger Font** | Increases text size on channel messages, contacts, DM inbox, and repeater admin screens. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. |
|
||||
| **Font Style** | Choose between Classic (FreeSans), Noto Sans, or Montserrat. Swipe left/right to cycle, tap to apply. Available on both T-Deck Pro and T5S3. |
|
||||
| **Portrait Mode** | Rotates the display 90° from landscape (960×540) to portrait (540×960). Touch coordinates are automatically remapped. Text reader layout recalculates on orientation change. T5S3 only. |
|
||||
|
||||
These settings are persisted and survive reboots.
|
||||
@@ -777,20 +822,52 @@ The UTC offset is configured in the Settings screen (same as T-Deck Pro) and is
|
||||
| Gesture | Action |
|
||||
|---------|--------|
|
||||
| Swipe up / down | Scroll messages |
|
||||
| Swipe left / right | Switch between channels (swipe left past the last channel to reach the DM inbox) |
|
||||
| Swipe left / right | Open channel picker — shows all channels and DM inbox in a vertical bubble list with unread badges. Tap to select. |
|
||||
| Tap footer area | View relay path of last received message |
|
||||
| Tap path overlay | Dismiss overlay |
|
||||
| Long press (touch) | Open virtual keyboard to compose message to current channel |
|
||||
|
||||
#### Contacts
|
||||
|
||||
The contacts list shows all known nodes sorted by most recently heard, with type prefix, estimated hop count, and time since last advert. See the [T-Deck Pro Contacts Screen](#contacts-screen) section for an explanation of the type prefix and hop count display — the same conventions apply on the T5S3.
|
||||
|
||||
**Normal mode**
|
||||
|
||||
| Gesture | Action |
|
||||
|---------|--------|
|
||||
| Swipe up / down | Scroll through contacts |
|
||||
| Swipe left / right | Cycle contact filter (All → Chat → Repeater → Room → Sensor → Favourites) |
|
||||
| Tap | Select contact |
|
||||
| Swipe left / right | Cycle contact filter (All → Chat → Rptr → Room → Sens → Fav) |
|
||||
| Tap | Enter select mode (tapped contact is pre-selected) |
|
||||
| Long press on Chat contact | View unread DMs (if any), then compose DM |
|
||||
| Long press on Repeater contact | Open repeater admin login |
|
||||
| Long press on Repeater/RS contact | Open repeater admin login |
|
||||
|
||||
> **Note:** The **Fav** filter shows only contacts you have marked as favourites. If it appears empty, no contacts have been favourited yet — use select mode (tap a contact) and then long-press to mark favourites.
|
||||
|
||||
**Select mode** — tap any contact row to enter select mode. The tapped contact is pre-selected (shown with `*`). Swipe or tap to navigate and toggle selections. You can also use a **two-finger tap** anywhere on the contacts screen to toggle select mode on and off.
|
||||
|
||||
| Gesture | Action |
|
||||
|---------|--------|
|
||||
| Tap | Toggle selection on tapped row |
|
||||
| Swipe left | Select all contacts in current filter |
|
||||
| Swipe right | Deselect all |
|
||||
| Two-finger tap | Toggle select mode on/off |
|
||||
| Long press | Exit select mode (confirm favourites / deletions first) |
|
||||
|
||||
Batch operations (favourite toggle, delete) are triggered from the overlay that appears after exiting select mode with contacts selected.
|
||||
|
||||
**Adding contacts**
|
||||
|
||||
1. **Automatic** — if Settings → Contacts → Add Mode is set to *Auto All*, nodes are added as their adverts are heard. *Custom* mode adds only nodes matching the enabled type toggles (Companion, Repeater, Room Server, Sensor). *Manual Only* disables auto-add.
|
||||
|
||||
2. **From the Last Heard screen** — tap the **Discover** tile (or access via the home page on non-WiFi builds) and navigate to Last Heard. Tap any entry to add it to contacts, or tap an existing contact to remove it (favourites require a second tap within 3 seconds to confirm). Entries show `[+]` if already in contacts, `[★]` if a favourite.
|
||||
|
||||
> **Note:** The Last Heard list holds up to 1,000 entries in PSRAM, and advert data is stored persistently on the SD card — so contacts can be added long after the original advertisement was received, even across reboots. This makes Last Heard especially useful when auto-add is set to *Manual Only*, as it provides a passive catalogue of every node heard on the network.
|
||||
|
||||
3. **From the Discovery screen** — tap the Discover tile and run an active scan. Tap any result to add it to contacts.
|
||||
|
||||
**Deleting contacts**
|
||||
|
||||
Tap a contact to enter select mode, select the contacts to remove, exit select mode, and choose delete from the confirmation overlay.
|
||||
|
||||
#### Text Reader (File List)
|
||||
|
||||
@@ -872,12 +949,17 @@ The UTC offset is configured in the Settings screen (same as T-Deck Pro) and is
|
||||
|
||||
## Meck-Mycelium Web App
|
||||
|
||||
[Meck-Mycelium](https://pelgraine.github.io/Meck-Mycelium) is a browser-based companion app that connects to your MeshCore device via BLE (using WebBLE in Chrome). It is a fork of [WattleFoxxo's Mycelium](https://github.com/WattleFoxxo/Mycelium) PWA, extended with Meck-specific features:
|
||||
The [Meck-Mycelium web app](https://pelgraine.github.io/Meck-Mycelium) is a browser-based companion that connects to your MeshCore device via BLE (using WebBLE in Chrome) or to your MQTT broker for remote repeater management.
|
||||
|
||||
- **Voice message playback** — voice notes sent from a Meck Audio device appear as tappable "🎙️ Voice message" bubbles in the DM view. Codec2 decoding happens entirely in the browser via WebAssembly — no native app or plugin required.
|
||||
- **Remote repeater dashboard** — connect to your MQTT broker to view live telemetry from remote repeater devices, send commands, sync clocks, and reboot remotely.
|
||||
**Features:**
|
||||
|
||||
Open **https://pelgraine.github.io/Meck-Mycelium** in Chrome on your phone or computer. WebBLE requires Chrome or a Chromium-based browser (Edge, Brave, etc.) — Firefox and Safari do not support WebBLE.
|
||||
- **Voice message playback** — voice notes sent from a Meck Audio device appear as tappable playback bubbles in the DM view. Codec2 decoding happens entirely in the browser via WebAssembly — no app install or audio hardware needed on the receiving end.
|
||||
- **Remote repeater dashboard** — connect to your MQTT broker to administer remote repeater devices (cellular or WiFi). View live telemetry, send admin commands (clock sync, send advert, reboot, get status), and manage repeaters that are out of LoRa range. This replaces the standard mesh admin password login for remote repeater variants.
|
||||
- **Standard companion features** — messaging, contacts, channel messages via BLE.
|
||||
|
||||
Open **https://pelgraine.github.io/Meck-Mycelium** in Chrome on your phone or computer.
|
||||
|
||||
> **Note:** WebBLE requires Chrome (or a Chromium-based browser). Safari and Firefox do not support WebBLE.
|
||||
|
||||
---
|
||||
|
||||
@@ -931,6 +1013,7 @@ The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE vari
|
||||
> **Note:** On both the T-Deck Pro and T5S3, BLE and WiFi are disabled by default at boot. On the T-Deck Pro, navigate to the Bluetooth or WiFi home page and press Enter to enable. On the T5S3, navigate to the Bluetooth home page and long-press the screen to toggle BLE on.
|
||||
|
||||
- Web: https://app.meshcore.nz
|
||||
- Meck-Mycelium: https://pelgraine.github.io/Meck-Mycelium (voice playback, remote repeater dashboard)
|
||||
- Android: https://play.google.com/store/apps/details?id=com.liamcottle.meshcore.android
|
||||
- iOS: https://apps.apple.com/us/app/meshcore/id6742354151?platform=iphone
|
||||
- NodeJS: https://github.com/liamcottle/meshcore.js
|
||||
@@ -938,7 +1021,7 @@ The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE vari
|
||||
|
||||
## 🛠 Hardware Compatibility
|
||||
|
||||
MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.co.uk). Meck specifically targets the LilyGo T-Deck Pro and LilyGo T5S3 E-Paper Pro.
|
||||
MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.co.uk). Meck specifically targets the LilyGo T-Deck Pro, LilyGo T5S3 E-Paper Pro, Heltec V3 (remote repeater only), and Heltec V4 (remote repeater only).
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -975,9 +1058,18 @@ There are a number of fairly major features in the pipeline, with no particular
|
||||
- [X] Roomserver message handling and mark-read on login
|
||||
- [X] Alarm clock with custom MP3 sounds (audio variant)
|
||||
- [X] Customised user option for larger-font mode
|
||||
- [X] Voice notes over LoRa (audio variant) with Meck-Mycelium web app playback
|
||||
- [X] Remote repeater firmware with cellular MQTT management (4G variant)
|
||||
- [X] Contact management: select mode, selective export, JSON import/export, bulk delete
|
||||
- [X] Voice notes over LoRa (Codec2, audio variant)
|
||||
- [X] Contact select mode with batch favourite, export, import, and delete
|
||||
- [X] Path editor for manual contact route management
|
||||
- [X] Remote repeater with cellular MQTT admin management (4G variant)
|
||||
- [X] WiFi remote repeater with MQTT admin management
|
||||
- [X] SD File Manager via OTA Tools
|
||||
- [X] 2,000 contact support (PSRAM, all variants)
|
||||
- [X] Channel picker screen with unread badges
|
||||
- [X] Region scope (MeshCore v1.15+ compatibility)
|
||||
- [X] Selectable font styles (Classic, Noto Sans, Montserrat)
|
||||
- [X] Expanded emoji picker (76 emoji, reordered, wrap scrolling)
|
||||
- [X] 1,000-entry advert path cache (PSRAM)
|
||||
- [ ] Fix M4B rendering to enable chaptered audiobook playback
|
||||
- [ ] Better JPEG and PNG decoding
|
||||
- [ ] Improve EPUB rendering and EPUB format handling
|
||||
@@ -1004,8 +1096,26 @@ There are a number of fairly major features in the pipeline, with no particular
|
||||
- [X] DM inbox with per-contact unread indicators
|
||||
- [X] Roomserver message handling and mark-read on login
|
||||
- [X] Customised user option for larger-font mode
|
||||
- [X] Contact select mode with batch favourite and delete
|
||||
- [X] WiFi remote repeater with MQTT admin management
|
||||
- [X] 2,000 contact support (PSRAM, all variants)
|
||||
- [X] Channel picker screen with vertical bubble list layout
|
||||
- [X] Region scope (MeshCore v1.15+ compatibility)
|
||||
- [X] Selectable font styles (Classic, Noto Sans, Montserrat)
|
||||
- [X] Virtual keyboard emoji grid with scrollable pages
|
||||
- [ ] Improve EPUB rendering and EPUB format handling
|
||||
|
||||
**Heltec V4:**
|
||||
- [X] WiFi remote repeater with MQTT admin management
|
||||
- [X] Headless WiFi repeater variant (no display)
|
||||
|
||||
**Heltec V3:**
|
||||
- [X] WiFi remote repeater with MQTT admin management
|
||||
|
||||
**In development (WIP):**
|
||||
- [ ] T-Deck Pro MAX — ESP32-S3 with XL9555 I/O expander, combined 4G (A7682E) + audio (ES8311), working e-ink front-light, 1500 mAh battery. Variant files created; deferred until hardware ships.
|
||||
- [ ] T-Echo Card — nRF52840 (BLE-native) with SX1262, SSD1315 OLED (72×40), L76K GPS, speaker, PDM mic, IMU, solar charging, NFC. Preliminary variant files created; awaiting hardware.
|
||||
|
||||
## 📞 Get Support
|
||||
|
||||
- Join [MeshCore Discord](https://discord.gg/BMwCtwHj5V) to chat with the developers and get help from the community.
|
||||
@@ -1014,23 +1124,37 @@ There are a number of fairly major features in the pipeline, with no particular
|
||||
|
||||
The upstream [MeshCore](https://github.com/meshcore-dev/MeshCore) library is released under the **MIT License** (Copyright © 2025 Scott Powell / rippleradios.com). Meck-specific code (UI screens, display helpers, device integration) is also provided under the MIT License.
|
||||
|
||||
However, this firmware links against libraries with different license terms. Because two dependencies use the **GPL-3.0** copyleft license, the combined firmware binary is effectively subject to GPL-3.0 obligations when distributed. Please review the individual licenses below if you intend to redistribute or modify this firmware.
|
||||
However, this firmware links against libraries with different license terms. Because some dependencies use the **GPL-3.0** copyleft license (GxEPD2, ESP32-audioI2S) and others use **LGPL-2.1** (Codec2, ESPAsyncWebServer, Arduino_LPS22HB), the combined firmware binary is effectively subject to GPL-3.0 obligations when distributed. Please review the individual licenses below if you intend to redistribute or modify this firmware.
|
||||
|
||||
### Third-Party Libraries
|
||||
|
||||
| Library | License | Author / Source |
|
||||
|---------|---------|-----------------|
|
||||
| [MeshCore](https://github.com/meshcore-dev/MeshCore) | MIT | Scott Powell / rippleradios.com |
|
||||
| [GxEPD2](https://github.com/ZinggJM/GxEPD2) | GPL-3.0 | Jean-Marc Zingg |
|
||||
| [FastEPD](https://github.com/bitbank2/FastEPD) | Apache-2.0 | Larry Bank (bitbank2) |
|
||||
| [ESP32-audioI2S](https://github.com/schreibfaul1/ESP32-audioI2S) | GPL-3.0 | schreibfaul1 (Wolle) |
|
||||
| [Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library) | BSD | Adafruit |
|
||||
| [RadioLib](https://github.com/jgromes/RadioLib) | MIT | Jan Gromeš |
|
||||
| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He |
|
||||
| [JPEGDEC](https://github.com/bitbank2/JPEGDEC) | Apache-2.0 | Larry Bank (bitbank2) |
|
||||
| [PNGdec](https://github.com/bitbank2/PNGdec) | Apache-2.0 | Larry Bank (bitbank2) |
|
||||
| [CRC32](https://github.com/bakercp/CRC32) | MIT | Christopher Baker |
|
||||
| [base64](https://github.com/Densaugeo/base64_arduino) | MIT | densaugeo |
|
||||
| [GxEPD2](https://github.com/ZinggJM/GxEPD2) | GPL-3.0 | Jean-Marc Zingg (T-Deck Pro) |
|
||||
| [FastEPD](https://github.com/bitbank2/FastEPD) | Apache-2.0 | Larry Bank / bitbank2 (T5S3) |
|
||||
| [Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library) | BSD | Adafruit |
|
||||
| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He (T5S3 touch/RTC) |
|
||||
| [ESP32-audioI2S](https://github.com/schreibfaul1/ESP32-audioI2S) | GPL-3.0 | schreibfaul1 / Wolle |
|
||||
| [Codec2](https://github.com/sh123/esp32_codec2_arduino) | LGPL-2.1 | sh123 (ESP32 port) |
|
||||
| [JPEGDEC](https://github.com/bitbank2/JPEGDEC) | Apache-2.0 | Larry Bank / bitbank2 |
|
||||
| [PNGdec](https://github.com/bitbank2/PNGdec) | Apache-2.0 | Larry Bank / bitbank2 |
|
||||
| [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer) | LGPL-2.1 | Hristo Gochkov / me-no-dev (OTA) |
|
||||
| [PubSubClient](https://github.com/knolleary/pubsubclient) | MIT | Nick O'Leary (MQTT) |
|
||||
| [Arduino Crypto](https://github.com/rweather/arduinolibs) | MIT | Rhys Weatherley |
|
||||
| [base64](https://github.com/Densaugeo/base64_arduino) | MIT | densaugeo |
|
||||
| [CRC32](https://github.com/bakercp/CRC32) | MIT | Christopher Baker |
|
||||
| [RTClib](https://github.com/adafruit/RTClib) | MIT | Adafruit |
|
||||
| [Melopero RV3028](https://github.com/melopero/Melopero_RV-3028_Arduino_Library) | MIT | Melopero |
|
||||
| [MicroNMEA](https://github.com/stevemarple/MicroNMEA) | MIT | Steve Marple (GPS) |
|
||||
| [CayenneLPP](https://github.com/ElectronicCats/CayenneLPP) | MIT | Electronic Cats |
|
||||
| [Adafruit ST7735/ST7789](https://github.com/adafruit/Adafruit-ST7735-Library) | MIT | Adafruit (Heltec V4 TFT) |
|
||||
| [INA226](https://github.com/RobTillaart/INA226) | MIT | Rob Tillaart |
|
||||
| [Arduino_LPS22HB](https://github.com/arduino-libraries/Arduino_LPS22HB) | LGPL-2.1 | Arduino |
|
||||
| Adafruit sensor drivers¹ | MIT / BSD | Adafruit |
|
||||
| [Sensirion I2C SHT4x](https://github.com/Sensirion/arduino-i2c-sht4x) | BSD-3-Clause | Sensirion |
|
||||
|
||||
¹ Includes INA219, INA260, INA3221, AHTX0, BME280, BMP280, BME680, BMP085, SHTC3, MLX90614, VL53L0X — all MIT or BSD licensed. Used via the sensor manager for optional environmental monitoring.
|
||||
|
||||
Full license texts for each dependency are available in their respective repositories linked above.
|
||||
+124
-21
@@ -57,7 +57,6 @@ All commands follow a simple pattern: `get` to read, `set` to write.
|
||||
| `get radio` | All radio params in one line |
|
||||
| `get utc` | UTC offset (hours) |
|
||||
| `get notify` | Keyboard flash notification (on/off) |
|
||||
| `get largefont` | Larger font mode (on/off) |
|
||||
| `get gps` | GPS status and interval |
|
||||
| `get pin` | BLE pairing PIN |
|
||||
| `get path.hash.mode` | Path hash size (0=1-byte, 1=2-byte, 2=3-byte) |
|
||||
@@ -65,10 +64,12 @@ All commands follow a simple pattern: `get` to read, `set` to write.
|
||||
| `get af` | Airtime factor |
|
||||
| `get multi.acks` | Redundant ACKs (0 or 1) |
|
||||
| `get int.thresh` | Interference threshold (0=disabled) |
|
||||
| `get tx.fail.reset` | TX fail reset threshold (0=disabled, default 3) |
|
||||
| `get rx.fail.reboot` | RX stuck reboot threshold (0=disabled, default 3) |
|
||||
| `get tx.fail.threshold` | TX fail reset threshold (0=disabled, default 3) |
|
||||
| `get rx.fail.threshold` | RX stuck reboot threshold (0=disabled, default 3) |
|
||||
| `get gps.baud` | GPS baud rate (0=compile-time default) |
|
||||
| `get channels` | List all channels with index numbers |
|
||||
| `get region` | Default region scope (e.g. `au-nsw`, or `none`) |
|
||||
| `get channels` | List all channels with index numbers and region scopes |
|
||||
| `get channel.scope <idx>` | Show region scope for a specific channel |
|
||||
| `get presets` | List all radio presets with parameters |
|
||||
| `get pubkey` | Device public key (hex) |
|
||||
| `get firmware` | Firmware version string |
|
||||
@@ -167,15 +168,6 @@ set notify on
|
||||
set notify off
|
||||
```
|
||||
|
||||
#### Larger Font Mode
|
||||
|
||||
Toggle larger text on channel messages, contacts, DM inbox, and repeater admin screens:
|
||||
|
||||
```
|
||||
set largefont on
|
||||
set largefont off
|
||||
```
|
||||
|
||||
#### BLE PIN
|
||||
|
||||
```
|
||||
@@ -248,8 +240,8 @@ Values: 0 (disabled, default) or 14+ (14 is the typical setting). Values between
|
||||
Automatically resets the radio hardware after this many consecutive failed transmission attempts. This recovers from "zombie radio" states where the SX1262 stops responding to send commands.
|
||||
|
||||
```
|
||||
set tx.fail.reset 3
|
||||
set tx.fail.reset 0
|
||||
set tx.fail.threshold 3
|
||||
set tx.fail.threshold 0
|
||||
```
|
||||
|
||||
Values: 0 (disabled) or 1–10 (default: 3). After the threshold is reached, the radio is reset and the failed packet is re-queued.
|
||||
@@ -259,8 +251,8 @@ Values: 0 (disabled) or 1–10 (default: 3). After the threshold is reached, the
|
||||
Automatically reboots the device after this many consecutive RX-stuck recovery failures. An RX-stuck event occurs when the radio is not in receive mode for 8 seconds despite automatic recovery attempts.
|
||||
|
||||
```
|
||||
set rx.fail.reboot 3
|
||||
set rx.fail.reboot 0
|
||||
set rx.fail.threshold 3
|
||||
set rx.fail.threshold 0
|
||||
```
|
||||
|
||||
Values: 0 (disabled) or 1–10 (default: 3). A full device reboot is a last resort — this should only trigger in rare cases of persistent radio hardware malfunction.
|
||||
@@ -276,6 +268,18 @@ set gps.baud 0
|
||||
|
||||
Valid rates: 0 (default), 4800, 9600, 19200, 38400, 57600, 115200.
|
||||
|
||||
#### Backlight (T5S3 E-Paper Pro Only)
|
||||
|
||||
Control the front-light on the T5S3 display:
|
||||
|
||||
```
|
||||
set backlight on
|
||||
set backlight off
|
||||
set backlight 128
|
||||
```
|
||||
|
||||
Values: `on`, `off`, or a brightness level from 0–255.
|
||||
|
||||
### Channel Management
|
||||
|
||||
#### List Channels
|
||||
@@ -287,11 +291,13 @@ get channels
|
||||
Output:
|
||||
|
||||
```
|
||||
[0] #public
|
||||
[1] #meck-test
|
||||
[2] #local-group
|
||||
[0] #public [*]
|
||||
[1] #meck-test [au-nsw]
|
||||
[2] #local-group [*]
|
||||
```
|
||||
|
||||
Each channel shows its region scope in brackets. `[*]` means the channel uses the device default region (or unscoped if no default is set). A specific name like `[au-nsw]` means that channel has its own region override.
|
||||
|
||||
#### Add a Hashtag Channel
|
||||
|
||||
```
|
||||
@@ -308,6 +314,82 @@ set channel.del 2
|
||||
|
||||
Channels are referenced by their index number (shown in `get channels`). Channel 0 (public) cannot be deleted. Remaining channels are automatically compacted after deletion.
|
||||
|
||||
### Region Scope
|
||||
|
||||
Regions limit how far your flood messages propagate through the mesh. When you set a region, outgoing messages are tagged with a transport code that repeaters use to decide whether to forward them. Messages sent without a region reach all repeaters via the default wildcard, same as always.
|
||||
|
||||
Meck does not pre-set any region on a fresh flash. Region names are determined by your local mesh community — check with your local group for the names in use. Common patterns follow ISO 3166 country/subdivision codes (e.g. `au` for Australia, `gb-eng` for England, `us-ca` for California), but communities may also use custom names for their area.
|
||||
|
||||
Region names must be lowercase alphanumeric characters and hyphens only, max 29 characters.
|
||||
|
||||
#### View Default Region
|
||||
|
||||
```
|
||||
get region
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```
|
||||
> au-nsw
|
||||
```
|
||||
|
||||
Or if no region is set:
|
||||
|
||||
```
|
||||
> (none — unscoped)
|
||||
```
|
||||
|
||||
#### Set Default Region
|
||||
|
||||
```
|
||||
set region au-nsw
|
||||
```
|
||||
|
||||
This applies to all channels and DMs unless a channel has its own region override.
|
||||
|
||||
#### Clear Default Region
|
||||
|
||||
```
|
||||
set region none
|
||||
```
|
||||
|
||||
Returns to unscoped mode — messages reach all repeaters.
|
||||
|
||||
#### View Channel Region
|
||||
|
||||
```
|
||||
get channel.scope 2
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```
|
||||
> #local-group scope: au-syd
|
||||
```
|
||||
|
||||
Or if the channel uses the device default:
|
||||
|
||||
```
|
||||
> #local-group scope: (device default)
|
||||
```
|
||||
|
||||
#### Set Channel Region
|
||||
|
||||
```
|
||||
set channel.scope 2 au-syd
|
||||
```
|
||||
|
||||
This overrides the device default for that specific channel.
|
||||
|
||||
#### Clear Channel Region
|
||||
|
||||
```
|
||||
set channel.scope 2 none
|
||||
```
|
||||
|
||||
Returns the channel to using the device default region.
|
||||
|
||||
### 4G Modem (4G Variant Only)
|
||||
|
||||
#### Enable / Disable Modem
|
||||
@@ -420,7 +502,7 @@ set channel.add local-group
|
||||
get all
|
||||
```
|
||||
|
||||
### Switching to a New Region
|
||||
### Switching to a Different Radio Preset
|
||||
|
||||
Moving from Australia to the US? One command:
|
||||
|
||||
@@ -434,6 +516,27 @@ Verify with:
|
||||
get radio
|
||||
```
|
||||
|
||||
### Setting Up Regions
|
||||
|
||||
Check with your local mesh community for the region names in use, then set your device default:
|
||||
|
||||
```
|
||||
set region au-nsw
|
||||
```
|
||||
|
||||
If you want a specific channel to use a different region (e.g. a nationwide channel):
|
||||
|
||||
```
|
||||
set channel.scope 1 au
|
||||
```
|
||||
|
||||
Verify everything:
|
||||
|
||||
```
|
||||
get region
|
||||
get channels
|
||||
```
|
||||
|
||||
### Custom Radio Configuration
|
||||
|
||||
If none of the presets match your local group or you need specific parameters, set them directly. You can do it all in one command:
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino": {
|
||||
"ldscript": "nrf52840_s140_v6.ld"
|
||||
},
|
||||
"core": "nRF5",
|
||||
"cpu": "cortex-m4",
|
||||
"extra_flags": [
|
||||
"-DARDUINO_NRF52840_TECHO_CARD",
|
||||
"-DNRF52840_XXAA",
|
||||
"-DNRF52_SERIES"
|
||||
],
|
||||
"f_cpu": "64000000L",
|
||||
"hwids": [["0x239A", "0x8029"]],
|
||||
"mcu": "nrf52840",
|
||||
"variant": "lilygo_techo_card",
|
||||
"bsp": {
|
||||
"name": "adafruit"
|
||||
},
|
||||
"softdevice": {
|
||||
"sd_name": "s140",
|
||||
"sd_version": "6.1.1",
|
||||
"sd_fwid": "0x00B6"
|
||||
},
|
||||
"usb_product": "T-Echo Card"
|
||||
},
|
||||
"connectivity": ["bluetooth", "lora"],
|
||||
"debug": {
|
||||
"jlink_device": "nRF52840_xxAA",
|
||||
"openocd_target": "nrf52840"
|
||||
},
|
||||
"frameworks": ["arduino"],
|
||||
"name": "LilyGo T-Echo Card (nRF52840, SX1262, 4MB Flash)",
|
||||
"upload": {
|
||||
"flash_size": "796KB",
|
||||
"maximum_ram_size": 248832,
|
||||
"maximum_size": 815104,
|
||||
"native_usb": true,
|
||||
"protocol": "nrfutil",
|
||||
"protocols": ["nrfutil", "jlink", "cmsis-dap"],
|
||||
"require_upload_port": true,
|
||||
"speed": 115200,
|
||||
"use_1200bps_touch": true,
|
||||
"wait_for_upload_port": true
|
||||
},
|
||||
"url": "https://github.com/Xinyuan-LilyGO/T-Echo-Card",
|
||||
"vendor": "LILYGO"
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"build": {
|
||||
"arduino": {
|
||||
"ldscript": "esp32s3_out.ld",
|
||||
"memory_type": "qio_qspi",
|
||||
"partitions": "default_16MB.csv"
|
||||
},
|
||||
"core": "esp32",
|
||||
"extra_flags": [
|
||||
"-DBOARD_HAS_PSRAM",
|
||||
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
||||
"-DARDUINO_USB_MODE=1",
|
||||
"-DARDUINO_RUNNING_CORE=1",
|
||||
"-DARDUINO_EVENT_RUNNING_CORE=1"
|
||||
],
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
"hwids": [["0x303A", "0x1001"]],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3"
|
||||
},
|
||||
"connectivity": ["wifi", "bluetooth", "lora"],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": ["esp-builtin"],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": ["arduino", "espidf"],
|
||||
"name": "LilyGo T-Deck Pro MAX (16MB Flash 8MB QSPI PSRAM)",
|
||||
"upload": {
|
||||
"flash_size": "16MB",
|
||||
"maximum_ram_size": 327680,
|
||||
"maximum_size": 16777216,
|
||||
"require_upload_port": true,
|
||||
"speed": 921600
|
||||
},
|
||||
"url": "https://www.lilygo.cc/products/t-deck-pro",
|
||||
"vendor": "LilyGo"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
6818ce5f77dd45bb90facf753ba81d81.s1.eu.hivemq.cloud
|
||||
8883
|
||||
meckremote
|
||||
yourpassword
|
||||
heltec-wifi-1
|
||||
@@ -0,0 +1,2 @@
|
||||
SSID
|
||||
Password
|
||||
@@ -274,6 +274,9 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
|
||||
if (file.read((uint8_t *)&_prefs.large_font, sizeof(_prefs.large_font)) != sizeof(_prefs.large_font)) {
|
||||
_prefs.large_font = 0; // default: tiny font
|
||||
}
|
||||
if (file.read((uint8_t *)&_prefs.ui_font_style, sizeof(_prefs.ui_font_style)) != sizeof(_prefs.ui_font_style)) {
|
||||
_prefs.ui_font_style = 0; // default: Classic (FreeSans)
|
||||
}
|
||||
if (file.read((uint8_t *)&_prefs.tx_fail_reset_threshold, sizeof(_prefs.tx_fail_reset_threshold)) != sizeof(_prefs.tx_fail_reset_threshold)) {
|
||||
_prefs.tx_fail_reset_threshold = 3; // default: 3
|
||||
}
|
||||
@@ -281,11 +284,20 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
|
||||
_prefs.rx_fail_reboot_threshold = 3; // default: 3
|
||||
}
|
||||
|
||||
// v1.7+ Meck region scope fields — may not exist in older prefs files
|
||||
if (file.read((uint8_t *)_prefs.default_scope_name, sizeof(_prefs.default_scope_name)) != sizeof(_prefs.default_scope_name)) {
|
||||
memset(_prefs.default_scope_name, 0, sizeof(_prefs.default_scope_name)); // default: unscoped
|
||||
}
|
||||
if (file.read((uint8_t *)_prefs.default_scope_key, sizeof(_prefs.default_scope_key)) != sizeof(_prefs.default_scope_key)) {
|
||||
memset(_prefs.default_scope_key, 0, sizeof(_prefs.default_scope_key)); // default: null key
|
||||
}
|
||||
|
||||
// Clamp to valid ranges
|
||||
if (_prefs.dark_mode > 1) _prefs.dark_mode = 0;
|
||||
if (_prefs.portrait_mode > 1) _prefs.portrait_mode = 0;
|
||||
if (_prefs.hint_shown > 1) _prefs.hint_shown = 0;
|
||||
if (_prefs.large_font > 1) _prefs.large_font = 0;
|
||||
if (_prefs.ui_font_style >= 3) _prefs.ui_font_style = 0;
|
||||
if (_prefs.tx_fail_reset_threshold > 10) _prefs.tx_fail_reset_threshold = 3;
|
||||
if (_prefs.rx_fail_reboot_threshold > 10) _prefs.rx_fail_reboot_threshold = 3;
|
||||
// auto_lock_minutes: only accept known options (0, 2, 5, 10, 15, 30)
|
||||
@@ -342,8 +354,11 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
|
||||
file.write((uint8_t *)&_prefs.auto_lock_minutes, sizeof(_prefs.auto_lock_minutes)); // 100
|
||||
file.write((uint8_t *)&_prefs.hint_shown, sizeof(_prefs.hint_shown)); // 101
|
||||
file.write((uint8_t *)&_prefs.large_font, sizeof(_prefs.large_font)); // 102
|
||||
file.write((uint8_t *)&_prefs.tx_fail_reset_threshold, sizeof(_prefs.tx_fail_reset_threshold)); // 103
|
||||
file.write((uint8_t *)&_prefs.rx_fail_reboot_threshold, sizeof(_prefs.rx_fail_reboot_threshold)); // 104
|
||||
file.write((uint8_t *)&_prefs.ui_font_style, sizeof(_prefs.ui_font_style)); // 103
|
||||
file.write((uint8_t *)&_prefs.tx_fail_reset_threshold, sizeof(_prefs.tx_fail_reset_threshold)); // 104
|
||||
file.write((uint8_t *)&_prefs.rx_fail_reboot_threshold, sizeof(_prefs.rx_fail_reboot_threshold)); // 105
|
||||
file.write((uint8_t *)_prefs.default_scope_name, sizeof(_prefs.default_scope_name)); // 106
|
||||
file.write((uint8_t *)_prefs.default_scope_key, sizeof(_prefs.default_scope_key)); // 137
|
||||
|
||||
file.close();
|
||||
}
|
||||
@@ -595,8 +610,57 @@ void DataStore::loadChannels(DataStoreHost* host) {
|
||||
FILESYSTEM* fs = _getContactsChannelsFS();
|
||||
|
||||
// Crash recovery (same pattern as contacts)
|
||||
if (!fs->exists("/channels3") && fs->exists("/channels3.tmp")) {
|
||||
Serial.println("DataStore: recovering channels3 from .tmp file");
|
||||
fs->rename("/channels3.tmp", "/channels3");
|
||||
}
|
||||
if (fs->exists("/channels3.tmp")) {
|
||||
fs->remove("/channels3.tmp");
|
||||
}
|
||||
|
||||
// Try channels3 (new format with scope_name) first
|
||||
if (fs->exists("/channels3")) {
|
||||
File file = openRead(fs, "/channels3");
|
||||
if (file) {
|
||||
bool full = false;
|
||||
uint8_t channel_idx = 0;
|
||||
while (!full) {
|
||||
ChannelDetails ch;
|
||||
memset(ch.scope_name, 0, sizeof(ch.scope_name));
|
||||
uint8_t unused[4];
|
||||
|
||||
bool success = (file.read(unused, 4) == 4);
|
||||
success = success && (file.read((uint8_t *)ch.name, 32) == 32);
|
||||
success = success && (file.read((uint8_t *)ch.channel.secret, 32) == 32);
|
||||
success = success && (file.read((uint8_t *)ch.scope_name, 31) == 31);
|
||||
|
||||
if (!success) break; // EOF
|
||||
|
||||
// Sanitize scope_name — reject if it contains non-region characters
|
||||
// (catches garbage from uninitialised memory in early channels3 files)
|
||||
ch.scope_name[30] = '\0'; // force null-terminate
|
||||
for (int s = 0; ch.scope_name[s]; s++) {
|
||||
char sc = ch.scope_name[s];
|
||||
if (!((sc >= 'a' && sc <= 'z') || (sc >= '0' && sc <= '9') || sc == '-')) {
|
||||
memset(ch.scope_name, 0, sizeof(ch.scope_name)); // invalid — clear
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (host->onChannelLoaded(channel_idx, ch)) {
|
||||
channel_idx++;
|
||||
} else {
|
||||
full = true;
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
return; // channels3 loaded successfully
|
||||
}
|
||||
}
|
||||
|
||||
// Fall back to channels2 (legacy format without scope_name)
|
||||
if (!fs->exists("/channels2") && fs->exists("/channels2.tmp")) {
|
||||
Serial.println("DataStore: recovering channels from .tmp file");
|
||||
Serial.println("DataStore: recovering channels2 from .tmp file");
|
||||
fs->rename("/channels2.tmp", "/channels2");
|
||||
}
|
||||
if (fs->exists("/channels2.tmp")) {
|
||||
@@ -609,6 +673,7 @@ void DataStore::loadChannels(DataStoreHost* host) {
|
||||
uint8_t channel_idx = 0;
|
||||
while (!full) {
|
||||
ChannelDetails ch;
|
||||
memset(ch.scope_name, 0, sizeof(ch.scope_name)); // default: no scope
|
||||
uint8_t unused[4];
|
||||
|
||||
bool success = (file.read(unused, 4) == 4);
|
||||
@@ -624,13 +689,18 @@ void DataStore::loadChannels(DataStoreHost* host) {
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
|
||||
// Migrate: save as channels3 and remove channels2
|
||||
Serial.println("DataStore: migrating channels2 → channels3");
|
||||
saveChannels(host);
|
||||
fs->remove("/channels2");
|
||||
}
|
||||
}
|
||||
|
||||
void DataStore::saveChannels(DataStoreHost* host) {
|
||||
FILESYSTEM* fs = _getContactsChannelsFS();
|
||||
const char* finalPath = "/channels2";
|
||||
const char* tmpPath = "/channels2.tmp";
|
||||
const char* finalPath = "/channels3";
|
||||
const char* tmpPath = "/channels3.tmp";
|
||||
|
||||
File file = openWrite(fs, tmpPath);
|
||||
if (!file) {
|
||||
@@ -648,6 +718,7 @@ void DataStore::saveChannels(DataStoreHost* host) {
|
||||
bool success = (file.write(unused, 4) == 4);
|
||||
success = success && (file.write((uint8_t *)ch.name, 32) == 32);
|
||||
success = success && (file.write((uint8_t *)ch.channel.secret, 32) == 32);
|
||||
success = success && (file.write((uint8_t *)ch.scope_name, 31) == 31);
|
||||
|
||||
if (!success) {
|
||||
writeOk = false;
|
||||
@@ -660,7 +731,7 @@ void DataStore::saveChannels(DataStoreHost* host) {
|
||||
file.close();
|
||||
|
||||
// Reopen read-only to get true on-disk size (SPIFFS file.size() is unreliable before close)
|
||||
size_t expectedBytes = channel_idx * 68; // 4 + 32 + 32 = 68 bytes per channel
|
||||
size_t expectedBytes = channel_idx * 99; // 4 + 32 + 32 + 31 = 99 bytes per channel
|
||||
File verify = openRead(fs, tmpPath);
|
||||
size_t bytesWritten = verify ? verify.size() : 0;
|
||||
if (verify) verify.close();
|
||||
@@ -705,7 +776,7 @@ void DataStore::checkAdvBlobFile() {
|
||||
}
|
||||
|
||||
void DataStore::migrateToSecondaryFS() {
|
||||
// migrate old adv_blobs, contacts3 and channels2 files to secondary FS if they don't already exist
|
||||
// migrate old adv_blobs, contacts3 and channels3/channels2 files to secondary FS if they don't already exist
|
||||
if (!_fsExtra->exists("/adv_blobs")) {
|
||||
if (_fs->exists("/adv_blobs")) {
|
||||
File oldAdvBlobs = openRead(_fs, "/adv_blobs");
|
||||
@@ -744,10 +815,14 @@ void DataStore::migrateToSecondaryFS() {
|
||||
_fs->remove("/contacts3");
|
||||
}
|
||||
}
|
||||
if (!_fsExtra->exists("/channels2")) {
|
||||
if (_fs->exists("/channels2")) {
|
||||
File oldFile = openRead(_fs, "/channels2");
|
||||
File newFile = openWrite(_fsExtra, "/channels2");
|
||||
if (!_fsExtra->exists("/channels3") && !_fsExtra->exists("/channels2")) {
|
||||
// Migrate channels3 (preferred) or channels2 (legacy) to secondary FS
|
||||
const char* srcName = _fs->exists("/channels3") ? "/channels3"
|
||||
: _fs->exists("/channels2") ? "/channels2"
|
||||
: nullptr;
|
||||
if (srcName) {
|
||||
File oldFile = openRead(_fs, srcName);
|
||||
File newFile = openWrite(_fsExtra, srcName);
|
||||
|
||||
if (oldFile && newFile) {
|
||||
uint8_t buf[64];
|
||||
@@ -758,7 +833,7 @@ void DataStore::migrateToSecondaryFS() {
|
||||
}
|
||||
if (oldFile) oldFile.close();
|
||||
if (newFile) newFile.close();
|
||||
_fs->remove("/channels2");
|
||||
_fs->remove(srcName);
|
||||
}
|
||||
}
|
||||
// cleanup nodes which have been testing the extra fs, copy _main.id and new_prefs back to primary
|
||||
@@ -801,6 +876,9 @@ void DataStore::migrateToSecondaryFS() {
|
||||
if (_fs->exists("/contacts3")) {
|
||||
_fs->remove("/contacts3");
|
||||
}
|
||||
if (_fs->exists("/channels3")) {
|
||||
_fs->remove("/channels3");
|
||||
}
|
||||
if (_fs->exists("/channels2")) {
|
||||
_fs->remove("/channels2");
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
#define CMD_SEND_BINARY_REQ 50
|
||||
#define CMD_FACTORY_RESET 51
|
||||
#define CMD_SEND_PATH_DISCOVERY_REQ 52
|
||||
#define CMD_SET_FLOOD_SCOPE 54 // v8+
|
||||
#define CMD_SET_FLOOD_SCOPE_KEY 54 // v8+ (per-channel scope key from BLE app)
|
||||
#define CMD_SEND_CONTROL_DATA 55 // v8+
|
||||
#define CMD_GET_STATS 56 // v8+, second byte is stats type
|
||||
|
||||
@@ -70,6 +70,9 @@
|
||||
#define CMD_SET_AUTOADD_CONFIG 58
|
||||
#define CMD_GET_AUTOADD_CONFIG 59
|
||||
#define CMD_SET_PATH_HASH_MODE 61
|
||||
#define CMD_SEND_CHANNEL_DATA 62
|
||||
#define CMD_SET_DEFAULT_FLOOD_SCOPE 63 // v1.15+ (device-wide default scope name+key)
|
||||
#define CMD_GET_DEFAULT_FLOOD_SCOPE 64 // v1.15+ (query current default scope)
|
||||
|
||||
// Stats sub-types for CMD_GET_STATS
|
||||
#define STATS_TYPE_CORE 0
|
||||
@@ -102,6 +105,9 @@
|
||||
#define RESP_CODE_TUNING_PARAMS 23
|
||||
#define RESP_CODE_STATS 24 // v8+, second byte is stats type
|
||||
#define RESP_CODE_AUTOADD_CONFIG 25
|
||||
#define RESP_ALLOWED_REPEAT_FREQ 26
|
||||
#define RESP_CODE_CHANNEL_DATA_RECV 27
|
||||
#define RESP_CODE_DEFAULT_FLOOD_SCOPE 28 // v1.15+
|
||||
|
||||
#define SEND_TIMEOUT_BASE_MILLIS 500
|
||||
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f
|
||||
@@ -166,7 +172,7 @@ void MyMesh::writeDisabledFrame() {
|
||||
_serial->writeFrame(buf, 1);
|
||||
}
|
||||
|
||||
void MyMesh::writeContactRespFrame(uint8_t code, const ContactInfo &contact) {
|
||||
size_t MyMesh::writeContactRespFrame(uint8_t code, const ContactInfo &contact) {
|
||||
int i = 0;
|
||||
out_frame[i++] = code;
|
||||
memcpy(&out_frame[i], contact.id.pub_key, PUB_KEY_SIZE);
|
||||
@@ -186,7 +192,7 @@ void MyMesh::writeContactRespFrame(uint8_t code, const ContactInfo &contact) {
|
||||
i += 4;
|
||||
memcpy(&out_frame[i], &contact.lastmod, 4);
|
||||
i += 4;
|
||||
_serial->writeFrame(out_frame, i);
|
||||
return _serial->writeFrame(out_frame, i);
|
||||
}
|
||||
|
||||
void MyMesh::updateContactFromFrame(ContactInfo &contact, uint32_t& last_mod, const uint8_t *frame, int len) {
|
||||
@@ -315,6 +321,7 @@ bool MyMesh::isAutoAddEnabled() const {
|
||||
}
|
||||
|
||||
bool MyMesh::shouldAutoAddContactType(uint8_t contact_type) const {
|
||||
if (_forceNextImport) return true; // explicit user add from Last Heard / Discovery
|
||||
if ((_prefs.manual_add_contacts & 1) == 0) {
|
||||
return true;
|
||||
}
|
||||
@@ -360,6 +367,7 @@ void MyMesh::onContactsFull() {
|
||||
}
|
||||
|
||||
void MyMesh::onDiscoveredContact(ContactInfo &contact, bool is_new, uint8_t path_len, const uint8_t* path) {
|
||||
_forceNextImport = false; // clear force-add flag (set by forceImportContact)
|
||||
if (_serial->isConnected()) {
|
||||
if (is_new) {
|
||||
writeContactRespFrame(PUSH_CODE_NEW_ADVERT, contact);
|
||||
@@ -565,19 +573,25 @@ bool MyMesh::filterRecvFloodPacket(mesh::Packet* packet) {
|
||||
return false; // never filter  let normal processing continue
|
||||
}
|
||||
|
||||
void MyMesh::sendFloodScoped(const ContactInfo& recipient, mesh::Packet* pkt, uint32_t delay_millis) {
|
||||
Serial.printf("[sendFloodScoped] to '%s', delay=%lu, hash_mode=%d, bph=%d\n",
|
||||
recipient.name, delay_millis, _prefs.path_hash_mode, _prefs.path_hash_mode + 1);
|
||||
// TODO: dynamic send_scope, depending on recipient and current 'home' Region
|
||||
if (send_scope.isNull()) {
|
||||
void MyMesh::sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint32_t delay_millis) {
|
||||
if (scope.isNull()) {
|
||||
sendFlood(pkt, delay_millis, getPathHashSize());
|
||||
} else {
|
||||
uint16_t codes[2];
|
||||
codes[0] = send_scope.calcTransportCode(pkt);
|
||||
codes[1] = 0; // REVISIT: set to 'home' Region, for sender/return region?
|
||||
codes[0] = scope.calcTransportCode(pkt);
|
||||
codes[1] = 0; // reserved for home region
|
||||
sendFlood(pkt, codes, delay_millis, getPathHashSize());
|
||||
}
|
||||
}
|
||||
|
||||
void MyMesh::sendFloodScoped(const ContactInfo& recipient, mesh::Packet* pkt, uint32_t delay_millis) {
|
||||
Serial.printf("[sendFloodScoped] to '%s', delay=%lu, hash_mode=%d, bph=%d\n",
|
||||
recipient.name, delay_millis, _prefs.path_hash_mode, _prefs.path_hash_mode + 1);
|
||||
// DMs: use device default scope (no per-contact scope)
|
||||
TransportKey default_scope;
|
||||
memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key));
|
||||
sendFloodScoped(default_scope, pkt, delay_millis);
|
||||
}
|
||||
void MyMesh::sendFloodScoped(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t delay_millis) {
|
||||
// Capture payload fingerprint for repeat tracking before sending
|
||||
if (pkt->payload_len >= SENT_FINGERPRINT_SIZE) {
|
||||
@@ -590,15 +604,46 @@ void MyMesh::sendFloodScoped(const mesh::GroupChannel& channel, mesh::Packet* pk
|
||||
MESH_DEBUG_PRINTLN("SentTrack: captured fingerprint for channel msg");
|
||||
}
|
||||
|
||||
// TODO: have per-channel send_scope
|
||||
if (send_scope.isNull()) {
|
||||
sendFlood(pkt, delay_millis, getPathHashSize());
|
||||
// Scope priority: BLE app send_scope → per-channel scope → device default → unscoped
|
||||
TransportKey scope;
|
||||
if (!send_scope.isNull()) {
|
||||
// BLE app has set a scope via CMD 54 — use it (highest priority)
|
||||
memcpy(scope.key, send_scope.key, sizeof(scope.key));
|
||||
} else {
|
||||
uint16_t codes[2];
|
||||
codes[0] = send_scope.calcTransportCode(pkt);
|
||||
codes[1] = 0; // REVISIT: set to 'home' Region, for sender/return region?
|
||||
sendFlood(pkt, codes, delay_millis, getPathHashSize());
|
||||
const char* ch_scope = getChannelScopeName(channel);
|
||||
if (ch_scope && ch_scope[0]) {
|
||||
deriveScopeKey(ch_scope, scope);
|
||||
} else {
|
||||
memcpy(scope.key, _prefs.default_scope_key, sizeof(scope.key));
|
||||
}
|
||||
}
|
||||
sendFloodScoped(scope, pkt, delay_millis);
|
||||
}
|
||||
|
||||
bool MyMesh::deriveScopeKey(const char* scopeName, TransportKey& keyOut) {
|
||||
if (!scopeName || scopeName[0] == '\0') {
|
||||
memset(keyOut.key, 0, sizeof(keyOut.key));
|
||||
return false;
|
||||
}
|
||||
// Region names are stored without '#' prefix in user-facing code,
|
||||
// but the key derivation prepends '#' (implicit auto hashtag region).
|
||||
char tmp[32];
|
||||
snprintf(tmp, sizeof(tmp), "#%s", scopeName);
|
||||
TransportKeyStore tempStore;
|
||||
tempStore.getAutoKeyFor(0, tmp, keyOut);
|
||||
return true;
|
||||
}
|
||||
|
||||
const char* MyMesh::getChannelScopeName(const mesh::GroupChannel& channel) {
|
||||
ChannelDetails ch;
|
||||
for (uint8_t i = 0; i < MAX_GROUP_CHANNELS; i++) {
|
||||
if (getChannel(i, ch) && ch.name[0] != '\0') {
|
||||
if (memcmp(ch.channel.secret, channel.secret, sizeof(channel.secret)) == 0) {
|
||||
return ch.scope_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void MyMesh::onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||
@@ -1265,7 +1310,7 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe
|
||||
next_ack_idx = 0;
|
||||
sign_data = NULL;
|
||||
dirty_contacts_expiry = 0;
|
||||
memset(advert_paths, 0, sizeof(advert_paths));
|
||||
advert_paths = nullptr; // PSRAM-allocated in begin()
|
||||
memset(send_scope.key, 0, sizeof(send_scope.key));
|
||||
memset(_sent_track, 0, sizeof(_sent_track));
|
||||
_sent_track_idx = 0;
|
||||
@@ -1292,6 +1337,7 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe
|
||||
}
|
||||
|
||||
void MyMesh::begin(bool has_display) {
|
||||
advert_paths = (AdvertPath*)ps_calloc(ADVERT_PATH_TABLE_SIZE, sizeof(AdvertPath));
|
||||
BaseChatMesh::begin();
|
||||
|
||||
if (!_store->loadMainIdentity(self_id)) {
|
||||
@@ -1587,6 +1633,17 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||
memcpy(&secs, &cmd_frame[1], 4);
|
||||
uint32_t curr = getRTCClock()->getCurrentTime();
|
||||
if (secs >= curr) {
|
||||
// Adjust stored advert timestamps if clock jumps significantly
|
||||
if (advert_paths && secs > curr + 60) {
|
||||
uint32_t delta = secs - curr;
|
||||
for (int i = 0; i < ADVERT_PATH_TABLE_SIZE; i++) {
|
||||
if (advert_paths[i].recv_timestamp > 0) {
|
||||
advert_paths[i].recv_timestamp += delta;
|
||||
}
|
||||
}
|
||||
Serial.printf("[ClockSync] Adjusted %d advert timestamps by +%lu seconds\n",
|
||||
ADVERT_PATH_TABLE_SIZE, (unsigned long)delta);
|
||||
}
|
||||
getRTCClock()->setCurrentTime(secs);
|
||||
writeOKFrame();
|
||||
} else {
|
||||
@@ -1715,23 +1772,12 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||
#ifdef DISPLAY_CLASS
|
||||
if (_ui) {
|
||||
_ui->msgRead(offline_queue_len);
|
||||
|
||||
// Mark channel as read when BLE companion app syncs the message.
|
||||
// Frame layout V3: [resp_code][snr][res1][res2][channel_idx][path_len]...
|
||||
// Frame layout V1: [resp_code][channel_idx][path_len]...
|
||||
bool is_v3_ch = (out_frame[0] == RESP_CODE_CHANNEL_MSG_RECV_V3);
|
||||
bool is_old_ch = (out_frame[0] == RESP_CODE_CHANNEL_MSG_RECV);
|
||||
if (is_v3_ch || is_old_ch) {
|
||||
uint8_t ch_idx = is_v3_ch ? out_frame[4] : out_frame[1];
|
||||
_ui->markChannelReadFromBLE(ch_idx);
|
||||
}
|
||||
|
||||
// Mark DM slot read when companion app syncs a contact (DM/room) message
|
||||
bool is_v3_dm = (out_frame[0] == RESP_CODE_CONTACT_MSG_RECV_V3);
|
||||
bool is_old_dm = (out_frame[0] == RESP_CODE_CONTACT_MSG_RECV);
|
||||
if (is_v3_dm || is_old_dm) {
|
||||
_ui->markChannelReadFromBLE(0xFF);
|
||||
}
|
||||
// Note: we intentionally do NOT mark channels/DMs as read here.
|
||||
// CMD_SYNC_NEXT_MESSAGE fires during the automatic bulk sync when
|
||||
// the BLE app connects — "synced to app" ≠ "read by user in app".
|
||||
// Unread counts only clear when the user navigates to that channel
|
||||
// on the device itself. The MeshCore BLE protocol has no "mark as
|
||||
// read" command from the app side, so this is the safest behaviour.
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
@@ -2059,6 +2105,11 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||
} else if (cmd_frame[0] == CMD_SET_CHANNEL && len >= 2 + 32 + 16) {
|
||||
uint8_t channel_idx = cmd_frame[1];
|
||||
ChannelDetails channel;
|
||||
// Preserve existing scope_name if channel already exists
|
||||
ChannelDetails existing;
|
||||
if (getChannel(channel_idx, existing) && existing.name[0] != '\0') {
|
||||
memcpy(channel.scope_name, existing.scope_name, sizeof(channel.scope_name));
|
||||
}
|
||||
StrHelper::strncpy(channel.name, (char *)&cmd_frame[2], 32);
|
||||
memset(channel.channel.secret, 0, sizeof(channel.channel.secret));
|
||||
memcpy(channel.channel.secret, &cmd_frame[2 + 32], 16); // NOTE: only 128-bit supported
|
||||
@@ -2269,13 +2320,44 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||
} else {
|
||||
writeErrFrame(ERR_CODE_FILE_IO_ERROR);
|
||||
}
|
||||
} else if (cmd_frame[0] == CMD_SET_FLOOD_SCOPE && len >= 2 && cmd_frame[1] == 0) {
|
||||
} else if (cmd_frame[0] == CMD_SET_FLOOD_SCOPE_KEY && len >= 2 && cmd_frame[1] == 0) {
|
||||
if (len >= 2 + 16) {
|
||||
memcpy(send_scope.key, &cmd_frame[2], sizeof(send_scope.key)); // set curr scope TransportKey
|
||||
Serial.printf("[CMD54] Per-channel scope key set (%d bytes)\n", len - 2);
|
||||
} else {
|
||||
memset(send_scope.key, 0, sizeof(send_scope.key)); // set scope to null
|
||||
Serial.println("[CMD54] Per-channel scope cleared");
|
||||
}
|
||||
writeOKFrame();
|
||||
} else if (cmd_frame[0] == CMD_SET_DEFAULT_FLOOD_SCOPE && len >= 1) {
|
||||
// v1.15+ — set device-wide default flood scope (name[31] + key[16])
|
||||
if (len >= 1+31+16) {
|
||||
int n = strlen((char *) &cmd_frame[1]);
|
||||
if (n > 0 && n < 31) {
|
||||
strcpy(_prefs.default_scope_name, (char *) &cmd_frame[1]);
|
||||
memcpy(_prefs.default_scope_key, &cmd_frame[1+31], 16);
|
||||
savePrefs();
|
||||
writeOKFrame();
|
||||
} else {
|
||||
writeErrFrame(ERR_CODE_ILLEGAL_ARG);
|
||||
}
|
||||
} else {
|
||||
// Clear default scope (unscoped)
|
||||
memset(_prefs.default_scope_name, 0, sizeof(_prefs.default_scope_name));
|
||||
memset(_prefs.default_scope_key, 0, sizeof(_prefs.default_scope_key));
|
||||
savePrefs();
|
||||
writeOKFrame();
|
||||
}
|
||||
} else if (cmd_frame[0] == CMD_GET_DEFAULT_FLOOD_SCOPE) {
|
||||
// v1.15+ — query current default flood scope
|
||||
out_frame[0] = RESP_CODE_DEFAULT_FLOOD_SCOPE;
|
||||
if (strlen(_prefs.default_scope_name) > 0) {
|
||||
memcpy(&out_frame[1], _prefs.default_scope_name, 31);
|
||||
memcpy(&out_frame[1+31], _prefs.default_scope_key, 16);
|
||||
_serial->writeFrame(out_frame, 1+31+16);
|
||||
} else {
|
||||
_serial->writeFrame(out_frame, 1); // no name or key means null/unscoped
|
||||
}
|
||||
} else if (cmd_frame[0] == CMD_SEND_CONTROL_DATA && len >= 2 && (cmd_frame[1] & 0x80) != 0) {
|
||||
auto resp = createControlData(&cmd_frame[1], len - 1);
|
||||
if (resp) {
|
||||
@@ -2376,6 +2458,26 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
Serial.printf(" > %lu (effective: %lu)\n",
|
||||
(unsigned long)_prefs.gps_baudrate, (unsigned long)effective);
|
||||
|
||||
} else if (strcmp(key, "region") == 0) {
|
||||
if (_prefs.default_scope_name[0]) {
|
||||
Serial.printf(" > %s\n", _prefs.default_scope_name);
|
||||
} else {
|
||||
Serial.println(" > (none — unscoped)");
|
||||
}
|
||||
} else if (memcmp(key, "channel.scope ", 14) == 0) {
|
||||
int idx = atoi(&key[14]);
|
||||
if (idx >= 0 && idx < MAX_GROUP_CHANNELS) {
|
||||
ChannelDetails ch;
|
||||
if (getChannel(idx, ch) && ch.name[0] != '\0') {
|
||||
Serial.printf(" > %s scope: %s\n", ch.name,
|
||||
ch.scope_name[0] ? ch.scope_name : "(device default)");
|
||||
} else {
|
||||
Serial.printf(" Error: channel %d is empty\n", idx);
|
||||
}
|
||||
} else {
|
||||
Serial.println(" Error: invalid channel index");
|
||||
}
|
||||
|
||||
} else if (strcmp(key, "radio") == 0) {
|
||||
Serial.printf(" > freq=%.3f bw=%.1f sf=%d cr=%d tx=%d\n",
|
||||
_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr, _prefs.tx_power_dbm);
|
||||
@@ -2390,7 +2492,11 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
for (uint8_t i = 0; i < MAX_GROUP_CHANNELS; i++) {
|
||||
ChannelDetails ch;
|
||||
if (getChannel(i, ch) && ch.name[0] != '\0') {
|
||||
Serial.printf(" [%d] %s\n", i, ch.name);
|
||||
if (ch.scope_name[0]) {
|
||||
Serial.printf(" [%d] %s [%s]\n", i, ch.name, ch.scope_name);
|
||||
} else {
|
||||
Serial.printf(" [%d] %s [*]\n", i, ch.name);
|
||||
}
|
||||
found = true;
|
||||
} else {
|
||||
break;
|
||||
@@ -2437,6 +2543,8 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
uint32_t eff_baud = _prefs.gps_baudrate ? _prefs.gps_baudrate : GPS_BAUDRATE;
|
||||
Serial.printf(" gps.baud: %lu\n", (unsigned long)eff_baud);
|
||||
}
|
||||
Serial.printf(" region: %s\n",
|
||||
_prefs.default_scope_name[0] ? _prefs.default_scope_name : "(none — unscoped)");
|
||||
#ifdef HAS_4G_MODEM
|
||||
Serial.printf(" modem: %s\n", ModemManager::loadEnabledConfig() ? "on" : "off");
|
||||
Serial.printf(" apn: %s\n", modemManager.getAPN());
|
||||
@@ -2471,7 +2579,11 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
for (uint8_t i = 0; i < MAX_GROUP_CHANNELS; i++) {
|
||||
ChannelDetails ch;
|
||||
if (getChannel(i, ch) && ch.name[0] != '\0') {
|
||||
Serial.printf(" [%d] %s\n", i, ch.name);
|
||||
if (ch.scope_name[0]) {
|
||||
Serial.printf(" [%d] %s [%s]\n", i, ch.name, ch.scope_name);
|
||||
} else {
|
||||
Serial.printf(" [%d] %s [*]\n", i, ch.name);
|
||||
}
|
||||
chFound = true;
|
||||
} else {
|
||||
break;
|
||||
@@ -2865,6 +2977,54 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
Serial.println(" Error: use 0 (default), 4800, 9600, 19200, 38400, 57600, or 115200");
|
||||
}
|
||||
|
||||
// Region scope commands
|
||||
} else if (memcmp(config, "region ", 7) == 0) {
|
||||
const char* name = &config[7];
|
||||
if (strcmp(name, "none") == 0 || strcmp(name, "clear") == 0 || name[0] == '\0') {
|
||||
memset(_prefs.default_scope_name, 0, sizeof(_prefs.default_scope_name));
|
||||
memset(_prefs.default_scope_key, 0, sizeof(_prefs.default_scope_key));
|
||||
savePrefs();
|
||||
Serial.println(" > region cleared (unscoped)");
|
||||
} else if (strlen(name) < 31) {
|
||||
strncpy(_prefs.default_scope_name, name, sizeof(_prefs.default_scope_name));
|
||||
_prefs.default_scope_name[30] = '\0';
|
||||
TransportKey key;
|
||||
deriveScopeKey(name, key);
|
||||
memcpy(_prefs.default_scope_key, key.key, sizeof(_prefs.default_scope_key));
|
||||
savePrefs();
|
||||
Serial.printf(" > region = %s\n", _prefs.default_scope_name);
|
||||
} else {
|
||||
Serial.println(" Error: region name too long (max 29 chars)");
|
||||
}
|
||||
} else if (memcmp(config, "channel.scope ", 14) == 0) {
|
||||
// set channel.scope <idx> <name> (or "set channel.scope <idx> none" to clear)
|
||||
int idx = atoi(&config[14]);
|
||||
const char* rest = strchr(&config[14], ' ');
|
||||
if (idx >= 0 && idx < MAX_GROUP_CHANNELS && rest) {
|
||||
rest++; // skip space
|
||||
ChannelDetails ch;
|
||||
if (getChannel(idx, ch) && ch.name[0] != '\0') {
|
||||
if (strcmp(rest, "none") == 0 || strcmp(rest, "clear") == 0) {
|
||||
memset(ch.scope_name, 0, sizeof(ch.scope_name));
|
||||
} else if (strlen(rest) < 31) {
|
||||
strncpy(ch.scope_name, rest, sizeof(ch.scope_name));
|
||||
ch.scope_name[30] = '\0';
|
||||
} else {
|
||||
Serial.println(" Error: scope name too long (max 29 chars)");
|
||||
cli_command[0] = 0;
|
||||
return;
|
||||
}
|
||||
setChannel(idx, ch);
|
||||
saveChannels();
|
||||
Serial.printf(" > %s scope = %s\n", ch.name,
|
||||
ch.scope_name[0] ? ch.scope_name : "(device default)");
|
||||
} else {
|
||||
Serial.printf(" Error: channel %d is empty\n", idx);
|
||||
}
|
||||
} else {
|
||||
Serial.println(" Usage: set channel.scope <idx> <name|none>");
|
||||
}
|
||||
|
||||
// Backlight control (T5S3 E-Paper Pro only)
|
||||
} else if (memcmp(config, "backlight ", 10) == 0) {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
@@ -2899,6 +3059,17 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
} else if (memcmp(cli_command, "clock sync ", 11) == 0) {
|
||||
uint32_t epoch = (uint32_t)strtoul(&cli_command[11], nullptr, 10);
|
||||
if (epoch > 1704067200UL && epoch < 2082758400UL) {
|
||||
// Adjust stored advert timestamps if clock jumps significantly
|
||||
uint32_t curr = getRTCClock()->getCurrentTime();
|
||||
if (advert_paths && epoch > curr + 60) {
|
||||
uint32_t delta = epoch - curr;
|
||||
for (int i = 0; i < ADVERT_PATH_TABLE_SIZE; i++) {
|
||||
if (advert_paths[i].recv_timestamp > 0) {
|
||||
advert_paths[i].recv_timestamp += delta;
|
||||
}
|
||||
}
|
||||
Serial.printf(" > adjusted advert timestamps by +%lu seconds\n", (unsigned long)delta);
|
||||
}
|
||||
getRTCClock()->setCurrentTime(epoch);
|
||||
Serial.printf(" > clock synced to %lu\n", (unsigned long)epoch);
|
||||
} else {
|
||||
@@ -2969,6 +3140,12 @@ void MyMesh::checkCLIRescueCmd() {
|
||||
Serial.println(" set preset <name|num> Apply radio preset");
|
||||
Serial.println(" set channel.add <name> Add hashtag channel");
|
||||
Serial.println(" set channel.del <idx> Delete channel by index");
|
||||
Serial.println("");
|
||||
Serial.println(" Regions:");
|
||||
Serial.println(" get/set region Device default region (e.g. au-nsw)");
|
||||
Serial.println(" set region none Clear default region (unscoped)");
|
||||
Serial.println(" get channel.scope <i> Show scope for channel i");
|
||||
Serial.println(" set channel.scope <i> <name|none>");
|
||||
#ifdef HAS_4G_MODEM
|
||||
Serial.println("");
|
||||
Serial.println(" 4G modem:");
|
||||
@@ -3142,20 +3319,29 @@ void MyMesh::checkSerialInterface() {
|
||||
} else if (_iter_started // check if our ContactsIterator is 'running'
|
||||
&& !_serial->isWriteBusy() // don't spam the Serial Interface too quickly!
|
||||
) {
|
||||
// Batch-fill: queue multiple contacts per loop iteration so the BLE
|
||||
// send queue stays saturated during sync. writeFrame() returns 0
|
||||
// when the queue is full, which naturally throttles us.
|
||||
ContactInfo contact;
|
||||
if (_iter.hasNext(this, contact)) {
|
||||
if (contact.lastmod > _iter_filter_since) { // apply the 'since' filter
|
||||
writeContactRespFrame(RESP_CODE_CONTACT, contact);
|
||||
if (contact.lastmod > _most_recent_lastmod) {
|
||||
_most_recent_lastmod = contact.lastmod; // save for the RESP_CODE_END_OF_CONTACTS frame
|
||||
bool done = false;
|
||||
int queued = 0;
|
||||
while (!done && queued < 8) { // up to 8 per iteration to avoid starving loop()
|
||||
if (_iter.hasNext(this, contact)) {
|
||||
if (contact.lastmod > _iter_filter_since) { // apply the 'since' filter
|
||||
if (writeContactRespFrame(RESP_CODE_CONTACT, contact) == 0) break; // queue full
|
||||
queued++;
|
||||
if (contact.lastmod > _most_recent_lastmod) {
|
||||
_most_recent_lastmod = contact.lastmod;
|
||||
}
|
||||
}
|
||||
} else { // EOF
|
||||
out_frame[0] = RESP_CODE_END_OF_CONTACTS;
|
||||
memcpy(&out_frame[1], &_most_recent_lastmod,
|
||||
4); // include the most recent lastmod, so app can update their 'since'
|
||||
_serial->writeFrame(out_frame, 5);
|
||||
_iter_started = false;
|
||||
done = true;
|
||||
}
|
||||
} else { // EOF
|
||||
out_frame[0] = RESP_CODE_END_OF_CONTACTS;
|
||||
memcpy(&out_frame[1], &_most_recent_lastmod,
|
||||
4); // include the most recent lastmod, so app can update their 'since'
|
||||
_serial->writeFrame(out_frame, 5);
|
||||
_iter_started = false;
|
||||
}
|
||||
//} else if (!_serial->isWriteBusy()) {
|
||||
// checkConnections(); // TODO - deprecate the 'Connections' stuff
|
||||
@@ -3249,6 +3435,13 @@ void MyMesh::stopDiscovery() {
|
||||
_discoveryActive = false;
|
||||
}
|
||||
|
||||
bool MyMesh::forceImportContact(const uint8_t* blob, uint8_t len) {
|
||||
_forceNextImport = true;
|
||||
bool ok = importContact(blob, len);
|
||||
if (!ok) _forceNextImport = false; // clear if importContact failed (no loopback queued)
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool MyMesh::addDiscoveredToContacts(int idx) {
|
||||
if (idx < 0 || idx >= _discoveredCount) return false;
|
||||
if (_discovered[idx].already_in_contacts) return true; // already there
|
||||
@@ -3257,7 +3450,7 @@ bool MyMesh::addDiscoveredToContacts(int idx) {
|
||||
uint8_t buf[256];
|
||||
int plen = getBlobByKey(_discovered[idx].contact.id.pub_key, PUB_KEY_SIZE, buf);
|
||||
if (plen > 0) {
|
||||
bool ok = importContact(buf, (uint8_t)plen);
|
||||
bool ok = forceImportContact(buf, (uint8_t)plen);
|
||||
if (ok) {
|
||||
_discovered[idx].already_in_contacts = true;
|
||||
dirty_contacts_expiry = futureMillis(LAZY_CONTACTS_WRITE_DELAY);
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
#include "AbstractUITask.h"
|
||||
|
||||
/*------------ Frame Protocol --------------*/
|
||||
#define FIRMWARE_VER_CODE 10
|
||||
#define FIRMWARE_VER_CODE 11
|
||||
|
||||
#ifndef FIRMWARE_BUILD_DATE
|
||||
#define FIRMWARE_BUILD_DATE "31 March 2026"
|
||||
#define FIRMWARE_BUILD_DATE "19 April 2026"
|
||||
#endif
|
||||
|
||||
#ifndef FIRMWARE_VERSION
|
||||
#define FIRMWARE_VERSION "Meck v1.6"
|
||||
#define FIRMWARE_VERSION "Meck v1.7"
|
||||
#endif
|
||||
|
||||
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
|
||||
@@ -82,7 +82,7 @@
|
||||
#define REQ_TYPE_GET_TELEMETRY_DATA 0x03
|
||||
|
||||
struct AdvertPath {
|
||||
uint8_t pubkey_prefix[7];
|
||||
uint8_t pubkey_prefix[8];
|
||||
uint8_t path_len;
|
||||
uint8_t type; // ADV_TYPE_* (Chat/Repeater/Room/Sensor)
|
||||
char name[32];
|
||||
@@ -131,6 +131,9 @@ public:
|
||||
int getContactBlob(const uint8_t key[], int key_len, uint8_t dest_buf[]) {
|
||||
return getBlobByKey(key, key_len, dest_buf);
|
||||
}
|
||||
// Force-add a contact from a raw advert blob, bypassing auto-add settings.
|
||||
// Used by Last Heard and Discovery when the user explicitly selects a node to add.
|
||||
bool forceImportContact(const uint8_t* blob, uint8_t len);
|
||||
|
||||
// Queue a sent channel message for BLE app sync
|
||||
void queueSentChannelMessage(uint8_t channel_idx, uint32_t timestamp, const char* sender, const char* text);
|
||||
@@ -168,6 +171,13 @@ public:
|
||||
bool setCustomPath(int contactIdx, const uint8_t* path, uint8_t pathLen, bool lock);
|
||||
void clearCustomPath(int contactIdx);
|
||||
|
||||
// Region scope helpers (public — used by SettingsScreen)
|
||||
// Derive a TransportKey from a region scope name (e.g. "au-nsw" → "#au-nsw" → SHA256 → key).
|
||||
// Returns true if name is non-empty and key was derived; false if name is empty (unscoped).
|
||||
bool deriveScopeKey(const char* scopeName, TransportKey& keyOut);
|
||||
// Look up per-channel scope name by GroupChannel secret match. Returns nullptr if no scope set.
|
||||
const char* getChannelScopeName(const mesh::GroupChannel& channel);
|
||||
|
||||
|
||||
protected:
|
||||
float getAirtimeBudgetFactor() const override;
|
||||
@@ -185,6 +195,7 @@ protected:
|
||||
uint8_t getPathHashSize() const override { return _prefs.path_hash_mode + 1; }
|
||||
void sendFloodScoped(const ContactInfo& recipient, mesh::Packet* pkt, uint32_t delay_millis=0) override;
|
||||
void sendFloodScoped(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t delay_millis=0) override;
|
||||
void sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint32_t delay_millis=0);
|
||||
|
||||
void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override;
|
||||
bool isAutoAddEnabled() const override;
|
||||
@@ -243,7 +254,7 @@ private:
|
||||
void writeOKFrame();
|
||||
void writeErrFrame(uint8_t err_code);
|
||||
void writeDisabledFrame();
|
||||
void writeContactRespFrame(uint8_t code, const ContactInfo &contact);
|
||||
size_t writeContactRespFrame(uint8_t code, const ContactInfo &contact);
|
||||
void updateContactFromFrame(ContactInfo &contact, uint32_t& last_mod, const uint8_t *frame, int len);
|
||||
void addToOfflineQueue(const uint8_t frame[], int len);
|
||||
int getFromOfflineQueue(uint8_t frame[]);
|
||||
@@ -261,6 +272,7 @@ private:
|
||||
NodePrefs _prefs;
|
||||
VoiceRawHandler _voiceHandler = nullptr;
|
||||
VoiceEnvelopeHandler _voiceEnvHandler = nullptr;
|
||||
mutable bool _forceNextImport = false;
|
||||
bool _deferSaves = false;
|
||||
uint32_t pending_login;
|
||||
uint32_t pending_status;
|
||||
@@ -305,8 +317,8 @@ private:
|
||||
AckTableEntry expected_ack_table[EXPECTED_ACK_TABLE_SIZE]; // circular table
|
||||
int next_ack_idx;
|
||||
|
||||
#define ADVERT_PATH_TABLE_SIZE 40
|
||||
AdvertPath advert_paths[ADVERT_PATH_TABLE_SIZE]; // circular table
|
||||
#define ADVERT_PATH_TABLE_SIZE 1000
|
||||
AdvertPath* advert_paths; // PSRAM-allocated in begin(), size = ADVERT_PATH_TABLE_SIZE
|
||||
|
||||
// Sent message repeat tracking
|
||||
#define SENT_TRACK_SIZE 4
|
||||
|
||||
@@ -40,12 +40,22 @@ struct NodePrefs { // persisted to file
|
||||
uint8_t auto_lock_minutes; // 0=disabled, 2/5/10/15/30=auto-lock after idle
|
||||
uint8_t hint_shown; // 0=show nav hint on boot, 1=already shown (dismiss permanently)
|
||||
uint8_t large_font; // 0=tiny (built-in 6x8), 1=larger (FreeSans9pt) — T-Deck Pro only
|
||||
uint8_t ui_font_style; // 0=Classic (FreeSans), 1=Noto Sans, 2=Montserrat
|
||||
uint8_t tx_fail_reset_threshold; // 0=disabled, 1-10, default 3
|
||||
uint8_t rx_fail_reboot_threshold; // 0=disabled, 1-10, default 3
|
||||
|
||||
// --- Region scope (MeshCore v1.15+ compatibility) ---
|
||||
// Device-wide default region for flood messages.
|
||||
// Empty default_scope_name = unscoped (legacy flood, reaches all repeaters).
|
||||
// When set, all flood sends use ROUTE_TYPE_TRANSPORT_FLOOD with transport
|
||||
// codes derived from this key. Per-channel scope (in ChannelDetails) takes
|
||||
// priority when set.
|
||||
char default_scope_name[31]; // e.g. "au-nsw", empty = unscoped
|
||||
uint8_t default_scope_key[16]; // TransportKey derived from "#" + name
|
||||
|
||||
// --- Font helpers (inline, no overhead) ---
|
||||
// Returns the DisplayDriver text-size index for "small/body" text.
|
||||
// T-Deck Pro: 0 = built-in 6×8, 1 = FreeSans9pt.
|
||||
// T-Deck Pro: 0 = built-in 6×8 (or 7pt with custom fonts), 1 = 9pt.
|
||||
// T5S3: both 0 and 1 are 12pt fonts (regular vs bold) with identical line
|
||||
// height, so large_font has no layout effect there.
|
||||
inline uint8_t smallTextSize() const {
|
||||
@@ -54,6 +64,8 @@ struct NodePrefs { // persisted to file
|
||||
|
||||
// Returns the virtual-coordinate line height matching smallTextSize().
|
||||
// T-Deck Pro size 0 → 9 (6×8 + 1px gap), size 1 → 11 (9pt ascent+descent).
|
||||
// With custom fonts (Noto 7pt, Montserrat 7pt), size 0 is slightly taller
|
||||
// than built-in 6×8 but fits within the 9-unit virtual grid.
|
||||
// T5S3 size 0/1 → same 12pt height → always 9 in virtual coords.
|
||||
inline int smallLineH() const {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
@@ -66,13 +78,16 @@ struct NodePrefs { // persisted to file
|
||||
// Returns the Y offset for selection highlight fillRect (T-Deck Pro only).
|
||||
// Size 0 (built-in font): cursor positions at top-left, +5 offset in
|
||||
// setCursor places text below → fillRect at y+5 aligns with text.
|
||||
// Size 1 (FreeSans9pt): cursor positions at baseline, ascenders render
|
||||
// Size 0 (custom 7pt fonts): baseline fonts, same behaviour as size 1.
|
||||
// Size 1 (9pt): cursor positions at baseline, ascenders render
|
||||
// upward → fillRect must start above baseline to cover ascenders.
|
||||
// T5S3: always 0 (both sizes use baseline fonts with highlight at y).
|
||||
inline int smallHighlightOff() const {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
return 0;
|
||||
#else
|
||||
// Custom 7pt fonts at textSize 0 use GFXfont (baseline rendering), not built-in
|
||||
if (ui_font_style > 0 && !large_font) return -2;
|
||||
return large_font ? -2 : 5;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "NotesScreen.h"
|
||||
#include "ContactsScreen.h"
|
||||
#include "ChannelScreen.h"
|
||||
#include "ChannelPickerScreen.h"
|
||||
#include "SettingsScreen.h"
|
||||
#include "RepeaterAdminScreen.h"
|
||||
#include "DiscoveryScreen.h"
|
||||
@@ -37,8 +38,10 @@
|
||||
static int composePos = 0; // Current wire-cost byte count
|
||||
static uint8_t composeChannelIdx = 0;
|
||||
static unsigned long lastComposeRefresh = 0;
|
||||
static unsigned long lastComposeKeystroke = 0;
|
||||
static bool composeNeedsRefresh = false;
|
||||
#define COMPOSE_REFRESH_INTERVAL 100 // ms before starting e-ink refresh after keypress (refresh itself takes ~644ms)
|
||||
#define COMPOSE_REFRESH_INTERVAL 700 // ms — must exceed e-ink partial refresh time (~644ms)
|
||||
#define COMPOSE_TYPING_PAUSE 250 // ms — wait this long after last keystroke before refreshing
|
||||
|
||||
// Phone dialer debounce — independent from compose/smsSuppressLoop to avoid
|
||||
// interfering with call view rendering and alert display
|
||||
@@ -683,6 +686,7 @@
|
||||
#include "NotesScreen.h"
|
||||
#include "ContactsScreen.h"
|
||||
#include "ChannelScreen.h"
|
||||
#include "ChannelPickerScreen.h"
|
||||
#include "SettingsScreen.h"
|
||||
#include "RepeaterAdminScreen.h"
|
||||
#include "DiscoveryScreen.h"
|
||||
@@ -804,6 +808,22 @@
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read up to 2 touch points — returns actual finger count (0, 1 or 2)
|
||||
static int readTouchMulti(int16_t* outX0, int16_t* outY0, int16_t* outX1, int16_t* outY1) {
|
||||
if (!gt911Ready) return 0;
|
||||
int16_t xs[2], ys[2];
|
||||
uint8_t count = gt911Touch.getPoint(xs, ys, 2);
|
||||
if (count == 0) return 0;
|
||||
if (display.isPortraitMode()) {
|
||||
*outX0 = xs[0]; *outY0 = ys[0];
|
||||
if (count >= 2) { *outX1 = xs[1]; *outY1 = ys[1]; }
|
||||
} else {
|
||||
*outX0 = ys[0]; *outY0 = EPD_HEIGHT - 1 - xs[0];
|
||||
if (count >= 2) { *outX1 = ys[1]; *outY1 = EPD_HEIGHT - 1 - xs[1]; }
|
||||
}
|
||||
return (int)count;
|
||||
}
|
||||
#endif
|
||||
|
||||
// --- Shared touch state machine variables ---
|
||||
@@ -828,6 +848,13 @@
|
||||
static bool touchCooldown = false;
|
||||
static unsigned long lastTouchEventMs = 0;
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// Two-finger tap detection state
|
||||
static bool twoFingerDown = false;
|
||||
static unsigned long twoFingerDownTime = 0;
|
||||
#define TWO_FINGER_TAP_MS 350 // max ms from first finger down to both up
|
||||
#endif
|
||||
|
||||
// Unified touch reader — returns physical screen coordinates
|
||||
static bool readTouch(int16_t* outX, int16_t* outY) {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
@@ -1088,7 +1115,7 @@ static void lastHeardToggleContact() {
|
||||
uint8_t blob[256];
|
||||
int blobLen = the_mesh.getContactBlob(entry->pubkey_prefix, 8, blob);
|
||||
if (blobLen > 0) {
|
||||
the_mesh.importContact(blob, blobLen);
|
||||
the_mesh.forceImportContact(blob, blobLen);
|
||||
the_mesh.scheduleLazyContactSave();
|
||||
char alertBuf[40];
|
||||
snprintf(alertBuf, sizeof(alertBuf), "Added: %s", entry->name);
|
||||
@@ -1148,7 +1175,7 @@ static void lastHeardToggleContact() {
|
||||
int row = (vy - gridY) / (tileH + gapY);
|
||||
if (row > 1) row = 1;
|
||||
|
||||
if (row == 0 && col == 0) { ui_task.gotoChannelScreen(); return 0; }
|
||||
if (row == 0 && col == 0) { ui_task.gotoChannelPickerScreen(); return 0; }
|
||||
if (row == 0 && col == 1) { ui_task.gotoContactsScreen(); return 0; }
|
||||
if (row == 0 && col == 2) { ui_task.gotoSettingsScreen(); return 0; }
|
||||
if (row == 1 && col == 0) { ui_task.gotoTextReader(); return 0; }
|
||||
@@ -1200,14 +1227,24 @@ static void lastHeardToggleContact() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Notes editing: tap → open keyboard for typing
|
||||
// Notes screen: mode-dependent touch
|
||||
if (ui_task.isOnNotesScreen()) {
|
||||
NotesScreen* notes = (NotesScreen*)ui_task.getNotesScreen();
|
||||
if (notes && notes->isEditing()) {
|
||||
if (notes) {
|
||||
if (notes->isInFileList()) {
|
||||
int result = notes->selectRowAtVY(vy);
|
||||
if (result == 1) { ui_task.forceRefresh(); return 0; } // Moved selection
|
||||
if (result == 2) return KEY_ENTER; // Same row — open
|
||||
return 0;
|
||||
}
|
||||
if (notes->isEditing()) {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
ui_task.showVirtualKeyboard(VKB_NOTES, "Edit Note", "", 137);
|
||||
ui_task.showVirtualKeyboard(VKB_NOTES, "Edit Note", "", 137);
|
||||
#endif
|
||||
return 0; // T-Deck Pro: keyboard handles typing directly
|
||||
return 0; // T-Deck Pro: keyboard handles typing directly
|
||||
}
|
||||
// READING, RENAMING, CONFIRM_DELETE: tap = confirm/enter
|
||||
return KEY_ENTER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1270,6 +1307,20 @@ static void lastHeardToggleContact() {
|
||||
return 0; // Tap on message area — consumed, no action
|
||||
}
|
||||
|
||||
// Channel picker screen: tap to select (T5S3: direct open, T-Deck Pro: highlight/activate)
|
||||
if (ui_task.isOnChannelPickerScreen()) {
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen();
|
||||
if (pick) {
|
||||
int result = pick->selectAtVxVy(vx, vy);
|
||||
if (result == 1) {
|
||||
ui_task.forceRefresh();
|
||||
return 0; // Moved cursor
|
||||
}
|
||||
if (result == 2) return KEY_ENTER; // Activate — wantsExit checked after injectKey
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Contacts screen: tap to select row, tap same row to activate
|
||||
// In select mode: tap same row toggles checkbox instead
|
||||
if (ui_task.isOnContactsScreen()) {
|
||||
@@ -1413,9 +1464,9 @@ static void lastHeardToggleContact() {
|
||||
return (dx < 0) ? 'd' : 'a'; // swipe left=next option, right=prev
|
||||
}
|
||||
|
||||
// Channel screen: horizontal swipe → a/d to switch channels
|
||||
// Channel screen: horizontal swipe → a/d to open channel picker
|
||||
if (ui_task.isOnChannelScreen() && horizontal) {
|
||||
return (dx < 0) ? 'd' : 'a'; // swipe left=next channel, right=prev
|
||||
return (dx < 0) ? 'd' : 'a'; // swipe left/right opens channel picker
|
||||
}
|
||||
|
||||
// Contacts screen: horizontal swipe → a/d to change filter
|
||||
@@ -1525,24 +1576,60 @@ static void lastHeardToggleContact() {
|
||||
}
|
||||
|
||||
// Contacts screen: long press
|
||||
// If NOT in select mode → enter select mode
|
||||
// If already in select mode → exit select mode
|
||||
// T-Deck Pro: toggle select mode (DM/admin handled by keyboard Enter)
|
||||
// T5S3: DM for chat contacts, admin for repeaters/rooms (no physical keyboard)
|
||||
// If in select mode, long press exits it on both platforms.
|
||||
if (ui_task.isOnContactsScreen()) {
|
||||
ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen();
|
||||
if (cs) {
|
||||
if (!cs->isInSelectMode()) {
|
||||
// Enter select mode on long press
|
||||
cs->enterSelectMode();
|
||||
if (cs->isInSelectMode()) {
|
||||
// Both platforms: long press exits select mode
|
||||
cs->exitSelectMode();
|
||||
ui_task.forceRefresh();
|
||||
Serial.println("Contacts: entered select mode (touch long press)");
|
||||
Serial.println("Contacts: exited select mode (touch long press)");
|
||||
return 0;
|
||||
}
|
||||
// Already in select mode: long press exits select mode on both platforms
|
||||
// (T-Deck Pro uses keyboard for actions; T5S3 can use CardKB if attached)
|
||||
cs->exitSelectMode();
|
||||
ui_task.forceRefresh();
|
||||
Serial.println("Contacts: exited select mode (touch long press)");
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// T5S3: long press = DM/admin/room action (primary interaction path)
|
||||
{
|
||||
int idx = cs->getSelectedContactIdx();
|
||||
uint8_t ctype = cs->getSelectedContactType();
|
||||
if (idx >= 0 && ctype == ADV_TYPE_CHAT) {
|
||||
if (ui_task.hasDMUnread(idx)) {
|
||||
char cname[32];
|
||||
cs->getSelectedContactName(cname, sizeof(cname));
|
||||
ui_task.clearDMUnread(idx);
|
||||
ui_task.gotoDMConversation(cname);
|
||||
return 0;
|
||||
}
|
||||
char dname[32];
|
||||
cs->getSelectedContactName(dname, sizeof(dname));
|
||||
char label[40];
|
||||
snprintf(label, sizeof(label), "DM: %s", dname);
|
||||
ui_task.showVirtualKeyboard(VKB_DM, label, "", 137, idx);
|
||||
return 0;
|
||||
} else if (idx >= 0 && ctype == ADV_TYPE_REPEATER) {
|
||||
ui_task.gotoRepeaterAdmin(idx);
|
||||
return 0;
|
||||
} else if (idx >= 0 && ctype == ADV_TYPE_ROOM) {
|
||||
ui_task.gotoRepeaterAdmin(idx);
|
||||
return 0;
|
||||
} else if (idx >= 0 && ui_task.hasDMUnread(idx)) {
|
||||
char cname[32];
|
||||
cs->getSelectedContactName(cname, sizeof(cname));
|
||||
ui_task.clearDMUnread(idx);
|
||||
ui_task.gotoDMConversation(cname);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
// T-Deck Pro: long press enters select mode
|
||||
cs->enterSelectMode();
|
||||
ui_task.forceRefresh();
|
||||
Serial.println("Contacts: entered select mode (touch long press)");
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
return KEY_ENTER;
|
||||
}
|
||||
@@ -1746,7 +1833,24 @@ void setup() {
|
||||
|
||||
#elif defined(ESP32)
|
||||
MESH_DEBUG_PRINTLN("setup() - ESP32 filesystem init - calling SPIFFS.begin()");
|
||||
SPIFFS.begin(true);
|
||||
if (!SPIFFS.begin(false)) {
|
||||
// First boot or corrupted partition — format required (can take 1-2 minutes)
|
||||
Serial.println("SPIFFS mount failed - formatting (this may take 1-2 minutes)...");
|
||||
if (disp) {
|
||||
disp->startFrame();
|
||||
disp->drawTextCentered(disp->width() / 2, 28, "Loading...");
|
||||
disp->setTextSize(1);
|
||||
disp->setColor(DisplayDriver::YELLOW);
|
||||
disp->drawTextCentered(disp->width() / 2, 52, "Formatting storage...");
|
||||
disp->drawTextCentered(disp->width() / 2, 65, "First boot - please wait - may take 1-2 mins");
|
||||
disp->endFrame();
|
||||
}
|
||||
if (!SPIFFS.begin(true)) {
|
||||
Serial.println("SPIFFS format FAILED!");
|
||||
} else {
|
||||
Serial.println("SPIFFS format complete");
|
||||
}
|
||||
}
|
||||
MESH_DEBUG_PRINTLN("setup() - SPIFFS.begin() done");
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -1994,13 +2098,17 @@ void setup() {
|
||||
}
|
||||
#endif
|
||||
|
||||
// RTC diagnostic + boot-time serial clock sync (T5S3 has no GPS)
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// RTC diagnostic + boot-time serial clock sync
|
||||
// Works on all Meck builds — T-Deck Pro has no hardware RTC and GPS may
|
||||
// not fix immediately; T5S3 has hardware RTC but it needs initial setting.
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro)
|
||||
{
|
||||
uint32_t rtcTime = rtc_clock.getCurrentTime();
|
||||
// Plausible range: Nov 2023 (1700000000) → May 2033 (2000000000)
|
||||
bool validTime = (rtcTime > 1700000000 && rtcTime < 2000000000);
|
||||
Serial.printf("setup() - RTC time: %lu (valid=%s)\n", rtcTime,
|
||||
rtcTime > 1700000000 ? "YES" : "NO");
|
||||
if (rtcTime < 1700000000) {
|
||||
validTime ? "YES" : "NO");
|
||||
if (!validTime) {
|
||||
// No valid time. If a USB host has the serial port open (Serial
|
||||
// evaluates true on ESP32-S3 native CDC), request an automatic
|
||||
// clock sync. The PlatformIO monitor filter "clock_sync" watches
|
||||
@@ -2666,7 +2774,9 @@ void loop() {
|
||||
ui_task.loop();
|
||||
} else {
|
||||
// Handle debounced screen refresh (compose, emoji picker, notes, or web reader text entry)
|
||||
if (composeNeedsRefresh && (millis() - lastComposeRefresh) >= COMPOSE_REFRESH_INTERVAL) {
|
||||
if (composeNeedsRefresh
|
||||
&& (millis() - lastComposeKeystroke) >= COMPOSE_TYPING_PAUSE
|
||||
&& (millis() - lastComposeRefresh) >= COMPOSE_REFRESH_INTERVAL) {
|
||||
if (composeMode) {
|
||||
if (emojiPickerMode) {
|
||||
drawEmojiPicker();
|
||||
@@ -2846,6 +2956,51 @@ void loop() {
|
||||
lastTouchSeenMs = now;
|
||||
}
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// Two-finger tap detection — must run before single-finger state machine
|
||||
// so it can suppress the single-finger path when two fingers are present.
|
||||
{
|
||||
int16_t x0, y0, x1, y1;
|
||||
int fingers = readTouchMulti(&x0, &y0, &x1, &y1);
|
||||
if (fingers >= 2) {
|
||||
if (!twoFingerDown) {
|
||||
twoFingerDown = true;
|
||||
twoFingerDownTime = now;
|
||||
}
|
||||
// Suppress single-finger tracking while two fingers are down
|
||||
lastTouchSeenMs = now;
|
||||
touchDown = false;
|
||||
longPressHandled = true; // prevent long-press triggering
|
||||
swipeHandled = true; // prevent swipe triggering
|
||||
} else if (twoFingerDown) {
|
||||
// Both fingers lifted — check if it was a quick tap
|
||||
if ((now - twoFingerDownTime) < TWO_FINGER_TAP_MS) {
|
||||
if (ui_task.isOnContactsScreen()) {
|
||||
ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen();
|
||||
if (cs) {
|
||||
if (cs->isInSelectMode()) {
|
||||
cs->exitSelectMode();
|
||||
Serial.println("[Touch] Two-finger tap: exited contacts select mode");
|
||||
} else {
|
||||
cs->enterSelectMode();
|
||||
Serial.println("[Touch] Two-finger tap: entered contacts select mode");
|
||||
}
|
||||
ui_task.forceRefresh();
|
||||
touchCooldown = true;
|
||||
lastTouchEventMs = now;
|
||||
}
|
||||
}
|
||||
}
|
||||
twoFingerDown = false;
|
||||
longPressHandled = false;
|
||||
swipeHandled = false;
|
||||
touchDown = false;
|
||||
touchCooldown = true;
|
||||
lastTouchEventMs = now;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bool fingerPresent = (now - lastTouchSeenMs) < TOUCH_LIFT_DEBOUNCE_MS;
|
||||
|
||||
if (touchCooldown) {
|
||||
@@ -2878,7 +3033,12 @@ void loop() {
|
||||
swipeHandled = true;
|
||||
char c = mapTouchSwipe(dx, dy);
|
||||
if (c) {
|
||||
ui_task.injectKey(c);
|
||||
// Channel screen: horizontal swipe opens picker instead of cycling
|
||||
if (ui_task.isOnChannelScreen() && (c == 'a' || c == 'd')) {
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
} else {
|
||||
ui_task.injectKey(c);
|
||||
}
|
||||
cpuPower.setBoost();
|
||||
}
|
||||
lastTouchEventMs = now;
|
||||
@@ -2897,6 +3057,13 @@ void loop() {
|
||||
ui_task.gotoContactsScreen();
|
||||
}
|
||||
}
|
||||
// Channel picker: check if long-press Enter was handled (wantsExit)
|
||||
if (ui_task.isOnChannelPickerScreen()) {
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen();
|
||||
if (pick && pick->wantsExit()) {
|
||||
ui_task.gotoChannelScreen(false);
|
||||
}
|
||||
}
|
||||
cpuPower.setBoost();
|
||||
}
|
||||
lastTouchEventMs = now;
|
||||
@@ -2916,6 +3083,13 @@ void loop() {
|
||||
ui_task.gotoContactsScreen();
|
||||
}
|
||||
}
|
||||
// Channel picker: check if Enter/Q was handled (wantsExit)
|
||||
if (ui_task.isOnChannelPickerScreen()) {
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen();
|
||||
if (pick && pick->wantsExit()) {
|
||||
ui_task.gotoChannelScreen(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
cpuPower.setBoost();
|
||||
lastTouchEventMs = now;
|
||||
@@ -2991,7 +3165,7 @@ void loop() {
|
||||
// ESC on home — no-op (already home)
|
||||
} else {
|
||||
switch (ckb) {
|
||||
case 'm': ui_task.gotoChannelScreen(); break;
|
||||
case 'm': ui_task.gotoChannelPickerScreen(); break;
|
||||
case 'c': ui_task.gotoContactsScreen(); break;
|
||||
case 'e': ui_task.gotoTextReader(); break;
|
||||
case 'n': ui_task.gotoNotesScreen(); break;
|
||||
@@ -3044,7 +3218,22 @@ void loop() {
|
||||
if (!handled) {
|
||||
// ESC → back (same as 'q' on T-Deck Pro) for all non-notes screens
|
||||
if (ckb == 0x1B) {
|
||||
ui_task.injectKey('q');
|
||||
// Channel picker: ESC goes home
|
||||
if (ui_task.isOnChannelPickerScreen()) {
|
||||
ui_task.gotoHomeScreen();
|
||||
// Channel screen: ESC goes to picker
|
||||
} else if (ui_task.isOnChannelScreen()) {
|
||||
ChannelScreen* chScr = (ChannelScreen*)ui_task.getChannelScreen();
|
||||
if (chScr && (chScr->isReplySelectMode() || chScr->isShowingPathOverlay())) {
|
||||
ui_task.injectKey('q'); // dismiss overlay/reply first
|
||||
} else if (chScr && chScr->isDMConversation()) {
|
||||
ui_task.injectKey('q'); // DM conversation → inbox (handled internally)
|
||||
} else {
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
}
|
||||
} else {
|
||||
ui_task.injectKey('q');
|
||||
}
|
||||
} else if (ckb == '\r') {
|
||||
// Enter key — screen-specific compose or select
|
||||
if (ui_task.isOnChannelScreen()) {
|
||||
@@ -3133,6 +3322,13 @@ void loop() {
|
||||
if (pe && pe->wantsExit()) {
|
||||
ui_task.gotoContactsScreen();
|
||||
}
|
||||
} else if (ui_task.isOnChannelPickerScreen()) {
|
||||
// Channel picker: Enter selects channel
|
||||
ui_task.injectKey('\r');
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen();
|
||||
if (pick && pick->wantsExit()) {
|
||||
ui_task.gotoChannelScreen(false);
|
||||
}
|
||||
} else {
|
||||
// All other screens: pass Enter through for native handling
|
||||
// (settings toggle, discovery add-contact, last heard, text reader, notes file list, etc.)
|
||||
@@ -3152,6 +3348,22 @@ void loop() {
|
||||
} else if ((ckb == 'q' || ckb == 'Q') && ui_task.isOnPathEditor()) {
|
||||
// Q on path editor → back to contacts
|
||||
ui_task.gotoContactsScreen();
|
||||
} else if ((ckb == 'q' || ckb == 'Q') && ui_task.isOnChannelPickerScreen()) {
|
||||
// Q on picker → home
|
||||
ui_task.gotoHomeScreen();
|
||||
} else if ((ckb == 'q' || ckb == 'Q') && ui_task.isOnChannelScreen()) {
|
||||
// Q on channel screen → picker (unless overlay/DM conversation)
|
||||
ChannelScreen* chScr = (ChannelScreen*)ui_task.getChannelScreen();
|
||||
if (chScr && (chScr->isReplySelectMode() || chScr->isShowingPathOverlay())) {
|
||||
ui_task.injectKey('q'); // dismiss overlay/reply first
|
||||
} else if (chScr && chScr->isDMConversation()) {
|
||||
ui_task.injectKey('q'); // DM conversation → inbox (handled internally)
|
||||
} else {
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
}
|
||||
} else if (ui_task.isOnChannelScreen() && (ckb == (char)0xF3 || ckb == (char)0xF4)) {
|
||||
// Channel screen: Left/Right arrows open picker
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
} else {
|
||||
switch (ckb) {
|
||||
case (char)0xF2: ui_task.injectKey('w'); break; // Up → scroll up
|
||||
@@ -3233,6 +3445,7 @@ void initKeyboard() {
|
||||
composeMode = false;
|
||||
composeNeedsRefresh = false;
|
||||
lastComposeRefresh = 0;
|
||||
lastComposeKeystroke = 0;
|
||||
} else {
|
||||
MESH_DEBUG_PRINTLN("setup() - Keyboard initialization failed!");
|
||||
}
|
||||
@@ -3301,7 +3514,7 @@ void handleKeyboardInput() {
|
||||
composeNeedsRefresh = false;
|
||||
} else {
|
||||
// Navigation - debounce (don't draw immediately, let loop handle it)
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3382,7 +3595,7 @@ void handleKeyboardInput() {
|
||||
}
|
||||
composeBuffer[composePos] = '\0';
|
||||
Serial.printf("Compose: Backspace, pos=%d\n", composePos);
|
||||
composeNeedsRefresh = true; // Use debounced refresh
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis(); // Use debounced refresh
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3422,7 +3635,7 @@ void handleKeyboardInput() {
|
||||
}
|
||||
}
|
||||
Serial.printf("Compose: Channel switched to %d\n", composeChannelIdx);
|
||||
composeNeedsRefresh = true; // Debounced refresh
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis(); // Debounced refresh
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3441,7 +3654,7 @@ void handleKeyboardInput() {
|
||||
composeChannelIdx = 0; // Wrap to first channel
|
||||
}
|
||||
Serial.printf("Compose: Channel switched to %d\n", composeChannelIdx);
|
||||
composeNeedsRefresh = true; // Debounced refresh
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis(); // Debounced refresh
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3460,7 +3673,7 @@ void handleKeyboardInput() {
|
||||
composeBuffer[composePos++] = key;
|
||||
composeBuffer[composePos] = '\0';
|
||||
Serial.printf("Compose: Added '%c', pos=%d\n", key, composePos);
|
||||
composeNeedsRefresh = true; // Use debounced refresh
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis(); // Use debounced refresh
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3573,15 +3786,15 @@ void handleKeyboardInput() {
|
||||
}
|
||||
// Regular backspace - delete before cursor
|
||||
ui_task.injectKey(key);
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
return;
|
||||
}
|
||||
|
||||
// Cursor navigation via Shift+WASD (produces uppercase)
|
||||
if (key == 'W') { notes->moveCursorUp(); composeNeedsRefresh = true; return; }
|
||||
if (key == 'A') { notes->moveCursorLeft(); composeNeedsRefresh = true; return; }
|
||||
if (key == 'S') { notes->moveCursorDown(); composeNeedsRefresh = true; return; }
|
||||
if (key == 'D') { notes->moveCursorRight(); composeNeedsRefresh = true; return; }
|
||||
if (key == 'W') { notes->moveCursorUp(); composeNeedsRefresh = true; lastComposeKeystroke = millis(); return; }
|
||||
if (key == 'A') { notes->moveCursorLeft(); composeNeedsRefresh = true; lastComposeKeystroke = millis(); return; }
|
||||
if (key == 'S') { notes->moveCursorDown(); composeNeedsRefresh = true; lastComposeKeystroke = millis(); return; }
|
||||
if (key == 'D') { notes->moveCursorRight(); composeNeedsRefresh = true; lastComposeKeystroke = millis(); return; }
|
||||
|
||||
// Q when buffer is empty or unchanged = exit (nothing to lose)
|
||||
if (key == 'q' && (notes->isEmpty() || !notes->isDirty())) {
|
||||
@@ -3594,14 +3807,14 @@ void handleKeyboardInput() {
|
||||
// Enter = newline (pass through with debounce)
|
||||
if (key == '\r') {
|
||||
ui_task.injectKey(key);
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
return;
|
||||
}
|
||||
|
||||
// All other printable chars (lowercase only - uppercase consumed by cursor nav)
|
||||
if (key >= 32 && key < 127) {
|
||||
ui_task.injectKey(key);
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
return;
|
||||
}
|
||||
return;
|
||||
@@ -3611,7 +3824,7 @@ void handleKeyboardInput() {
|
||||
if (notes->isRenaming()) {
|
||||
// All input goes to rename handler (debounced like editing)
|
||||
ui_task.injectKey(key);
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
if (!notes->isRenaming()) {
|
||||
// Exited rename mode (confirmed or cancelled)
|
||||
ui_task.forceRefresh();
|
||||
@@ -3649,7 +3862,7 @@ void handleKeyboardInput() {
|
||||
// R on a file = rename
|
||||
if (key == 'r') {
|
||||
if (notes->startRename()) {
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
lastComposeRefresh = millis() - COMPOSE_REFRESH_INTERVAL; // Trigger on next loop iteration
|
||||
}
|
||||
return;
|
||||
@@ -3659,7 +3872,7 @@ void handleKeyboardInput() {
|
||||
ui_task.injectKey(key);
|
||||
// Check if we just entered editing mode (new note via Enter)
|
||||
if (notes->isEditing()) {
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
lastComposeRefresh = millis(); // Draw after debounce interval, not immediately
|
||||
}
|
||||
return;
|
||||
@@ -3683,7 +3896,7 @@ void handleKeyboardInput() {
|
||||
// All other keys (Enter for edit, W/S for page nav)
|
||||
ui_task.injectKey(key);
|
||||
if (notes->isEditing()) {
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
lastComposeRefresh = millis(); // Draw after debounce interval, not immediately
|
||||
}
|
||||
return;
|
||||
@@ -3827,7 +4040,7 @@ void handleKeyboardInput() {
|
||||
smsScr->handleInput(key);
|
||||
if (smsScr->isComposing()) {
|
||||
// Still composing — debounced refresh
|
||||
composeNeedsRefresh = true;
|
||||
composeNeedsRefresh = true; lastComposeKeystroke = millis();
|
||||
lastComposeRefresh = millis();
|
||||
} else {
|
||||
// View changed (sent/cancelled) — immediate UITask refresh
|
||||
@@ -4050,9 +4263,9 @@ void handleKeyboardInput() {
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
// Go to channel message screen
|
||||
Serial.println("Opening channel messages");
|
||||
ui_task.gotoChannelScreen();
|
||||
// Go to channel picker (channel directory)
|
||||
Serial.println("Opening channel picker");
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
@@ -4209,7 +4422,7 @@ void handleKeyboardInput() {
|
||||
// Open settings (from home), or navigate down on channel/contacts/admin/web/map/discovery/lastheard
|
||||
if (ui_task.isOnChannelScreen() || ui_task.isOnContactsScreen() || ui_task.isOnRepeaterAdmin()
|
||||
|| ui_task.isOnDiscoveryScreen() || ui_task.isOnLastHeardScreen()
|
||||
|| ui_task.isOnPathEditor()
|
||||
|| ui_task.isOnPathEditor() || ui_task.isOnChannelPickerScreen()
|
||||
#ifdef MECK_WEB_READER
|
||||
|| ui_task.isOnWebReader()
|
||||
#endif
|
||||
@@ -4229,7 +4442,7 @@ void handleKeyboardInput() {
|
||||
// Navigate up/previous (scroll on channel screen)
|
||||
if (ui_task.isOnChannelScreen() || ui_task.isOnContactsScreen() || ui_task.isOnRepeaterAdmin()
|
||||
|| ui_task.isOnDiscoveryScreen() || ui_task.isOnLastHeardScreen()
|
||||
|| ui_task.isOnPathEditor()
|
||||
|| ui_task.isOnPathEditor() || ui_task.isOnChannelPickerScreen()
|
||||
#ifdef MECK_WEB_READER
|
||||
|| ui_task.isOnWebReader()
|
||||
#endif
|
||||
@@ -4246,14 +4459,16 @@ void handleKeyboardInput() {
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
// Navigate left or switch channel (on channel screen)
|
||||
if (ui_task.isOnChannelScreen() || ui_task.isOnContactsScreen() || ui_task.isOnMapScreen()
|
||||
|| ui_task.isOnPathEditor()
|
||||
// Navigate left — channel screen opens picker, others pass through
|
||||
if (ui_task.isOnChannelScreen()) {
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
} else if (ui_task.isOnContactsScreen() || ui_task.isOnMapScreen()
|
||||
|| ui_task.isOnPathEditor() || ui_task.isOnChannelPickerScreen()
|
||||
#ifdef MECK_AUDIO_VARIANT
|
||||
|| ui_task.isOnAlarmScreen()
|
||||
#endif
|
||||
) {
|
||||
ui_task.injectKey('a'); // Pass directly for channel/contacts switching
|
||||
ui_task.injectKey('a'); // Pass directly for contacts/map/picker navigation
|
||||
} else {
|
||||
Serial.println("Nav: Previous");
|
||||
ui_task.injectKey(0xF2); // KEY_PREV
|
||||
@@ -4261,14 +4476,16 @@ void handleKeyboardInput() {
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
// Navigate right or switch channel (on channel screen)
|
||||
if (ui_task.isOnChannelScreen() || ui_task.isOnContactsScreen() || ui_task.isOnMapScreen()
|
||||
|| ui_task.isOnPathEditor()
|
||||
// Navigate right — channel screen opens picker, others pass through
|
||||
if (ui_task.isOnChannelScreen()) {
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
} else if (ui_task.isOnContactsScreen() || ui_task.isOnMapScreen()
|
||||
|| ui_task.isOnPathEditor() || ui_task.isOnChannelPickerScreen()
|
||||
#ifdef MECK_AUDIO_VARIANT
|
||||
|| ui_task.isOnAlarmScreen()
|
||||
#endif
|
||||
) {
|
||||
ui_task.injectKey('d'); // Pass directly for channel/contacts switching
|
||||
ui_task.injectKey('d'); // Pass directly for contacts/map/picker navigation
|
||||
} else {
|
||||
Serial.println("Nav: Next");
|
||||
ui_task.injectKey(0xF1); // KEY_NEXT
|
||||
@@ -4285,6 +4502,12 @@ void handleKeyboardInput() {
|
||||
Serial.println("PathEditor: Save & Exit — returning to contacts");
|
||||
ui_task.gotoContactsScreen();
|
||||
}
|
||||
} else if (ui_task.isOnChannelPickerScreen()) {
|
||||
ui_task.injectKey('\r'); // Picker handles Enter: selects channel + sets wantsExit
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen();
|
||||
if (pick && pick->wantsExit()) {
|
||||
ui_task.gotoChannelScreen(false);
|
||||
}
|
||||
} else if (ui_task.isOnContactsScreen()) {
|
||||
// Defer Enter for long-press detection (select mode vs DM/admin)
|
||||
contactsEnterPending = true;
|
||||
@@ -4498,6 +4721,12 @@ void handleKeyboardInput() {
|
||||
ui_task.injectKey('q');
|
||||
break;
|
||||
}
|
||||
// DM inbox Q is handled by ChannelScreen (returns false → falls here).
|
||||
// DM conversation Q is handled internally (returns true → never reaches here).
|
||||
// Normal channel view or DM inbox: go back to picker.
|
||||
Serial.println("Nav: Channel -> Picker");
|
||||
ui_task.gotoChannelPickerScreen();
|
||||
break;
|
||||
}
|
||||
#ifdef MECK_WEB_READER
|
||||
// If web reader is in reading/link/wifi mode, inject q for internal navigation
|
||||
@@ -4558,6 +4787,12 @@ void handleKeyboardInput() {
|
||||
ui_task.gotoHomeScreen();
|
||||
break;
|
||||
}
|
||||
// Channel picker: Q goes back to home
|
||||
if (ui_task.isOnChannelPickerScreen()) {
|
||||
Serial.println("Nav: ChannelPicker -> Home");
|
||||
ui_task.gotoHomeScreen();
|
||||
break;
|
||||
}
|
||||
// Go back to home screen (admin mode handled above)
|
||||
Serial.println("Nav: Back to home");
|
||||
ui_task.gotoHomeScreen();
|
||||
|
||||
@@ -1388,7 +1388,7 @@ public:
|
||||
display.setCursor(display.width() - display.getTextWidth(rtCh) - 2, footerY);
|
||||
display.print(rtCh);
|
||||
} else {
|
||||
display.print("Swipe:Ch/Scroll");
|
||||
display.print("Swipe:List/Scroll");
|
||||
const char* midCh = "Tap:Path";
|
||||
display.setCursor((display.width() - display.getTextWidth(midCh)) / 2, footerY);
|
||||
display.print(midCh);
|
||||
@@ -1413,10 +1413,14 @@ public:
|
||||
display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY);
|
||||
display.print(rightText);
|
||||
} else {
|
||||
display.print("Q:Bck A/D:Ch R:Rply");
|
||||
const char* rightText = "Ent:New";
|
||||
display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY);
|
||||
display.print(rightText);
|
||||
display.print("Q:Bk A/D:List R:Rply");
|
||||
// "Ent:New" only fits with Classic+TINY — wider fonts cause overlap
|
||||
NodePrefs* _fp = the_mesh.getNodePrefs();
|
||||
if (_fp->ui_font_style == 0 && !_fp->large_font) {
|
||||
const char* rightText = " Ent:New";
|
||||
display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY);
|
||||
display.print(rightText);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1632,81 +1636,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// A - previous channel (includes DM tab at 0xFF)
|
||||
if (c == 'a' || c == 'A') {
|
||||
// A/D - open channel picker (handled by main.cpp — return false to pass through)
|
||||
if (c == 'a' || c == 'A' || c == 'd' || c == 'D') {
|
||||
_replySelectMode = false;
|
||||
_replySelectPos = -1;
|
||||
if (_viewChannelIdx == 0xFF) {
|
||||
// DM tab → go to last valid group channel
|
||||
for (uint8_t i = MAX_GROUP_CHANNELS - 1; i > 0; i--) {
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(i, ch) && ch.name[0] != '\0') {
|
||||
_viewChannelIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (_viewChannelIdx > 0) {
|
||||
// Skip backwards over any empty/gap slots
|
||||
uint8_t prev = _viewChannelIdx - 1;
|
||||
bool found = false;
|
||||
while (true) {
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(prev, ch) && ch.name[0] != '\0') {
|
||||
_viewChannelIdx = prev;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (prev == 0) break;
|
||||
prev--;
|
||||
}
|
||||
if (!found) {
|
||||
// No valid channel below → wrap to DM tab
|
||||
_viewChannelIdx = 0xFF;
|
||||
_dmInboxMode = true;
|
||||
_dmInboxScroll = 0;
|
||||
_dmFilterName[0] = '\0';
|
||||
}
|
||||
} else {
|
||||
// Channel 0 → wrap to DM tab
|
||||
_viewChannelIdx = 0xFF;
|
||||
_dmInboxMode = true;
|
||||
_dmInboxScroll = 0;
|
||||
_dmFilterName[0] = '\0';
|
||||
}
|
||||
_scrollPos = 0;
|
||||
markChannelRead(_viewChannelIdx);
|
||||
return true;
|
||||
}
|
||||
|
||||
// D - next channel (includes DM tab at 0xFF)
|
||||
if (c == 'd' || c == 'D') {
|
||||
_replySelectMode = false;
|
||||
_replySelectPos = -1;
|
||||
if (_viewChannelIdx == 0xFF) {
|
||||
// DM tab → wrap to channel 0
|
||||
_viewChannelIdx = 0;
|
||||
} else {
|
||||
// Skip forward over any empty/gap slots
|
||||
bool found = false;
|
||||
for (uint8_t next = _viewChannelIdx + 1; next < MAX_GROUP_CHANNELS; next++) {
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(next, ch) && ch.name[0] != '\0') {
|
||||
_viewChannelIdx = next;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
// Past last channel → go to DM tab
|
||||
_viewChannelIdx = 0xFF;
|
||||
_dmInboxMode = true;
|
||||
_dmInboxScroll = 0;
|
||||
_dmFilterName[0] = '\0';
|
||||
}
|
||||
}
|
||||
_scrollPos = 0;
|
||||
markChannelRead(_viewChannelIdx);
|
||||
return true;
|
||||
return false; // Let main.cpp open the channel picker
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,436 @@
|
||||
#pragma once
|
||||
|
||||
#include <helpers/ui/UIScreen.h>
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
#include <helpers/ChannelDetails.h>
|
||||
#include <MeshCore.h>
|
||||
#include "ChannelScreen.h"
|
||||
|
||||
#ifndef MAX_GROUP_CHANNELS
|
||||
#define MAX_GROUP_CHANNELS 20
|
||||
#endif
|
||||
|
||||
class UITask; // Forward declaration
|
||||
class MyMesh; // Forward declaration
|
||||
extern MyMesh the_mesh;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ChannelPickerScreen
|
||||
// ---------------------------------------------------------------------------
|
||||
// A directory-style screen that lists every group channel + the DM inbox,
|
||||
// each with an unread-message badge. Selecting an entry jumps to the channel
|
||||
// messages screen pre-targeted at that channel.
|
||||
//
|
||||
// Replaces the A/D channel-cycling model in ChannelScreen. Pressing A or D
|
||||
// (or swiping left/right on T5S3) from the messages screen now opens the
|
||||
// picker instead of paging one channel at a time.
|
||||
//
|
||||
// Rendering:
|
||||
// T5S3 E-Paper Pro : vertical list of outlined "bubble" rows (full-width,
|
||||
// name left-aligned, unread badge right-aligned).
|
||||
// Matches the P4 channel picker aesthetic. 1-tap opens.
|
||||
// T-Deck Pro / MAX : vertical list with "> " cursor, unread badge, right-
|
||||
// aligned. Same highlight/tap convention as Contacts.
|
||||
//
|
||||
// Navigation signals use a wantsExit() flag (same pattern as PathEditor) —
|
||||
// UITask is only forward-declared, so the picker cannot call UITask methods
|
||||
// directly. main.cpp / UITask.cpp check the flag after injectKey().
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class ChannelPickerScreen : public UIScreen {
|
||||
UITask* _task;
|
||||
ChannelScreen* _channelScreen;
|
||||
|
||||
// Ordered list of items.
|
||||
// Index 0 is always the DM inbox (channel_idx == 0xFF).
|
||||
// Remaining entries are populated group channels in ascending slot order.
|
||||
uint8_t _items[MAX_GROUP_CHANNELS + 1];
|
||||
int _itemCount;
|
||||
|
||||
int _cursor;
|
||||
int _scrollTop; // Scroll offset (T-Deck Pro list only)
|
||||
|
||||
// Grid layout cache (T5S3) — set in render(), consumed by touch hit test
|
||||
int _cellW;
|
||||
int _cellH;
|
||||
int _gridTop;
|
||||
int _gridCols;
|
||||
|
||||
// Rebuild the items list from MyMesh. O(20), safe every render.
|
||||
void rebuildItems() {
|
||||
int n = 0;
|
||||
uint8_t tmp[MAX_GROUP_CHANNELS + 1];
|
||||
tmp[n++] = 0xFF; // DM inbox always first
|
||||
for (uint8_t i = 0; i < MAX_GROUP_CHANNELS; i++) {
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(i, ch) && ch.name[0] != '\0') {
|
||||
if (n < MAX_GROUP_CHANNELS + 1) tmp[n++] = i;
|
||||
}
|
||||
}
|
||||
memcpy(_items, tmp, n);
|
||||
_itemCount = n;
|
||||
if (_cursor >= _itemCount) _cursor = _itemCount - 1;
|
||||
if (_cursor < 0) _cursor = 0;
|
||||
}
|
||||
|
||||
void getItemName(int idx, char* buf, size_t bufLen) const {
|
||||
if (idx < 0 || idx >= _itemCount || bufLen == 0) { if (bufLen) buf[0] = '\0'; return; }
|
||||
uint8_t c = _items[idx];
|
||||
if (c == 0xFF) {
|
||||
strncpy(buf, "Direct Messages", bufLen - 1);
|
||||
buf[bufLen - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(c, ch) && ch.name[0] != '\0') {
|
||||
strncpy(buf, ch.name, bufLen - 1);
|
||||
buf[bufLen - 1] = '\0';
|
||||
} else {
|
||||
snprintf(buf, bufLen, "Ch %d", (int)c);
|
||||
}
|
||||
}
|
||||
|
||||
int getItemUnread(int idx) const {
|
||||
if (idx < 0 || idx >= _itemCount || !_channelScreen) return 0;
|
||||
return _channelScreen->getUnreadForChannel(_items[idx]);
|
||||
}
|
||||
|
||||
public:
|
||||
ChannelPickerScreen(UITask* task)
|
||||
: _task(task), _channelScreen(nullptr),
|
||||
_itemCount(0), _cursor(0), _scrollTop(0),
|
||||
_cellW(40), _cellH(12), _gridTop(14), _gridCols(3),
|
||||
_wantExit(false) {
|
||||
_items[0] = 0xFF;
|
||||
}
|
||||
|
||||
void setChannelScreen(ChannelScreen* cs) { _channelScreen = cs; }
|
||||
|
||||
// --- wantsExit flag — checked by main.cpp / UITask after injectKey() ---
|
||||
bool _wantExit;
|
||||
bool wantsExit() const { return _wantExit; }
|
||||
|
||||
// Called by UITask::gotoChannelPickerScreen().
|
||||
void enter(uint8_t currentChannelIdx) {
|
||||
rebuildItems();
|
||||
_cursor = 0;
|
||||
for (int i = 0; i < _itemCount; i++) {
|
||||
if (_items[i] == currentChannelIdx) { _cursor = i; break; }
|
||||
}
|
||||
_scrollTop = 0;
|
||||
_wantExit = false;
|
||||
}
|
||||
|
||||
uint8_t getSelectedChannel() const {
|
||||
if (_cursor >= 0 && _cursor < _itemCount) return _items[_cursor];
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Render
|
||||
// -----------------------------------------------------------------------
|
||||
int render(DisplayDriver& display) override {
|
||||
rebuildItems();
|
||||
|
||||
// === Header ===
|
||||
display.setCursor(0, 0);
|
||||
display.setTextSize(1);
|
||||
display.setColor(DisplayDriver::GREEN);
|
||||
display.print("Channels");
|
||||
|
||||
int totalUnread = 0;
|
||||
for (int i = 0; i < _itemCount; i++) totalUnread += getItemUnread(i);
|
||||
char tmp[24];
|
||||
if (totalUnread > 0) {
|
||||
snprintf(tmp, sizeof(tmp), "*%d", totalUnread);
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), "[%d]", _itemCount);
|
||||
}
|
||||
display.setCursor(display.width() - display.getTextWidth(tmp) - 2, 0);
|
||||
display.print(tmp);
|
||||
display.drawRect(0, 11, display.width(), 1);
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// =================================================================
|
||||
// T5S3: Vertical bubble list (matches P4 channel picker aesthetic)
|
||||
// Full-width outlined bubbles with channel name left-aligned and
|
||||
// unread badge right-aligned. 1-tap opens the channel.
|
||||
// =================================================================
|
||||
const int headerH = 14;
|
||||
const int footerH = 14;
|
||||
const int bodyH = display.height() - headerH - footerH;
|
||||
const int bubbleH = 11; // Bubble height in virtual coords
|
||||
const int gap = 2; // Gap between bubbles
|
||||
const int padX = 3; // Horizontal padding from screen edge
|
||||
const int bubbleW = display.width() - 2 * padX;
|
||||
int maxVisible = bodyH / (bubbleH + gap);
|
||||
if (maxVisible < 3) maxVisible = 3;
|
||||
if (maxVisible > _itemCount) maxVisible = _itemCount;
|
||||
|
||||
// Cache layout for touch hit test
|
||||
_cellW = bubbleW;
|
||||
_cellH = bubbleH + gap;
|
||||
_gridTop = headerH;
|
||||
_gridCols = 1; // Single column — list mode
|
||||
|
||||
// Centre scroll window on cursor
|
||||
_scrollTop = max(0, min(_cursor - maxVisible / 2, _itemCount - maxVisible));
|
||||
if (_scrollTop < 0) _scrollTop = 0;
|
||||
int endIdx = min(_itemCount, _scrollTop + maxVisible);
|
||||
|
||||
for (int i = _scrollTop; i < endIdx; i++) {
|
||||
int row = i - _scrollTop;
|
||||
int x = padX;
|
||||
int y = headerH + row * (bubbleH + gap) + 1;
|
||||
int w = bubbleW;
|
||||
int h = bubbleH;
|
||||
|
||||
bool selected = (i == _cursor);
|
||||
int unread = getItemUnread(i);
|
||||
|
||||
// Bubble: filled if selected, outlined otherwise
|
||||
if (selected) {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.fillRect(x, y, w, h);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
} else {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.drawRect(x, y, w, h);
|
||||
// Draw a second outline 1px inset for a bolder border
|
||||
display.drawRect(x + 1, y + 1, w - 2, h - 2);
|
||||
}
|
||||
|
||||
// Channel name — left-aligned with inner padding
|
||||
char name[32];
|
||||
getItemName(i, name, sizeof(name));
|
||||
char filtered[32];
|
||||
display.translateUTF8ToBlocks(filtered, name, sizeof(filtered));
|
||||
|
||||
int textY = y + (h - 9) / 2;
|
||||
if (textY < y + 1) textY = y + 1;
|
||||
int textX = x + 4;
|
||||
|
||||
// Badge width reservation
|
||||
int badgeW = 0;
|
||||
char badge[8];
|
||||
if (unread > 0) {
|
||||
if (unread > 99) snprintf(badge, sizeof(badge), "99+");
|
||||
else snprintf(badge, sizeof(badge), "*%d", unread);
|
||||
badgeW = display.getTextWidth(badge) + 4;
|
||||
}
|
||||
int nameMaxW = w - 8 - badgeW;
|
||||
if (nameMaxW < 8) nameMaxW = 8;
|
||||
|
||||
int nameW = display.getTextWidth(filtered);
|
||||
if (nameW <= nameMaxW) {
|
||||
display.setCursor(textX, textY);
|
||||
display.print(filtered);
|
||||
} else {
|
||||
display.drawTextEllipsized(textX, textY, nameMaxW, filtered);
|
||||
}
|
||||
|
||||
// Unread badge — right-aligned inside bubble
|
||||
if (unread > 0) {
|
||||
int bx = x + w - badgeW;
|
||||
display.setCursor(bx, textY);
|
||||
display.print(badge);
|
||||
}
|
||||
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
}
|
||||
|
||||
// Scroll indicator (if more items than visible)
|
||||
if (_itemCount > maxVisible) {
|
||||
const int sbW = 3;
|
||||
int sbX = display.width() - sbW;
|
||||
int sbTop = headerH;
|
||||
int sbHeight = bodyH;
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.drawRect(sbX, sbTop, sbW, sbHeight);
|
||||
int thumbH = (maxVisible * sbHeight) / _itemCount;
|
||||
if (thumbH < 4) thumbH = 4;
|
||||
int maxScroll = _itemCount - maxVisible;
|
||||
if (maxScroll < 1) maxScroll = 1;
|
||||
int thumbY = sbTop + (_scrollTop * (sbHeight - thumbH)) / maxScroll;
|
||||
display.fillRect(sbX + 1, thumbY + 1, sbW - 2, thumbH - 2);
|
||||
}
|
||||
|
||||
#else
|
||||
// =================================================================
|
||||
// T-Deck Pro / MAX: Vertical list
|
||||
// Uses NodePrefs font helpers for large_font compatibility.
|
||||
// =================================================================
|
||||
NodePrefs* prefs = the_mesh.getNodePrefs();
|
||||
int lineH = prefs->smallLineH();
|
||||
const int headerH = 14;
|
||||
const int footerH = 14;
|
||||
int maxY = display.height() - footerH;
|
||||
int y = headerH;
|
||||
int maxVisible = (maxY - headerH) / lineH;
|
||||
if (maxVisible < 3) maxVisible = 3;
|
||||
|
||||
// Centre scroll window on cursor
|
||||
_scrollTop = max(0, min(_cursor - maxVisible / 2, _itemCount - maxVisible));
|
||||
if (_scrollTop < 0) _scrollTop = 0;
|
||||
int endIdx = min(_itemCount, _scrollTop + maxVisible);
|
||||
|
||||
display.setTextSize(prefs->smallTextSize());
|
||||
|
||||
for (int i = _scrollTop; i < endIdx && y + lineH <= maxY; i++) {
|
||||
bool selected = (i == _cursor);
|
||||
int unread = getItemUnread(i);
|
||||
|
||||
if (selected) {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.fillRect(0, y + prefs->smallHighlightOff(), display.width(), lineH);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
} else {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
}
|
||||
|
||||
display.setCursor(0, y);
|
||||
|
||||
// Prefix: "> " for selected, " " otherwise. "*N" badge if unread.
|
||||
char prefix[8];
|
||||
if (unread > 0) {
|
||||
snprintf(prefix, sizeof(prefix), "%s*%d ", selected ? ">" : " ", unread);
|
||||
} else {
|
||||
snprintf(prefix, sizeof(prefix), "%s ", selected ? ">" : " ");
|
||||
}
|
||||
display.print(prefix);
|
||||
|
||||
// Name
|
||||
char name[32];
|
||||
getItemName(i, name, sizeof(name));
|
||||
char filtered[32];
|
||||
display.translateUTF8ToBlocks(filtered, name, sizeof(filtered));
|
||||
|
||||
int nameX = display.getTextWidth(prefix) + 2;
|
||||
int nameMaxW = display.width() - nameX - 2;
|
||||
display.drawTextEllipsized(nameX, y, nameMaxW, filtered);
|
||||
|
||||
y += lineH;
|
||||
}
|
||||
|
||||
// Scroll indicator
|
||||
if (_itemCount > maxVisible) {
|
||||
const int sbW = 3;
|
||||
int sbX = display.width() - sbW;
|
||||
int sbTop = headerH;
|
||||
int sbHeight = maxY - headerH;
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.drawRect(sbX, sbTop, sbW, sbHeight);
|
||||
int thumbH = (maxVisible * sbHeight) / _itemCount;
|
||||
if (thumbH < 4) thumbH = 4;
|
||||
int maxScroll = _itemCount - maxVisible;
|
||||
if (maxScroll < 1) maxScroll = 1;
|
||||
int thumbY = sbTop + (_scrollTop * (sbHeight - thumbH)) / maxScroll;
|
||||
display.fillRect(sbX + 1, thumbY + 1, sbW - 2, thumbH - 2);
|
||||
}
|
||||
#endif
|
||||
|
||||
// === Footer ===
|
||||
display.setTextSize(1);
|
||||
int footerY = display.height() - 12;
|
||||
display.drawRect(0, footerY - 2, display.width(), 1);
|
||||
display.setColor(DisplayDriver::YELLOW);
|
||||
display.setCursor(0, footerY);
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
display.print("Tap:Open");
|
||||
const char* rt = "Boot:Back";
|
||||
display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY);
|
||||
display.print(rt);
|
||||
#else
|
||||
display.print("W/S:Nav Q:Back");
|
||||
const char* rt = "Ent:Open";
|
||||
display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY);
|
||||
display.print(rt);
|
||||
#endif
|
||||
|
||||
#ifdef USE_EINK
|
||||
return 5000;
|
||||
#else
|
||||
return 1000;
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Input
|
||||
// -----------------------------------------------------------------------
|
||||
bool handleInput(char c) override {
|
||||
// W / UP
|
||||
if (c == 'w' || c == 'W' || c == 0xF2 || c == KEY_UP) {
|
||||
if (_cursor > 0) { _cursor--; return true; }
|
||||
return false;
|
||||
}
|
||||
|
||||
// S / DOWN
|
||||
if (c == 's' || c == 'S' || c == 0xF1 || c == KEY_DOWN) {
|
||||
if (_cursor < _itemCount - 1) { _cursor++; return true; }
|
||||
return false;
|
||||
}
|
||||
|
||||
// A / D — consumed (no channel cycling from picker)
|
||||
if (c == 'a' || c == 'A' || c == KEY_LEFT) {
|
||||
return true;
|
||||
}
|
||||
if (c == 'd' || c == 'D' || c == KEY_RIGHT) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Enter — select the highlighted channel and signal exit
|
||||
if (c == '\r' || c == 13 || c == KEY_ENTER || c == KEY_SELECT) {
|
||||
if (_channelScreen && _cursor >= 0 && _cursor < _itemCount) {
|
||||
_channelScreen->setViewChannelIdx(_items[_cursor]);
|
||||
}
|
||||
_wantExit = true;
|
||||
return true; // Consumed — caller checks wantsExit() and navigates
|
||||
}
|
||||
|
||||
// Q / backspace — cancel without changing channel, signal exit
|
||||
if (c == 'q' || c == 'Q' || c == '\b' || c == KEY_CANCEL) {
|
||||
_wantExit = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Touch hit test (virtual coordinates)
|
||||
// Returns: 0=miss, 1=cursor moved, 2=activate.
|
||||
// T5S3 bubbles: any tap on a bubble → 2 (direct open).
|
||||
// T-Deck Pro list: 1st tap → 1 (highlight), 2nd tap same row → 2.
|
||||
// -----------------------------------------------------------------------
|
||||
int selectAtVxVy(int vx, int vy) {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// Vertical bubble list hit test
|
||||
if (vy < _gridTop || _cellH == 0) return 0;
|
||||
int footerY = 128 - 14;
|
||||
if (vy >= footerY) return 0;
|
||||
int row = (vy - _gridTop) / _cellH;
|
||||
int idx = _scrollTop + row;
|
||||
if (idx < 0 || idx >= _itemCount) return 0;
|
||||
_cursor = idx;
|
||||
return 2; // Direct open on tap
|
||||
#else
|
||||
// T-Deck Pro / MAX list hit test — uses NodePrefs for large_font compatibility
|
||||
NodePrefs* prefs = the_mesh.getNodePrefs();
|
||||
int lineH = prefs->smallLineH();
|
||||
const int headerH = 14;
|
||||
const int footerH = 14;
|
||||
int bodyTop = headerH + prefs->smallHighlightOff();
|
||||
if (vy < bodyTop || vy >= 128 - footerH) return 0;
|
||||
int maxVisible = (128 - headerH - footerH) / lineH;
|
||||
if (maxVisible < 3) maxVisible = 3;
|
||||
int startIdx = max(0, min(_cursor - maxVisible / 2, _itemCount - maxVisible));
|
||||
if (startIdx < 0) startIdx = 0;
|
||||
int tappedRow = startIdx + (vy - bodyTop) / lineH;
|
||||
if (tappedRow < 0 || tappedRow >= _itemCount) return 0;
|
||||
if (tappedRow == _cursor) return 2;
|
||||
_cursor = tappedRow;
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
@@ -4,7 +4,11 @@
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
#include <MeshCore.h>
|
||||
|
||||
// Forward declarations
|
||||
// Timestamps before this (Jan 1 2026 UTC) are treated as invalid/unsynced
|
||||
#define EPOCH_2026 1735689600UL
|
||||
|
||||
// Forward declarations — MyMesh.h (which defines AdvertPath) is always
|
||||
// included by the translation unit before this header.
|
||||
class UITask;
|
||||
class MyMesh;
|
||||
extern MyMesh the_mesh;
|
||||
@@ -33,8 +37,10 @@ private:
|
||||
// We rebuild this on filter change or when entering the screen
|
||||
// Arrays allocated in PSRAM when available (supports 1000+ contacts)
|
||||
uint16_t* _filteredIdx; // indices into contact table
|
||||
uint32_t* _filteredTs; // cached last_advert_timestamp for sorting
|
||||
uint32_t* _filteredTs; // cached lastmod for sorting
|
||||
int _filteredCount; // how many contacts match current filter
|
||||
AdvertPath _hopBuf[40]; // recently heard advert paths for hop-count display
|
||||
int _hopBufCount;
|
||||
bool _cacheValid;
|
||||
|
||||
// How many rows fit on screen (computed during render)
|
||||
@@ -61,12 +67,12 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
static char typeChar(uint8_t adv_type) {
|
||||
static const char* typeStr(uint8_t adv_type) {
|
||||
switch (adv_type) {
|
||||
case ADV_TYPE_CHAT: return 'C';
|
||||
case ADV_TYPE_REPEATER: return 'R';
|
||||
case ADV_TYPE_ROOM: return 'S'; // Server
|
||||
default: return '?';
|
||||
case ADV_TYPE_CHAT: return "C";
|
||||
case ADV_TYPE_REPEATER: return "R";
|
||||
case ADV_TYPE_ROOM: return "RS";
|
||||
default: return "?";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,12 +98,13 @@ private:
|
||||
if (the_mesh.getContactByIdx(i, contact)) {
|
||||
if (matchesFilter(contact.type, contact.flags)) {
|
||||
_filteredIdx[_filteredCount] = (uint16_t)i;
|
||||
_filteredTs[_filteredCount] = contact.last_advert_timestamp;
|
||||
// Use lastmod (our receive time) for sort/age; pre-2026 or zero → 0 sinks to bottom
|
||||
_filteredTs[_filteredCount] = (contact.lastmod >= EPOCH_2026) ? contact.lastmod : 0;
|
||||
_filteredCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Sort by last_advert_timestamp descending (most recently seen first)
|
||||
// Sort by lastmod descending (most recently heard first; pre-2026/unsynced sink to bottom)
|
||||
// Insertion sort — fine for up to ~1000 entries on ESP32
|
||||
for (int i = 1; i < _filteredCount; i++) {
|
||||
uint16_t tmpIdx = _filteredIdx[i];
|
||||
@@ -112,28 +119,29 @@ private:
|
||||
_filteredTs[j + 1] = tmpTs;
|
||||
}
|
||||
_cacheValid = true;
|
||||
// Refresh hop-count cache from the 12 most recently heard adverts
|
||||
_hopBufCount = the_mesh.getRecentlyHeard(_hopBuf, 40);
|
||||
// Clamp scroll position
|
||||
if (_scrollPos >= _filteredCount) {
|
||||
_scrollPos = (_filteredCount > 0) ? _filteredCount - 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Format seconds-ago as compact string: "3s" "5m" "2h" "4d" "??"
|
||||
// Format seconds-ago as compact string: "3s" "5m" "2h" "4d" "--"
|
||||
static void formatAge(char* buf, size_t bufLen, uint32_t now, uint32_t timestamp) {
|
||||
if (timestamp == 0) {
|
||||
if (timestamp == 0 || timestamp < EPOCH_2026 || now < timestamp) {
|
||||
strncpy(buf, "--", bufLen);
|
||||
return;
|
||||
}
|
||||
int secs = (int)(now - timestamp);
|
||||
if (secs < 0) secs = 0;
|
||||
uint32_t secs = now - timestamp;
|
||||
if (secs < 60) {
|
||||
snprintf(buf, bufLen, "%ds", secs);
|
||||
snprintf(buf, bufLen, "%ds", (int)secs);
|
||||
} else if (secs < 3600) {
|
||||
snprintf(buf, bufLen, "%dm", secs / 60);
|
||||
snprintf(buf, bufLen, "%dm", (int)(secs / 60));
|
||||
} else if (secs < 86400) {
|
||||
snprintf(buf, bufLen, "%dh", secs / 3600);
|
||||
snprintf(buf, bufLen, "%dh", (int)(secs / 3600));
|
||||
} else {
|
||||
snprintf(buf, bufLen, "%dd", secs / 86400);
|
||||
snprintf(buf, bufLen, "%dd", (int)(secs / 86400));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,7 +160,7 @@ public:
|
||||
ContactsScreen(UITask* task, mesh::RTCClock* rtc)
|
||||
: _task(task), _rtc(rtc), _scrollPos(0), _filter(FILTER_ALL),
|
||||
_filteredCount(0), _cacheValid(false), _rowsPerPage(5),
|
||||
_selectMode(false) {
|
||||
_selectMode(false), _hopBufCount(0) {
|
||||
#if defined(ESP32) && defined(BOARD_HAS_PSRAM)
|
||||
_filteredIdx = (uint16_t*)ps_calloc(MAX_CONTACTS, sizeof(uint16_t));
|
||||
_filteredTs = (uint32_t*)ps_calloc(MAX_CONTACTS, sizeof(uint32_t));
|
||||
@@ -362,15 +370,15 @@ public:
|
||||
display.setCursor(0, y);
|
||||
|
||||
// Prefix: select mode uses * for selected, normal uses > for cursor
|
||||
char prefix[4];
|
||||
char prefix[5];
|
||||
if (_selectMode) {
|
||||
snprintf(prefix, sizeof(prefix), "%c%c",
|
||||
snprintf(prefix, sizeof(prefix), "%c%s",
|
||||
sel ? '*' : (selected ? '>' : ' '),
|
||||
typeChar(contact.type));
|
||||
typeStr(contact.type));
|
||||
} else if (selected) {
|
||||
snprintf(prefix, sizeof(prefix), ">%c", typeChar(contact.type));
|
||||
snprintf(prefix, sizeof(prefix), ">%s", typeStr(contact.type));
|
||||
} else {
|
||||
snprintf(prefix, sizeof(prefix), " %c", typeChar(contact.type));
|
||||
snprintf(prefix, sizeof(prefix), " %s", typeStr(contact.type));
|
||||
}
|
||||
display.print(prefix);
|
||||
|
||||
@@ -381,7 +389,22 @@ public:
|
||||
// Reserve space for hops + age on right side
|
||||
char hopStr[6];
|
||||
if (contact.out_path_len == 0xFF) {
|
||||
strcpy(hopStr, "?"); // unknown path
|
||||
// No confirmed direct path — look up flood hop estimate from recent advert cache
|
||||
hopStr[0] = '?'; hopStr[1] = '\0'; // default
|
||||
for (int h = 0; h < _hopBufCount; h++) {
|
||||
if (memcmp(contact.id.pub_key, _hopBuf[h].pubkey_prefix, 7) == 0) {
|
||||
uint8_t bph = (_hopBuf[h].path_len >> 6) + 1;
|
||||
uint8_t hops = _hopBuf[h].path_len & 0x3F;
|
||||
uint8_t max_hops = 64 / bph; // sanity cap based on path encoding
|
||||
if (hops <= max_hops) {
|
||||
if (hops == 0)
|
||||
strcpy(hopStr, "~D");
|
||||
else
|
||||
snprintf(hopStr, sizeof(hopStr), "~%d", (int)hops);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (contact.out_path_len == 0) {
|
||||
bool customDirect = (contact.flags & CONTACT_FLAG_CUSTOM_PATH) != 0;
|
||||
strcpy(hopStr, customDirect ? "D*" : "D");
|
||||
@@ -396,7 +419,7 @@ public:
|
||||
}
|
||||
|
||||
char ageStr[6];
|
||||
formatAge(ageStr, sizeof(ageStr), now, contact.last_advert_timestamp);
|
||||
formatAge(ageStr, sizeof(ageStr), now, contact.lastmod);
|
||||
|
||||
// Build right-side string: "*N hops age" if unread, else "hops age"
|
||||
int dmCount = (_dmUnread && _filteredIdx[i] < MAX_CONTACTS) ? _dmUnread[_filteredIdx[i]] : 0;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// Emoji sprites for e-ink display - dual size
|
||||
// Large (12x12) for compose/picker, Small (10x10) for channel view
|
||||
// MSB-first, 2 bytes per row
|
||||
// 65 total emoji: joy/thumbsup/frown first, then 43 original, then 19 new
|
||||
// 76 total emoji: joy/thumbsup/frown first, then 43 original, then 19 new, then 11 newest
|
||||
|
||||
#include <stdint.h>
|
||||
#ifdef ESP32
|
||||
@@ -15,11 +15,11 @@
|
||||
#define EMOJI_SM_W 10
|
||||
#define EMOJI_SM_H 10
|
||||
|
||||
#define EMOJI_COUNT 65
|
||||
#define EMOJI_COUNT 76
|
||||
|
||||
// Escape codes in 0x80+ range - safe from keyboard ASCII (32-126)
|
||||
#define EMOJI_ESCAPE_START 0x80
|
||||
#define EMOJI_ESCAPE_END 0xC0 // 0x80 + 64
|
||||
#define EMOJI_ESCAPE_END 0xCB // 0x80 + 75
|
||||
#define EMOJI_PAD_BYTE 0x7F // DEL, not typeable (key < 127 guard)
|
||||
|
||||
// ======== LARGE 12x12 SPRITES ========
|
||||
@@ -36,6 +36,14 @@ static const uint8_t emoji_lg_thumbsup[] PROGMEM = {
|
||||
static const uint8_t emoji_lg_frown[] PROGMEM = {
|
||||
0x1F,0x80, 0x20,0x40, 0x59,0xA0, 0x59,0xA0, 0x80,0x10, 0x9F,0x90, 0xA0,0x50, 0x40,0x20, 0x20,0x40, 0x1F,0x80, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [65] loudly_crying 😭
|
||||
static const uint8_t emoji_lg_loudly_crying[] PROGMEM = {
|
||||
0x1F,0x80, 0x20,0x40, 0x5B,0x40, 0x5B,0x20, 0x80,0x10, 0x9F,0x10, 0xA0,0x90, 0x60,0xC0, 0xA0,0xA0, 0x1F,0x00, 0x40,0x40, 0x00,0x00,
|
||||
};
|
||||
// [66] heart ♥️
|
||||
static const uint8_t emoji_lg_heart[] PROGMEM = {
|
||||
0x00,0x00, 0x73,0x80, 0xFF,0xC0, 0xFF,0xC0, 0xFF,0xC0, 0x7F,0x80, 0x3F,0x00, 0x1E,0x00, 0x0C,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [3] wireless
|
||||
static const uint8_t emoji_lg_wireless[] PROGMEM = {
|
||||
0x00,0x00, 0x3F,0xC0, 0x60,0x60, 0xC0,0x30, 0x0F,0x00, 0x19,0x80, 0x30,0xC0, 0x00,0x00, 0x06,0x00, 0x0F,0x00, 0x06,0x00, 0x00,0x00,
|
||||
@@ -284,23 +292,68 @@ static const uint8_t emoji_lg_tipping[] PROGMEM = {
|
||||
static const uint8_t emoji_lg_hedgehog[] PROGMEM = {
|
||||
0x00,0x00, 0x0A,0x80, 0x15,0x40, 0x2A,0xA0, 0x55,0x60, 0x7E,0xF0, 0xDB,0x90, 0xFF,0xD0, 0x7F,0xE0, 0x3F,0xC0, 0x24,0x80, 0x00,0x00,
|
||||
};
|
||||
// [67] diamond_suit ♦️
|
||||
static const uint8_t emoji_lg_diamond_suit[] PROGMEM = {
|
||||
0x00,0x00, 0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x3F,0x80, 0x7F,0xC0, 0x3F,0x80, 0x1F,0x00, 0x0E,0x00, 0x04,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [68] spade_suit ♠️
|
||||
static const uint8_t emoji_lg_spade_suit[] PROGMEM = {
|
||||
0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x3F,0x80, 0x7F,0xC0, 0xFF,0xE0, 0xFF,0xE0, 0x7F,0xC0, 0x15,0x00, 0x04,0x00, 0x0E,0x00, 0x00,0x00,
|
||||
};
|
||||
// [69] pizza 🍕
|
||||
static const uint8_t emoji_lg_pizza[] PROGMEM = {
|
||||
0x02,0x00, 0x06,0x00, 0x0F,0x00, 0x0B,0x00, 0x1F,0x80, 0x1D,0x80, 0x3F,0xC0, 0x2F,0x40, 0x7F,0xE0, 0x7F,0xE0, 0xFF,0xF0, 0x00,0x00,
|
||||
};
|
||||
// [70] four_leaf_clover 🍀
|
||||
static const uint8_t emoji_lg_four_leaf_clover[] PROGMEM = {
|
||||
0x0C,0x00, 0x1E,0x00, 0x1E,0x00, 0x6D,0x80, 0xF3,0xC0, 0xF3,0xC0, 0x6D,0x80, 0x1E,0x00, 0x1E,0x00, 0x0C,0x00, 0x06,0x00, 0x00,0x00,
|
||||
};
|
||||
// [71] cloud ☁️
|
||||
static const uint8_t emoji_lg_cloud[] PROGMEM = {
|
||||
0x00,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x80, 0xFF,0xC0, 0xFF,0xE0, 0xFF,0xE0, 0x7F,0xC0, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [72] rocket 🚀
|
||||
static const uint8_t emoji_lg_rocket[] PROGMEM = {
|
||||
0x04,0x00, 0x0E,0x00, 0x1F,0x00, 0x1B,0x00, 0x1B,0x00, 0x3F,0x80, 0x7F,0xC0, 0x5F,0x40, 0x9F,0x20, 0x0E,0x00, 0x15,0x00, 0x00,0x00,
|
||||
};
|
||||
// [73] passport_control 🛂
|
||||
static const uint8_t emoji_lg_passport_control[] PROGMEM = {
|
||||
0x3F,0xC0, 0x40,0x20, 0x46,0x20, 0x4F,0x20, 0x46,0x20, 0x40,0x20, 0x44,0x20, 0x4E,0x20, 0x5F,0x20, 0x40,0x20, 0x3F,0xC0, 0x00,0x00,
|
||||
};
|
||||
// [74] eight_spoked_asterisk ✳️
|
||||
static const uint8_t emoji_lg_eight_spoked_asterisk[] PROGMEM = {
|
||||
0x7F,0xE0, 0x84,0x10, 0xA4,0x90, 0x95,0x10, 0x8E,0x10, 0xFF,0xD0, 0x8E,0x10, 0x95,0x10, 0xA4,0x90, 0x84,0x10, 0x7F,0xE0, 0x00,0x00,
|
||||
};
|
||||
// [75] signal_strength 📶
|
||||
static const uint8_t emoji_lg_signal_strength[] PROGMEM = {
|
||||
0x00,0x20, 0x00,0x20, 0x00,0xA0, 0x00,0xA0, 0x02,0xA0, 0x02,0xA0, 0x0A,0xA0, 0x0A,0xA0, 0x2A,0xA0, 0x2A,0xA0, 0xAA,0xA0, 0xAA,0xA0,
|
||||
};
|
||||
|
||||
|
||||
static const uint8_t* const EMOJI_SPRITES_LG[] PROGMEM = {
|
||||
emoji_lg_joy, emoji_lg_thumbsup, emoji_lg_frown,
|
||||
// Faces/emotion first
|
||||
emoji_lg_joy, emoji_lg_frown, emoji_lg_loudly_crying,
|
||||
emoji_lg_grimace, emoji_lg_zany_face, emoji_lg_cowboy,
|
||||
// Thumbsup + heart
|
||||
emoji_lg_thumbsup, emoji_lg_heart,
|
||||
// Everything else in original relative order
|
||||
emoji_lg_wireless, emoji_lg_infinity, emoji_lg_trex, emoji_lg_skull, emoji_lg_cross,
|
||||
emoji_lg_lightning, emoji_lg_tophat, emoji_lg_motorcycle, emoji_lg_seedling, emoji_lg_flag_au,
|
||||
emoji_lg_umbrella, emoji_lg_nazar, emoji_lg_globe, emoji_lg_radioactive, emoji_lg_cow,
|
||||
emoji_lg_alien, emoji_lg_invader, emoji_lg_dagger, emoji_lg_grimace,
|
||||
emoji_lg_alien, emoji_lg_invader, emoji_lg_dagger,
|
||||
emoji_lg_mountain, emoji_lg_end_arrow, emoji_lg_hollow_circle, emoji_lg_dragon, emoji_lg_globe_meridians,
|
||||
emoji_lg_eggplant, emoji_lg_shield, emoji_lg_goggles, emoji_lg_lizard, emoji_lg_zany_face,
|
||||
emoji_lg_eggplant, emoji_lg_shield, emoji_lg_goggles, emoji_lg_lizard,
|
||||
emoji_lg_kangaroo, emoji_lg_feather, emoji_lg_bright, emoji_lg_part_alt, emoji_lg_motorboat,
|
||||
emoji_lg_domino, emoji_lg_satellite, emoji_lg_customs, emoji_lg_cowboy, emoji_lg_wheel,
|
||||
emoji_lg_domino, emoji_lg_satellite, emoji_lg_customs, emoji_lg_wheel,
|
||||
emoji_lg_koala, emoji_lg_control_knobs, emoji_lg_peach, emoji_lg_racing_car,
|
||||
emoji_lg_mouse, emoji_lg_mushroom, emoji_lg_biohazard, emoji_lg_panda,
|
||||
emoji_lg_anger, emoji_lg_dragon_face, emoji_lg_pager, emoji_lg_bee,
|
||||
emoji_lg_bulb, emoji_lg_cat, emoji_lg_fleur, emoji_lg_moon,
|
||||
emoji_lg_coffee, emoji_lg_tooth, emoji_lg_pretzel, emoji_lg_abacus,
|
||||
emoji_lg_moai, emoji_lg_tipping, emoji_lg_hedgehog,
|
||||
emoji_lg_diamond_suit, emoji_lg_spade_suit, emoji_lg_pizza, emoji_lg_four_leaf_clover,
|
||||
emoji_lg_cloud, emoji_lg_rocket, emoji_lg_passport_control,
|
||||
emoji_lg_eight_spoked_asterisk, emoji_lg_signal_strength,
|
||||
};
|
||||
|
||||
// ======== SMALL 10x10 SPRITES ========
|
||||
@@ -519,94 +572,160 @@ static const uint8_t emoji_sm_tipping[] PROGMEM = {
|
||||
static const uint8_t emoji_sm_hedgehog[] PROGMEM = {
|
||||
0x15,0x00, 0x2A,0x80, 0x55,0x40, 0xFF,0xC0, 0xDB,0x40, 0xFF,0x80, 0x7F,0x80, 0x3F,0x00, 0x24,0x00, 0x00,0x00,
|
||||
};
|
||||
// [65] loudly_crying 😭
|
||||
static const uint8_t emoji_sm_loudly_crying[] PROGMEM = {
|
||||
0x3E,0x00, 0x41,0x00, 0xB6,0x80, 0x80,0x40, 0xBE,0x40, 0x81,0x40, 0x63,0x00, 0x9C,0x80, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [66] heart ♥️
|
||||
static const uint8_t emoji_sm_heart[] PROGMEM = {
|
||||
0x00,0x00, 0x6C,0x00, 0xFE,0x00, 0xFE,0x00, 0x7C,0x00, 0x38,0x00, 0x10,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [67] diamond_suit ♦️
|
||||
static const uint8_t emoji_sm_diamond_suit[] PROGMEM = {
|
||||
0x00,0x00, 0x08,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x00, 0x3E,0x00, 0x1C,0x00, 0x08,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [68] spade_suit ♠️
|
||||
static const uint8_t emoji_sm_spade_suit[] PROGMEM = {
|
||||
0x08,0x00, 0x1C,0x00, 0x3E,0x00, 0x7F,0x00, 0xFF,0x80, 0xFF,0x80, 0x2A,0x00, 0x08,0x00, 0x1C,0x00, 0x00,0x00,
|
||||
};
|
||||
// [69] pizza 🍕
|
||||
static const uint8_t emoji_sm_pizza[] PROGMEM = {
|
||||
0x08,0x00, 0x1C,0x00, 0x14,0x00, 0x3E,0x00, 0x36,0x00, 0x6D,0x00, 0x7F,0x00, 0xFF,0x80, 0xFF,0x80, 0x00,0x00,
|
||||
};
|
||||
// [70] four_leaf_clover 🍀
|
||||
static const uint8_t emoji_sm_four_leaf_clover[] PROGMEM = {
|
||||
0x18,0x00, 0x3C,0x00, 0xDB,0x00, 0xE7,0x00, 0xE7,0x00, 0xDB,0x00, 0x3C,0x00, 0x18,0x00, 0x0C,0x00, 0x00,0x00,
|
||||
};
|
||||
// [71] cloud ☁️
|
||||
static const uint8_t emoji_sm_cloud[] PROGMEM = {
|
||||
0x00,0x00, 0x38,0x00, 0x7E,0x00, 0xFF,0x00, 0xFF,0x80, 0xFF,0x80, 0x7F,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
|
||||
};
|
||||
// [72] rocket 🚀
|
||||
static const uint8_t emoji_sm_rocket[] PROGMEM = {
|
||||
0x08,0x00, 0x1C,0x00, 0x36,0x00, 0x36,0x00, 0x7F,0x00, 0xBE,0x80, 0x3E,0x00, 0x1C,0x00, 0x2A,0x00, 0x00,0x00,
|
||||
};
|
||||
// [73] passport_control 🛂
|
||||
static const uint8_t emoji_sm_passport_control[] PROGMEM = {
|
||||
0x7F,0x80, 0x80,0x40, 0x8C,0x40, 0x9E,0x40, 0x8C,0x40, 0x80,0x40, 0x9C,0x40, 0xBE,0x40, 0x80,0x40, 0x7F,0x80,
|
||||
};
|
||||
// [74] eight_spoked_asterisk ✳️
|
||||
static const uint8_t emoji_sm_eight_spoked_asterisk[] PROGMEM = {
|
||||
0x7F,0x80, 0x84,0x40, 0xA5,0x40, 0x9E,0x40, 0xFF,0xC0, 0x9E,0x40, 0xA5,0x40, 0x84,0x40, 0x7F,0x80, 0x00,0x00,
|
||||
};
|
||||
// [75] signal_strength 📶
|
||||
static const uint8_t emoji_sm_signal_strength[] PROGMEM = {
|
||||
0x00,0x80, 0x00,0x80, 0x02,0x80, 0x02,0x80, 0x0A,0x80, 0x0A,0x80, 0x2A,0x80, 0x2A,0x80, 0xAA,0x80, 0xAA,0x80,
|
||||
};
|
||||
|
||||
static const uint8_t* const EMOJI_SPRITES_SM[] PROGMEM = {
|
||||
emoji_sm_joy, emoji_sm_thumbsup, emoji_sm_frown,
|
||||
// Faces/emotion first
|
||||
emoji_sm_joy, emoji_sm_frown, emoji_sm_loudly_crying,
|
||||
emoji_sm_grimace, emoji_sm_zany_face, emoji_sm_cowboy,
|
||||
// Thumbsup + heart
|
||||
emoji_sm_thumbsup, emoji_sm_heart,
|
||||
// Everything else in original relative order
|
||||
emoji_sm_wireless, emoji_sm_infinity, emoji_sm_trex, emoji_sm_skull, emoji_sm_cross,
|
||||
emoji_sm_lightning, emoji_sm_tophat, emoji_sm_motorcycle, emoji_sm_seedling, emoji_sm_flag_au,
|
||||
emoji_sm_umbrella, emoji_sm_nazar, emoji_sm_globe, emoji_sm_radioactive, emoji_sm_cow,
|
||||
emoji_sm_alien, emoji_sm_invader, emoji_sm_dagger, emoji_sm_grimace,
|
||||
emoji_sm_alien, emoji_sm_invader, emoji_sm_dagger,
|
||||
emoji_sm_mountain, emoji_sm_end_arrow, emoji_sm_hollow_circle, emoji_sm_dragon, emoji_sm_globe_meridians,
|
||||
emoji_sm_eggplant, emoji_sm_shield, emoji_sm_goggles, emoji_sm_lizard, emoji_sm_zany_face,
|
||||
emoji_sm_eggplant, emoji_sm_shield, emoji_sm_goggles, emoji_sm_lizard,
|
||||
emoji_sm_kangaroo, emoji_sm_feather, emoji_sm_bright, emoji_sm_part_alt, emoji_sm_motorboat,
|
||||
emoji_sm_domino, emoji_sm_satellite, emoji_sm_customs, emoji_sm_cowboy, emoji_sm_wheel,
|
||||
emoji_sm_domino, emoji_sm_satellite, emoji_sm_customs, emoji_sm_wheel,
|
||||
emoji_sm_koala, emoji_sm_control_knobs, emoji_sm_peach, emoji_sm_racing_car,
|
||||
emoji_sm_mouse, emoji_sm_mushroom, emoji_sm_biohazard, emoji_sm_panda,
|
||||
emoji_sm_anger, emoji_sm_dragon_face, emoji_sm_pager, emoji_sm_bee,
|
||||
emoji_sm_bulb, emoji_sm_cat, emoji_sm_fleur, emoji_sm_moon,
|
||||
emoji_sm_coffee, emoji_sm_tooth, emoji_sm_pretzel, emoji_sm_abacus,
|
||||
emoji_sm_moai, emoji_sm_tipping, emoji_sm_hedgehog,
|
||||
emoji_sm_diamond_suit, emoji_sm_spade_suit, emoji_sm_pizza, emoji_sm_four_leaf_clover,
|
||||
emoji_sm_cloud, emoji_sm_rocket, emoji_sm_passport_control,
|
||||
emoji_sm_eight_spoked_asterisk, emoji_sm_signal_strength,
|
||||
};
|
||||
|
||||
// ---- Codepoint lookup for UTF-8 conversion ----
|
||||
struct EmojiCodepoint { uint32_t cp; uint32_t cp2; uint8_t escape; };
|
||||
|
||||
static const EmojiCodepoint EMOJI_CODEPOINTS[EMOJI_COUNT] = {
|
||||
// Faces/emotion first
|
||||
{ 0x1F602, 0x0000, 0x80 }, // joy
|
||||
{ 0x1F44D, 0x0000, 0x81 }, // thumbsup
|
||||
{ 0x2639, 0x0000, 0x82 }, // frown
|
||||
{ 0x1F6DC, 0x0000, 0x83 }, // wireless
|
||||
{ 0x267E, 0x0000, 0x84 }, // infinity
|
||||
{ 0x1F996, 0x0000, 0x85 }, // trex
|
||||
{ 0x2620, 0x0000, 0x86 }, // skull
|
||||
{ 0x271D, 0x0000, 0x87 }, // cross
|
||||
{ 0x26A1, 0x0000, 0x88 }, // lightning
|
||||
{ 0x1F3A9, 0x0000, 0x89 }, // tophat
|
||||
{ 0x1F3CD, 0x0000, 0x8A }, // motorcycle
|
||||
{ 0x1F331, 0x0000, 0x8B }, // seedling
|
||||
{ 0x1F1E6, 0x1F1FA, 0x8C }, // flag_au
|
||||
{ 0x2602, 0x0000, 0x8D }, // umbrella
|
||||
{ 0x1F9FF, 0x0000, 0x8E }, // nazar
|
||||
{ 0x1F30F, 0x0000, 0x8F }, // globe
|
||||
{ 0x2622, 0x0000, 0x90 }, // radioactive
|
||||
{ 0x1F404, 0x0000, 0x91 }, // cow
|
||||
{ 0x1F47D, 0x0000, 0x92 }, // alien
|
||||
{ 0x1F47E, 0x0000, 0x93 }, // invader
|
||||
{ 0x1F5E1, 0x0000, 0x94 }, // dagger
|
||||
{ 0x1F62C, 0x0000, 0x95 }, // grimace
|
||||
{ 0x26F0, 0x0000, 0x96 }, // mountain
|
||||
{ 0x1F51A, 0x0000, 0x97 }, // end_arrow
|
||||
{ 0x2B55, 0x0000, 0x98 }, // hollow_circle
|
||||
{ 0x1F409, 0x0000, 0x99 }, // dragon
|
||||
{ 0x1F310, 0x0000, 0x9A }, // globe_meridians
|
||||
{ 0x1F346, 0x0000, 0x9B }, // eggplant
|
||||
{ 0x1F6E1, 0x0000, 0x9C }, // shield
|
||||
{ 0x1F97D, 0x0000, 0x9D }, // goggles
|
||||
{ 0x1F98E, 0x0000, 0x9E }, // lizard
|
||||
{ 0x1F92A, 0x0000, 0x9F }, // zany_face
|
||||
{ 0x1F998, 0x0000, 0xA0 }, // kangaroo
|
||||
{ 0x1FAB6, 0x0000, 0xA1 }, // feather
|
||||
{ 0x1F506, 0x0000, 0xA2 }, // bright
|
||||
{ 0x303D, 0x0000, 0xA3 }, // part_alt
|
||||
{ 0x1F6E5, 0x0000, 0xA4 }, // motorboat
|
||||
{ 0x1F030, 0x0000, 0xA5 }, // domino
|
||||
{ 0x1F4E1, 0x0000, 0xA6 }, // satellite
|
||||
{ 0x1F6C3, 0x0000, 0xA7 }, // customs
|
||||
{ 0x1F920, 0x0000, 0xA8 }, // cowboy
|
||||
{ 0x1F6DE, 0x0000, 0xA9 }, // wheel
|
||||
{ 0x1F428, 0x0000, 0xAA }, // koala
|
||||
{ 0x1F39B, 0x0000, 0xAB }, // control_knobs
|
||||
{ 0x1F351, 0x0000, 0xAC }, // peach
|
||||
{ 0x1F3CE, 0x0000, 0xAD }, // racing_car
|
||||
{ 0x1F42D, 0x0000, 0xAE }, // mouse
|
||||
{ 0x1F344, 0x0000, 0xAF }, // mushroom
|
||||
{ 0x2623, 0x0000, 0xB0 }, // biohazard
|
||||
{ 0x1F43C, 0x0000, 0xB1 }, // panda
|
||||
{ 0x1F4A2, 0x0000, 0xB2 }, // anger
|
||||
{ 0x1F432, 0x0000, 0xB3 }, // dragon_face
|
||||
{ 0x1F4DF, 0x0000, 0xB4 }, // pager
|
||||
{ 0x1F41D, 0x0000, 0xB5 }, // bee
|
||||
{ 0x1F4A1, 0x0000, 0xB6 }, // bulb
|
||||
{ 0x1F431, 0x0000, 0xB7 }, // cat
|
||||
{ 0x269C, 0x0000, 0xB8 }, // fleur
|
||||
{ 0x1F314, 0x0000, 0xB9 }, // moon
|
||||
{ 0x2615, 0x0000, 0xBA }, // coffee
|
||||
{ 0x1F9B7, 0x0000, 0xBB }, // tooth
|
||||
{ 0x1F968, 0x0000, 0xBC }, // pretzel
|
||||
{ 0x1F9EE, 0x0000, 0xBD }, // abacus
|
||||
{ 0x1F5FF, 0x0000, 0xBE }, // moai
|
||||
{ 0x1F481, 0x0000, 0xBF }, // tipping
|
||||
{ 0x1F994, 0x0000, 0xC0 }, // hedgehog
|
||||
{ 0x2639, 0x0000, 0x81 }, // frown
|
||||
{ 0x1F62D, 0x0000, 0x82 }, // loudly_crying
|
||||
{ 0x1F62C, 0x0000, 0x83 }, // grimace
|
||||
{ 0x1F92A, 0x0000, 0x84 }, // zany_face
|
||||
{ 0x1F920, 0x0000, 0x85 }, // cowboy
|
||||
// Thumbsup + heart
|
||||
{ 0x1F44D, 0x0000, 0x86 }, // thumbsup
|
||||
{ 0x2665, 0x0000, 0x87 }, // heart
|
||||
// Everything else in original relative order
|
||||
{ 0x1F6DC, 0x0000, 0x88 }, // wireless
|
||||
{ 0x267E, 0x0000, 0x89 }, // infinity
|
||||
{ 0x1F996, 0x0000, 0x8A }, // trex
|
||||
{ 0x2620, 0x0000, 0x8B }, // skull
|
||||
{ 0x271D, 0x0000, 0x8C }, // cross
|
||||
{ 0x26A1, 0x0000, 0x8D }, // lightning
|
||||
{ 0x1F3A9, 0x0000, 0x8E }, // tophat
|
||||
{ 0x1F3CD, 0x0000, 0x8F }, // motorcycle
|
||||
{ 0x1F331, 0x0000, 0x90 }, // seedling
|
||||
{ 0x1F1E6, 0x1F1FA, 0x91 }, // flag_au
|
||||
{ 0x2602, 0x0000, 0x92 }, // umbrella
|
||||
{ 0x1F9FF, 0x0000, 0x93 }, // nazar
|
||||
{ 0x1F30F, 0x0000, 0x94 }, // globe
|
||||
{ 0x2622, 0x0000, 0x95 }, // radioactive
|
||||
{ 0x1F404, 0x0000, 0x96 }, // cow
|
||||
{ 0x1F47D, 0x0000, 0x97 }, // alien
|
||||
{ 0x1F47E, 0x0000, 0x98 }, // invader
|
||||
{ 0x1F5E1, 0x0000, 0x99 }, // dagger
|
||||
{ 0x26F0, 0x0000, 0x9A }, // mountain
|
||||
{ 0x1F51A, 0x0000, 0x9B }, // end_arrow
|
||||
{ 0x2B55, 0x0000, 0x9C }, // hollow_circle
|
||||
{ 0x1F409, 0x0000, 0x9D }, // dragon
|
||||
{ 0x1F310, 0x0000, 0x9E }, // globe_meridians
|
||||
{ 0x1F346, 0x0000, 0x9F }, // eggplant
|
||||
{ 0x1F6E1, 0x0000, 0xA0 }, // shield
|
||||
{ 0x1F97D, 0x0000, 0xA1 }, // goggles
|
||||
{ 0x1F98E, 0x0000, 0xA2 }, // lizard
|
||||
{ 0x1F998, 0x0000, 0xA3 }, // kangaroo
|
||||
{ 0x1FAB6, 0x0000, 0xA4 }, // feather
|
||||
{ 0x1F506, 0x0000, 0xA5 }, // bright
|
||||
{ 0x303D, 0x0000, 0xA6 }, // part_alt
|
||||
{ 0x1F6E5, 0x0000, 0xA7 }, // motorboat
|
||||
{ 0x1F030, 0x0000, 0xA8 }, // domino
|
||||
{ 0x1F4E1, 0x0000, 0xA9 }, // satellite
|
||||
{ 0x1F6C3, 0x0000, 0xAA }, // customs
|
||||
{ 0x1F6DE, 0x0000, 0xAB }, // wheel
|
||||
{ 0x1F428, 0x0000, 0xAC }, // koala
|
||||
{ 0x1F39B, 0x0000, 0xAD }, // control_knobs
|
||||
{ 0x1F351, 0x0000, 0xAE }, // peach
|
||||
{ 0x1F3CE, 0x0000, 0xAF }, // racing_car
|
||||
{ 0x1F42D, 0x0000, 0xB0 }, // mouse
|
||||
{ 0x1F344, 0x0000, 0xB1 }, // mushroom
|
||||
{ 0x2623, 0x0000, 0xB2 }, // biohazard
|
||||
{ 0x1F43C, 0x0000, 0xB3 }, // panda
|
||||
{ 0x1F4A2, 0x0000, 0xB4 }, // anger
|
||||
{ 0x1F432, 0x0000, 0xB5 }, // dragon_face
|
||||
{ 0x1F4DF, 0x0000, 0xB6 }, // pager
|
||||
{ 0x1F41D, 0x0000, 0xB7 }, // bee
|
||||
{ 0x1F4A1, 0x0000, 0xB8 }, // bulb
|
||||
{ 0x1F431, 0x0000, 0xB9 }, // cat
|
||||
{ 0x269C, 0x0000, 0xBA }, // fleur
|
||||
{ 0x1F314, 0x0000, 0xBB }, // moon
|
||||
{ 0x2615, 0x0000, 0xBC }, // coffee
|
||||
{ 0x1F9B7, 0x0000, 0xBD }, // tooth
|
||||
{ 0x1F968, 0x0000, 0xBE }, // pretzel
|
||||
{ 0x1F9EE, 0x0000, 0xBF }, // abacus
|
||||
{ 0x1F5FF, 0x0000, 0xC0 }, // moai
|
||||
{ 0x1F481, 0x0000, 0xC1 }, // tipping
|
||||
{ 0x1F994, 0x0000, 0xC2 }, // hedgehog
|
||||
{ 0x2666, 0x0000, 0xC3 }, // diamond_suit
|
||||
{ 0x2660, 0x0000, 0xC4 }, // spade_suit
|
||||
{ 0x1F355, 0x0000, 0xC5 }, // pizza
|
||||
{ 0x1F340, 0x0000, 0xC6 }, // four_leaf_clover
|
||||
{ 0x2601, 0x0000, 0xC7 }, // cloud
|
||||
{ 0x1F680, 0x0000, 0xC8 }, // rocket
|
||||
{ 0x1F6C2, 0x0000, 0xC9 }, // passport_control
|
||||
{ 0x2733, 0x0000, 0xCA }, // eight_spoked_asterisk
|
||||
{ 0x1F4F6, 0x0000, 0xCB }, // signal_strength
|
||||
};
|
||||
|
||||
// ---- Helper functions ----
|
||||
@@ -616,7 +735,7 @@ static const EmojiCodepoint EMOJI_CODEPOINTS[EMOJI_COUNT] = {
|
||||
struct EmojiAlias { uint32_t cp; uint8_t escape; };
|
||||
#define EMOJI_ALIAS_COUNT 1
|
||||
static const EmojiAlias EMOJI_ALIASES[EMOJI_ALIAS_COUNT] = {
|
||||
{ 0x1F08E, 0xA5 }, // domino tile (MWD node signifier) -> domino sprite
|
||||
{ 0x1F08E, 0xA8 }, // domino tile (MWD node signifier) -> domino sprite
|
||||
};
|
||||
|
||||
static uint32_t emojiDecodeUtf8(const uint8_t* s, int remaining, int* bytes_consumed) {
|
||||
|
||||
@@ -0,0 +1,214 @@
|
||||
#pragma once
|
||||
|
||||
#include <helpers/ui/UIScreen.h>
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
#include <MeshCore.h>
|
||||
#include "../NodePrefs.h"
|
||||
#include "MeckFonts.h"
|
||||
|
||||
// Forward declarations
|
||||
class UITask;
|
||||
class MyMesh;
|
||||
extern MyMesh the_mesh;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FontPreviewScreen
|
||||
// ---------------------------------------------------------------------------
|
||||
// Subscreen opened from Settings → Font Style. Shows a live preview of each
|
||||
// font style (Classic, Noto Sans, Montserrat) with sample body and title text.
|
||||
// The user cycles through styles with W/S (or swipe on T5S3), previews the
|
||||
// actual rendering on-screen, and applies with Enter or cancels with Q.
|
||||
//
|
||||
// The preview works by temporarily calling display.setFontStyle() for each
|
||||
// sample block during render(), then restoring the original style.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class FontPreviewScreen : public UIScreen {
|
||||
UITask* _task;
|
||||
NodePrefs* _prefs;
|
||||
uint8_t _cursor; // Currently highlighted style (0, 1, 2)
|
||||
uint8_t _originalStyle; // Style when screen was opened (for cancel)
|
||||
bool _wantExit;
|
||||
bool _applied; // True if user pressed Enter (vs Q cancel)
|
||||
|
||||
public:
|
||||
FontPreviewScreen(UITask* task, NodePrefs* prefs)
|
||||
: _task(task), _prefs(prefs),
|
||||
_cursor(0), _originalStyle(0),
|
||||
_wantExit(false), _applied(false) {}
|
||||
|
||||
// Called when entering the screen from Settings
|
||||
void enter() {
|
||||
_originalStyle = _prefs->ui_font_style;
|
||||
_cursor = _originalStyle;
|
||||
_wantExit = false;
|
||||
_applied = false;
|
||||
}
|
||||
|
||||
bool wantsExit() const { return _wantExit; }
|
||||
bool wasApplied() const { return _applied; }
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Render
|
||||
// -----------------------------------------------------------------------
|
||||
int render(DisplayDriver& display) override {
|
||||
// === Header ===
|
||||
display.setTextSize(1);
|
||||
display.setColor(DisplayDriver::GREEN);
|
||||
display.setCursor(0, 0);
|
||||
display.print("Font Style Preview");
|
||||
display.drawRect(0, 11, display.width(), 1);
|
||||
|
||||
// === Size mode indicator ===
|
||||
{
|
||||
const char* sizeLabel = _prefs->large_font ? "[LARGER]" : "[TINY]";
|
||||
display.setCursor(display.width() - display.getTextWidth(sizeLabel) - 2, 0);
|
||||
display.print(sizeLabel);
|
||||
}
|
||||
|
||||
// === Style preview rows ===
|
||||
// Each style gets a block showing: style name + sample text rendered in
|
||||
// that style. The selected style is highlighted.
|
||||
const int headerH = 14;
|
||||
const int footerH = 14;
|
||||
const int bodyH = display.height() - headerH - footerH;
|
||||
const int rowH = bodyH / MECK_FONT_STYLE_COUNT;
|
||||
|
||||
uint8_t savedStyle = display.getFontStyle();
|
||||
|
||||
for (int i = 0; i < MECK_FONT_STYLE_COUNT; i++) {
|
||||
int y = headerH + i * rowH;
|
||||
bool selected = (i == _cursor);
|
||||
|
||||
// Highlight selected row
|
||||
if (selected) {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.fillRect(0, y, display.width(), rowH);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
} else {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
}
|
||||
|
||||
// Style name — rendered in default font (size 1)
|
||||
display.setFontStyle(MECK_FONT_CLASSIC); // Name label always in Classic
|
||||
display.setTextSize(1);
|
||||
display.setCursor(2, y + 1);
|
||||
const char* name = meckFontStyleName(i);
|
||||
|
||||
// Prefix with selection indicator
|
||||
char label[32];
|
||||
if (selected) {
|
||||
snprintf(label, sizeof(label), "> %s", name);
|
||||
} else {
|
||||
snprintf(label, sizeof(label), " %s", name);
|
||||
}
|
||||
display.print(label);
|
||||
|
||||
// Sample text — rendered in the preview style
|
||||
display.setFontStyle(i);
|
||||
|
||||
// Body text sample (textSize = smallTextSize based on current size pref)
|
||||
display.setTextSize(_prefs->smallTextSize());
|
||||
int sampleY = y + (rowH / 2) - 2;
|
||||
display.setCursor(4, sampleY);
|
||||
display.print("The quick brown fox 0123");
|
||||
|
||||
// Title sample (textSize 3) — only if row is tall enough
|
||||
if (rowH > 22) {
|
||||
display.setTextSize(3);
|
||||
int titleY = y + rowH - 6;
|
||||
display.setCursor(4, titleY);
|
||||
display.print("Meck");
|
||||
}
|
||||
}
|
||||
|
||||
// Restore original font style
|
||||
display.setFontStyle(savedStyle);
|
||||
|
||||
// === Footer ===
|
||||
display.setTextSize(1);
|
||||
display.setColor(DisplayDriver::YELLOW);
|
||||
int footerY = display.height() - 12;
|
||||
display.drawRect(0, footerY - 2, display.width(), 1);
|
||||
display.setCursor(0, footerY);
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
display.print("Swipe:Pick");
|
||||
const char* rt = "Boot:Back Tap:Apply";
|
||||
#else
|
||||
display.print("W/S:Pick Q:Back");
|
||||
const char* rt = "Enter:Apply";
|
||||
#endif
|
||||
display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY);
|
||||
display.print(rt);
|
||||
|
||||
#ifdef USE_EINK
|
||||
return 5000;
|
||||
#else
|
||||
return 1000;
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Input
|
||||
// -----------------------------------------------------------------------
|
||||
bool handleInput(char c) override {
|
||||
// W / UP — previous style
|
||||
if (c == 'w' || c == 'W' || c == 0xF2 || c == KEY_UP) {
|
||||
if (_cursor > 0) {
|
||||
_cursor--;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// S / DOWN — next style
|
||||
if (c == 's' || c == 'S' || c == 0xF1 || c == KEY_DOWN) {
|
||||
if (_cursor < MECK_FONT_STYLE_COUNT - 1) {
|
||||
_cursor++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Enter — apply selected style and exit
|
||||
if (c == '\r' || c == 13 || c == KEY_ENTER || c == KEY_SELECT) {
|
||||
_prefs->ui_font_style = _cursor;
|
||||
the_mesh.savePrefs();
|
||||
_applied = true;
|
||||
_wantExit = true;
|
||||
Serial.printf("FontPreview: Applied style = %s (%d)\n",
|
||||
meckFontStyleName(_cursor), _cursor);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Q / backspace — cancel, restore original style
|
||||
if (c == 'q' || c == 'Q' || c == '\b' || c == KEY_CANCEL) {
|
||||
_prefs->ui_font_style = _originalStyle;
|
||||
_wantExit = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Touch hit test (virtual coordinates)
|
||||
// Returns: 0=miss, 1=cursor moved, 2=activate (apply).
|
||||
// -----------------------------------------------------------------------
|
||||
int selectAtVxVy(int vx, int vy) {
|
||||
const int headerH = 14;
|
||||
const int footerH = 14;
|
||||
const int bodyH = 128 - headerH - footerH; // virtual 128×128
|
||||
const int rowH = bodyH / MECK_FONT_STYLE_COUNT;
|
||||
|
||||
if (vy < headerH || vy >= 128 - footerH) return 0;
|
||||
|
||||
int tapped = (vy - headerH) / rowH;
|
||||
if (tapped < 0 || tapped >= MECK_FONT_STYLE_COUNT) return 0;
|
||||
|
||||
if (tapped == _cursor) return 2; // Tap same row = apply
|
||||
_cursor = tapped;
|
||||
return 1; // Moved cursor
|
||||
}
|
||||
};
|
||||
@@ -13,12 +13,15 @@ extern MyMesh the_mesh;
|
||||
// recency. Unlike Discovery (active zero-hop scan), this is purely passive
|
||||
// — it shows nodes whose adverts have been received over time.
|
||||
// ==========================================================================
|
||||
// Display cap — we never need to show all 200 storage entries at once
|
||||
#define LAST_HEARD_DISPLAY_SIZE 100
|
||||
|
||||
class LastHeardScreen : public UIScreen {
|
||||
mesh::RTCClock* _rtc;
|
||||
int _scrollPos;
|
||||
|
||||
// Local sorted copy of advert paths (refreshed each render)
|
||||
AdvertPath _entries[ADVERT_PATH_TABLE_SIZE];
|
||||
// Local sorted copy of advert paths (PSRAM-allocated, refreshed each render)
|
||||
AdvertPath* _entries;
|
||||
int _count;
|
||||
|
||||
static char typeChar(uint8_t adv_type) {
|
||||
@@ -46,7 +49,9 @@ class LastHeardScreen : public UIScreen {
|
||||
|
||||
public:
|
||||
LastHeardScreen(mesh::RTCClock* rtc)
|
||||
: _rtc(rtc), _scrollPos(0), _count(0) {}
|
||||
: _rtc(rtc), _scrollPos(0), _count(0) {
|
||||
_entries = (AdvertPath*)ps_calloc(LAST_HEARD_DISPLAY_SIZE, sizeof(AdvertPath));
|
||||
}
|
||||
|
||||
void resetScroll() { _scrollPos = 0; }
|
||||
|
||||
@@ -91,7 +96,7 @@ public:
|
||||
|
||||
int render(DisplayDriver& display) override {
|
||||
// Refresh sorted list from mesh
|
||||
_count = the_mesh.getRecentlyHeard(_entries, ADVERT_PATH_TABLE_SIZE);
|
||||
_count = the_mesh.getRecentlyHeard(_entries, LAST_HEARD_DISPLAY_SIZE);
|
||||
|
||||
// Filter out empty entries (recv_timestamp == 0)
|
||||
int validCount = 0;
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
#pragma once
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MeckFonts.h — Font style system for Meck
|
||||
// ---------------------------------------------------------------------------
|
||||
// Defines font styles (Classic, Noto Sans, Montserrat) and provides lookup
|
||||
// tables for each display driver's setTextSize() method.
|
||||
//
|
||||
// Place this file in: examples/companion_radio/ui-new/
|
||||
// Place font .h files in: examples/companion_radio/ui-new/fonts/
|
||||
//
|
||||
// Both GxEPDDisplay.h and FastEPDDisplay.h include this file.
|
||||
// The -I examples/companion_radio/ui-new flag (already in platformio.ini)
|
||||
// makes everything resolve.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
#include <Adafruit_GFX.h> // GFXfont type
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Font style IDs — stored in NodePrefs.ui_font_style
|
||||
// ---------------------------------------------------------------------------
|
||||
#define MECK_FONT_CLASSIC 0 // FreeSans (original Meck look)
|
||||
#define MECK_FONT_NOTO 1 // Noto Sans — clean, excellent Latin Extended
|
||||
#define MECK_FONT_MONTSERRAT 2 // Montserrat — geometric, distinctive
|
||||
#define MECK_FONT_STYLE_COUNT 3
|
||||
|
||||
static inline const char* meckFontStyleName(uint8_t style) {
|
||||
switch (style) {
|
||||
case MECK_FONT_CLASSIC: return "Classic";
|
||||
case MECK_FONT_NOTO: return "Noto Sans";
|
||||
case MECK_FONT_MONTSERRAT: return "Montserrat";
|
||||
default: return "Classic";
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Font includes — Noto Sans family
|
||||
// ---------------------------------------------------------------------------
|
||||
#include "fonts/NotoSans7pt7b.h"
|
||||
#include "fonts/NotoSans9pt7b.h"
|
||||
#include "fonts/NotoSans12pt7b.h"
|
||||
#include "fonts/NotoSansBold7pt7b.h"
|
||||
#include "fonts/NotoSansBold9pt7b.h"
|
||||
#include "fonts/NotoSansBold12pt7b.h"
|
||||
#include "fonts/NotoSansBold18pt7b.h"
|
||||
#include "fonts/NotoSansBold24pt7b.h"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Font includes — Montserrat family
|
||||
// ---------------------------------------------------------------------------
|
||||
#include "fonts/Montserrat7pt7b.h"
|
||||
#include "fonts/Montserrat9pt7b.h"
|
||||
#include "fonts/Montserrat12pt7b.h"
|
||||
#include "fonts/MontserratBold7pt7b.h"
|
||||
#include "fonts/MontserratBold9pt7b.h"
|
||||
#include "fonts/MontserratBold12pt7b.h"
|
||||
#include "fonts/MontserratBold18pt7b.h"
|
||||
#include "fonts/MontserratBold24pt7b.h"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// T-Deck Pro font lookup (240×320, GxEPD2)
|
||||
// ---------------------------------------------------------------------------
|
||||
// Maps (fontStyle, textSize) → GFXfont*.
|
||||
// Returns NULL for textSize 0 with Classic (built-in 6×8 font).
|
||||
//
|
||||
// textSize values used by Meck screens:
|
||||
// 0 = tiny body (built-in 6×8 or 7pt with custom fonts)
|
||||
// 1 = body (9pt)
|
||||
// 2 = medium (9pt, same as body in current layout)
|
||||
// 3 = title (12pt bold)
|
||||
// 5 = clock face (12pt bold ×2 scaling — caller handles setTextSize(2))
|
||||
//
|
||||
// yAdvance reference (physical pixels):
|
||||
// Classic 9pt=22, Noto 9pt=24, Montserrat 9pt=21 — close enough
|
||||
// Classic 12ptB=29, Noto 12ptB=32, Montserrat 12ptB=29 — close
|
||||
// ---------------------------------------------------------------------------
|
||||
#if !defined(LilyGo_T5S3_EPaper_Pro)
|
||||
|
||||
static inline const GFXfont* meckGetFont_TDeckPro(uint8_t style, int textSize) {
|
||||
// Classic — return NULL to let display driver use its defaults
|
||||
if (style == MECK_FONT_CLASSIC) return nullptr;
|
||||
|
||||
if (style == MECK_FONT_NOTO) {
|
||||
switch (textSize) {
|
||||
case 0: return &NotoSans_Regular7pt7b;
|
||||
case 1: return &NotoSans_Regular9pt7b;
|
||||
case 2: return &NotoSans_Regular9pt7b;
|
||||
case 3: return &NotoSans_Bold12pt7b;
|
||||
case 5: return &NotoSans_Bold12pt7b; // caller applies ×2 scale
|
||||
default: return &NotoSans_Regular9pt7b;
|
||||
}
|
||||
}
|
||||
|
||||
// MECK_FONT_MONTSERRAT
|
||||
switch (textSize) {
|
||||
case 0: return &Montserrat_Regular7pt7b;
|
||||
case 1: return &Montserrat_Regular9pt7b;
|
||||
case 2: return &Montserrat_Regular9pt7b;
|
||||
case 3: return &Montserrat_Bold12pt7b;
|
||||
case 5: return &Montserrat_Bold12pt7b; // caller applies ×2 scale
|
||||
default: return &Montserrat_Regular9pt7b;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // !LilyGo_T5S3_EPaper_Pro
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// T5S3 font lookup (960×540, FastEPD)
|
||||
// ---------------------------------------------------------------------------
|
||||
// Metric-matched to existing FreeSans sizes so virtual-coordinate layouts
|
||||
// stay intact. The larger Noto/Montserrat sizes (18-26pt) are available in
|
||||
// the fonts/ directory for a future T5S3 layout rework.
|
||||
//
|
||||
// textSize values used by Meck screens:
|
||||
// 0 = body (12pt regular)
|
||||
// 1 = heading (12pt bold)
|
||||
// 2 = large bold (18pt bold)
|
||||
// 3 = extra large (24pt bold)
|
||||
// 5 = clock face (24pt bold ×5 scaling)
|
||||
//
|
||||
// yAdvance reference (physical pixels):
|
||||
// FreeSans12pt=29, Noto12pt=32, Montserrat12pt=29
|
||||
// FreeSansBold18pt=42, NotoBold18pt=48, MontBold18pt=43
|
||||
// FreeSansBold24pt=56, NotoBold24pt=64, MontBold24pt=57
|
||||
// ---------------------------------------------------------------------------
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
|
||||
static inline const GFXfont* meckGetFont_T5S3(uint8_t style, int textSize) {
|
||||
if (style == MECK_FONT_CLASSIC) return nullptr;
|
||||
|
||||
if (style == MECK_FONT_NOTO) {
|
||||
switch (textSize) {
|
||||
case 0: return &NotoSans_Regular12pt7b;
|
||||
case 1: return &NotoSans_Bold12pt7b;
|
||||
case 2: return &NotoSans_Bold18pt7b;
|
||||
case 3: return &NotoSans_Bold24pt7b;
|
||||
case 5: return &NotoSans_Bold24pt7b; // caller applies ×5 scale
|
||||
default: return &NotoSans_Regular12pt7b;
|
||||
}
|
||||
}
|
||||
|
||||
// MECK_FONT_MONTSERRAT
|
||||
switch (textSize) {
|
||||
case 0: return &Montserrat_Regular12pt7b;
|
||||
case 1: return &Montserrat_Bold12pt7b;
|
||||
case 2: return &Montserrat_Bold18pt7b;
|
||||
case 3: return &Montserrat_Bold24pt7b;
|
||||
case 5: return &Montserrat_Bold24pt7b; // caller applies ×5 scale
|
||||
default: return &Montserrat_Regular12pt7b;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // LilyGo_T5S3_EPaper_Pro
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Unified lookup — called from display driver setTextSize()
|
||||
// ---------------------------------------------------------------------------
|
||||
// Returns the GFXfont* for the given style and textSize.
|
||||
// If nullptr is returned, the display driver should use its built-in default
|
||||
// (FreeSans for Classic style, or built-in 6×8 for textSize 0).
|
||||
// ---------------------------------------------------------------------------
|
||||
static inline const GFXfont* meckGetFont(uint8_t style, int textSize) {
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
return meckGetFont_T5S3(style, textSize);
|
||||
#else
|
||||
return meckGetFont_TDeckPro(style, textSize);
|
||||
#endif
|
||||
}
|
||||
@@ -1220,6 +1220,35 @@ public:
|
||||
bool isConfirmingDelete() const { return _mode == CONFIRM_DELETE; }
|
||||
bool isEmpty() const { return _bufLen == 0; }
|
||||
|
||||
// Touch: select file list row by virtual Y coordinate
|
||||
// Returns: 0 = outside list, 1 = moved selection, 2 = tapped same row (open)
|
||||
int selectRowAtVY(int vy) {
|
||||
if (_mode != FILE_LIST) return 0;
|
||||
const int startY = 14, footerH = 14;
|
||||
const int listLineH = _prefs ? _prefs->smallLineH() : 9;
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
const int bodyTop = startY;
|
||||
#else
|
||||
const int bodyTop = startY + (_prefs ? _prefs->smallHighlightOff() : 5);
|
||||
#endif
|
||||
if (vy < bodyTop || vy >= 128 - footerH) return 0;
|
||||
|
||||
int totalItems = 1 + (int)_fileList.size();
|
||||
if (totalItems == 0) return 0;
|
||||
int maxVisible = (128 - startY - footerH) / listLineH;
|
||||
if (maxVisible < 3) maxVisible = 3;
|
||||
if (maxVisible > 15) maxVisible = 15;
|
||||
int startIdx = max(0, min(_selectedFile - maxVisible / 2,
|
||||
totalItems - maxVisible));
|
||||
|
||||
int tappedRow = startIdx + (vy - bodyTop) / listLineH;
|
||||
if (tappedRow < 0 || tappedRow >= totalItems) return 0;
|
||||
|
||||
if (tappedRow == _selectedFile) return 2;
|
||||
_selectedFile = tappedRow;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ---- Cursor Navigation (called from main.cpp) ----
|
||||
|
||||
void moveCursorLeft() {
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
#include <helpers/ui/UIScreen.h>
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
#include <helpers/ChannelDetails.h>
|
||||
#include <helpers/TransportKeyStore.h>
|
||||
#include <MeshCore.h>
|
||||
#include "../NodePrefs.h"
|
||||
#include "MeckFonts.h"
|
||||
|
||||
// Inline edit hint shown next to values being adjusted
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
@@ -114,6 +116,7 @@ enum SettingsRowType : uint8_t {
|
||||
ROW_MSG_NOTIFY, // Keyboard flash on new msg toggle
|
||||
ROW_DARK_MODE, // Dark mode toggle (inverted display)
|
||||
ROW_LARGE_FONT, // Font size toggle: 0=tiny (default), 1=larger
|
||||
ROW_FONT_STYLE, // Font style: Classic / Noto Sans / Montserrat
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
ROW_PORTRAIT_MODE, // Portrait orientation toggle
|
||||
#endif
|
||||
@@ -122,6 +125,7 @@ enum SettingsRowType : uint8_t {
|
||||
#endif
|
||||
ROW_GPS_BAUD, // GPS baud rate picker (requires reboot)
|
||||
ROW_PATH_HASH_SIZE, // Path hash size (1, 2, or 3 bytes per hop)
|
||||
ROW_DEFAULT_SCOPE, // Device-wide default region (text editor)
|
||||
#ifdef MECK_WIFI_COMPANION
|
||||
ROW_WIFI_SETUP, // WiFi SSID/password configuration
|
||||
ROW_WIFI_TOGGLE, // WiFi radio on/off toggle
|
||||
@@ -210,13 +214,13 @@ enum FmPhase : uint8_t {
|
||||
|
||||
// Max rows in the settings list (increased for contact sub-toggles + WiFi)
|
||||
#if defined(HAS_4G_MODEM) && defined(MECK_WIFI_COMPANION)
|
||||
#define SETTINGS_MAX_ROWS 56 // Extra rows for IMEI, Carrier, APN, contacts, WiFi
|
||||
#define SETTINGS_MAX_ROWS 57 // Extra rows for IMEI, Carrier, APN, contacts, WiFi, scope
|
||||
#elif defined(HAS_4G_MODEM)
|
||||
#define SETTINGS_MAX_ROWS 54 // Extra rows for IMEI, Carrier, APN + contacts
|
||||
#define SETTINGS_MAX_ROWS 55 // Extra rows for IMEI, Carrier, APN + contacts + scope
|
||||
#elif defined(MECK_WIFI_COMPANION)
|
||||
#define SETTINGS_MAX_ROWS 50 // Extra rows for contacts + WiFi
|
||||
#define SETTINGS_MAX_ROWS 51 // Extra rows for contacts + WiFi + scope
|
||||
#else
|
||||
#define SETTINGS_MAX_ROWS 48 // Contacts section
|
||||
#define SETTINGS_MAX_ROWS 49 // Contacts section + scope
|
||||
#endif
|
||||
#define SETTINGS_TEXT_BUF 33 // 32 chars + null
|
||||
|
||||
@@ -245,6 +249,7 @@ private:
|
||||
int _editPickerIdx; // for preset picker / contact mode picker
|
||||
float _editFloat; // for freq/BW editing
|
||||
int _editInt; // for SF/CR/TX/UTC editing
|
||||
uint8_t _fontPickerOriginal; // font style before edit (for cancel revert)
|
||||
int _confirmAction; // 0=none, 1=delete channel, 2=apply radio
|
||||
|
||||
// Onboarding mode
|
||||
@@ -399,8 +404,10 @@ private:
|
||||
addRow(ROW_MSG_NOTIFY);
|
||||
addRow(ROW_GPS_BAUD);
|
||||
addRow(ROW_PATH_HASH_SIZE);
|
||||
addRow(ROW_DEFAULT_SCOPE);
|
||||
addRow(ROW_DARK_MODE);
|
||||
addRow(ROW_LARGE_FONT);
|
||||
addRow(ROW_FONT_STYLE);
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
addRow(ROW_PORTRAIT_MODE);
|
||||
#endif
|
||||
@@ -570,7 +577,7 @@ public:
|
||||
: _task(task), _rtc(rtc), _prefs(prefs),
|
||||
_numRows(0), _cursor(0), _scrollTop(0),
|
||||
_editMode(EDIT_NONE), _editPos(0), _editPickerIdx(0),
|
||||
_editFloat(0), _editInt(0), _confirmAction(0),
|
||||
_editFloat(0), _editInt(0), _fontPickerOriginal(0), _confirmAction(0),
|
||||
_onboarding(false), _subScreen(SUB_NONE), _savedTopCursor(0),
|
||||
_radioChanged(false), _needsTextVKB(false) {
|
||||
memset(_editBuf, 0, sizeof(_editBuf));
|
||||
@@ -1742,6 +1749,17 @@ public:
|
||||
display.print(tmp);
|
||||
break;
|
||||
|
||||
case ROW_DEFAULT_SCOPE:
|
||||
if (editing && _editMode == EDIT_TEXT) {
|
||||
snprintf(tmp, sizeof(tmp), "Region: %s_", _editBuf);
|
||||
} else if (_prefs->default_scope_name[0]) {
|
||||
snprintf(tmp, sizeof(tmp), "Default Region: %s", _prefs->default_scope_name);
|
||||
} else {
|
||||
strcpy(tmp, "Default Region: (none)");
|
||||
}
|
||||
display.print(tmp);
|
||||
break;
|
||||
|
||||
case ROW_GPS_BAUD: {
|
||||
char baudStr[16];
|
||||
if (editing && _editMode == EDIT_PICKER) {
|
||||
@@ -1767,6 +1785,17 @@ public:
|
||||
display.print(tmp);
|
||||
break;
|
||||
|
||||
case ROW_FONT_STYLE:
|
||||
if (editing && _editMode == EDIT_PICKER) {
|
||||
snprintf(tmp, sizeof(tmp), "< Font: %s >",
|
||||
meckFontStyleName(_prefs->ui_font_style));
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), "Font: %s",
|
||||
meckFontStyleName(_prefs->ui_font_style));
|
||||
}
|
||||
display.print(tmp);
|
||||
break;
|
||||
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
case ROW_PORTRAIT_MODE:
|
||||
snprintf(tmp, sizeof(tmp), "Portrait Mode: %s",
|
||||
@@ -1847,7 +1876,7 @@ public:
|
||||
break;
|
||||
|
||||
case ROW_AUTOADD_CHAT:
|
||||
snprintf(tmp, sizeof(tmp), " Chat: %s",
|
||||
snprintf(tmp, sizeof(tmp), " Companion: %s",
|
||||
(_prefs->autoadd_config & AUTO_ADD_CHAT) ? "ON" : "OFF");
|
||||
display.print(tmp);
|
||||
break;
|
||||
@@ -1886,17 +1915,22 @@ public:
|
||||
uint8_t chIdx = _rows[i].param;
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(chIdx, ch)) {
|
||||
if (chIdx == 0) {
|
||||
// Public channel - not deletable
|
||||
snprintf(tmp, sizeof(tmp), " %s", ch.name);
|
||||
if (editing && _editMode == EDIT_TEXT) {
|
||||
// Editing scope for this channel
|
||||
snprintf(tmp, sizeof(tmp), " %s [%s_]", ch.name, _editBuf);
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), " %s", ch.name);
|
||||
// Show channel name + scope tag
|
||||
if (ch.scope_name[0]) {
|
||||
snprintf(tmp, sizeof(tmp), " %s [%s]", ch.name, ch.scope_name);
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), " %s [*]", ch.name);
|
||||
}
|
||||
if (selected) {
|
||||
// Show delete hint on right
|
||||
// Show edit/delete hints on right
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
const char* hint = "Hold:Del";
|
||||
const char* hint = chIdx > 0 ? "Ent:Region Hold:Del" : "Ent:Region";
|
||||
#else
|
||||
const char* hint = "X:Del";
|
||||
const char* hint = chIdx > 0 ? "Ent:Region X:Del" : "Ent:Region";
|
||||
#endif
|
||||
int hintW = display.getTextWidth(hint);
|
||||
display.setCursor(display.width() - hintW - 2, y);
|
||||
@@ -2025,6 +2059,9 @@ public:
|
||||
display.drawTextCentered(display.width() / 2, by + 4, tmp);
|
||||
} else if (_confirmAction == 2) {
|
||||
display.drawTextCentered(display.width() / 2, by + 4, "Apply radio changes?");
|
||||
} else if (_confirmAction == 3) {
|
||||
display.drawTextCentered(display.width() / 2, by + 4, "Region not set.");
|
||||
display.drawTextCentered(display.width() / 2, by + 15, "Leave unset?");
|
||||
}
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
display.drawTextCentered(display.width() / 2, by + bh - 14, "Tap:Yes Boot:No");
|
||||
@@ -2451,12 +2488,28 @@ public:
|
||||
rebuildRows();
|
||||
} else if (_confirmAction == 2) {
|
||||
applyRadioParams();
|
||||
} else if (_confirmAction == 3) {
|
||||
// Region nudge dismissed — user chose "Yes, leave unscoped"
|
||||
_editMode = EDIT_NONE;
|
||||
_confirmAction = 0;
|
||||
_onboarding = false;
|
||||
return false; // Let caller navigate away from settings
|
||||
}
|
||||
_editMode = EDIT_NONE;
|
||||
_confirmAction = 0;
|
||||
return true;
|
||||
}
|
||||
if (c == 'q' || c == 'Q') {
|
||||
if (_confirmAction == 3) {
|
||||
// Region nudge cancelled — scroll to Default Region row
|
||||
_editMode = EDIT_NONE;
|
||||
_confirmAction = 0;
|
||||
// Find and scroll to ROW_DEFAULT_SCOPE
|
||||
for (int r = 0; r < _numRows; r++) {
|
||||
if (_rows[r].type == ROW_DEFAULT_SCOPE) { _cursor = r; break; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
_editMode = EDIT_NONE;
|
||||
_confirmAction = 0;
|
||||
return true;
|
||||
@@ -2666,6 +2719,34 @@ public:
|
||||
rebuildRows();
|
||||
}
|
||||
_editMode = EDIT_NONE;
|
||||
} else if (type == ROW_DEFAULT_SCOPE) {
|
||||
// Save device-wide default scope
|
||||
strncpy(_prefs->default_scope_name, _editBuf, sizeof(_prefs->default_scope_name));
|
||||
_prefs->default_scope_name[30] = '\0';
|
||||
if (_editBuf[0]) {
|
||||
TransportKey key;
|
||||
the_mesh.deriveScopeKey(_editBuf, key);
|
||||
memcpy(_prefs->default_scope_key, key.key, sizeof(_prefs->default_scope_key));
|
||||
} else {
|
||||
memset(_prefs->default_scope_key, 0, sizeof(_prefs->default_scope_key));
|
||||
}
|
||||
the_mesh.savePrefs();
|
||||
Serial.printf("Settings: Default scope set to '%s'\n",
|
||||
_editBuf[0] ? _editBuf : "(unscoped)");
|
||||
_editMode = EDIT_NONE;
|
||||
} else if (type == ROW_CHANNEL) {
|
||||
// Save per-channel scope
|
||||
uint8_t chIdx = _rows[_cursor].param;
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(chIdx, ch)) {
|
||||
strncpy(ch.scope_name, _editBuf, sizeof(ch.scope_name));
|
||||
ch.scope_name[30] = '\0';
|
||||
the_mesh.setChannel(chIdx, ch);
|
||||
the_mesh.saveChannels();
|
||||
Serial.printf("Settings: Channel %d scope set to '%s'\n",
|
||||
chIdx, _editBuf[0] ? _editBuf : "(device default)");
|
||||
}
|
||||
_editMode = EDIT_NONE;
|
||||
}
|
||||
#ifdef HAS_4G_MODEM
|
||||
else if (type == ROW_APN) {
|
||||
@@ -2717,6 +2798,10 @@ public:
|
||||
} else if (type == ROW_AUTO_LOCK) {
|
||||
_editPickerIdx--;
|
||||
if (_editPickerIdx < 0) _editPickerIdx = AUTO_LOCK_OPTION_COUNT - 1;
|
||||
} else if (type == ROW_FONT_STYLE) {
|
||||
_editPickerIdx--;
|
||||
if (_editPickerIdx < 0) _editPickerIdx = MECK_FONT_STYLE_COUNT - 1;
|
||||
_prefs->ui_font_style = _editPickerIdx; // Live preview
|
||||
} else {
|
||||
// Radio preset
|
||||
_editPickerIdx--;
|
||||
@@ -2734,6 +2819,10 @@ public:
|
||||
} else if (type == ROW_AUTO_LOCK) {
|
||||
_editPickerIdx++;
|
||||
if (_editPickerIdx >= AUTO_LOCK_OPTION_COUNT) _editPickerIdx = 0;
|
||||
} else if (type == ROW_FONT_STYLE) {
|
||||
_editPickerIdx++;
|
||||
if (_editPickerIdx >= MECK_FONT_STYLE_COUNT) _editPickerIdx = 0;
|
||||
_prefs->ui_font_style = _editPickerIdx; // Live preview
|
||||
} else {
|
||||
// Radio preset
|
||||
_editPickerIdx++;
|
||||
@@ -2757,6 +2846,13 @@ public:
|
||||
_editMode = EDIT_NONE;
|
||||
Serial.printf("Settings: Auto lock = %s\n",
|
||||
autoLockLabel(_prefs->auto_lock_minutes));
|
||||
} else if (type == ROW_FONT_STYLE) {
|
||||
_prefs->ui_font_style = _editPickerIdx;
|
||||
the_mesh.savePrefs();
|
||||
_editMode = EDIT_NONE;
|
||||
Serial.printf("Settings: Font style = %s (%d)\n",
|
||||
meckFontStyleName(_prefs->ui_font_style),
|
||||
_prefs->ui_font_style);
|
||||
} else {
|
||||
// Apply radio preset
|
||||
if (_editPickerIdx >= 0 && _editPickerIdx < (int)NUM_RADIO_PRESETS) {
|
||||
@@ -2790,6 +2886,10 @@ public:
|
||||
return true;
|
||||
}
|
||||
if (c == 'q' || c == 'Q') {
|
||||
// Revert live preview if font style picker was active
|
||||
if (type == ROW_FONT_STYLE) {
|
||||
_prefs->ui_font_style = _fontPickerOriginal;
|
||||
}
|
||||
_editMode = EDIT_NONE;
|
||||
return true;
|
||||
}
|
||||
@@ -2951,6 +3051,10 @@ public:
|
||||
Serial.printf("Settings: Font size = %s\n",
|
||||
_prefs->large_font ? "LARGER" : "TINY");
|
||||
break;
|
||||
case ROW_FONT_STYLE:
|
||||
_fontPickerOriginal = _prefs->ui_font_style;
|
||||
startEditPicker(_prefs->ui_font_style);
|
||||
break;
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
case ROW_PORTRAIT_MODE:
|
||||
_prefs->portrait_mode = _prefs->portrait_mode ? 0 : 1;
|
||||
@@ -3108,7 +3212,18 @@ public:
|
||||
startFileMgr();
|
||||
break;
|
||||
#endif
|
||||
case ROW_CHANNEL:
|
||||
case ROW_CHANNEL: {
|
||||
// Enter on a channel row → edit its region scope
|
||||
uint8_t chIdx = _rows[_cursor].param;
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(chIdx, ch)) {
|
||||
startEditText(ch.scope_name);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ROW_DEFAULT_SCOPE:
|
||||
startEditText(_prefs->default_scope_name);
|
||||
break;
|
||||
case ROW_PUB_KEY:
|
||||
case ROW_FIRMWARE:
|
||||
// Not directly editable on Enter
|
||||
@@ -3145,6 +3260,21 @@ public:
|
||||
_confirmAction = 2;
|
||||
return true;
|
||||
}
|
||||
// Nudge if no region is set anywhere (device default empty AND no per-channel scopes)
|
||||
if (_prefs->default_scope_name[0] == '\0') {
|
||||
bool anyChannelScoped = false;
|
||||
for (uint8_t ci = 0; ci < MAX_GROUP_CHANNELS && !anyChannelScoped; ci++) {
|
||||
ChannelDetails ch;
|
||||
if (the_mesh.getChannel(ci, ch) && ch.name[0] != '\0' && ch.scope_name[0] != '\0') {
|
||||
anyChannelScoped = true;
|
||||
}
|
||||
}
|
||||
if (!anyChannelScoped) {
|
||||
_editMode = EDIT_CONFIRM;
|
||||
_confirmAction = 3;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
_onboarding = false;
|
||||
return false; // Let the caller handle navigation back
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ class UITask;
|
||||
// ============================================================================
|
||||
#define BOOKS_FOLDER "/books"
|
||||
#define INDEX_FOLDER "/.indexes"
|
||||
#define INDEX_VERSION 12 // v12: indexer breaks page BEFORE overflowing line (matches renderer pre-check)
|
||||
#define INDEX_VERSION 13 // v13: font key in header — auto-invalidate on font/style change
|
||||
#define PREINDEX_PAGES 100
|
||||
#define READER_MAX_FILES 50
|
||||
#define READER_BUF_SIZE 4096
|
||||
@@ -106,8 +106,6 @@ inline WrapResult findLineBreak(const char* buffer, int bufLen, int lineStart, i
|
||||
// width variation in proportional fonts like FreeSans12pt.
|
||||
// maxChars is a safety upper bound to prevent runaway on spaceless lines.
|
||||
// ============================================================================
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
|
||||
inline WrapResult findLineBreakPixel(const char* buffer, int bufLen, int lineStart,
|
||||
DisplayDriver* display, int maxChars) {
|
||||
@@ -235,7 +233,6 @@ inline WrapResult findLineBreakPixel(const char* buffer, int bufLen, int lineSta
|
||||
result.nextStart = bufLen;
|
||||
return result;
|
||||
}
|
||||
#endif // LilyGo_T5S3_EPaper_Pro
|
||||
|
||||
// ============================================================================
|
||||
// Page Indexer (word-wrap aware, matches display rendering)
|
||||
@@ -247,7 +244,8 @@ inline int indexPagesWordWrap(File& file, long startPos,
|
||||
std::vector<long>& pagePositions,
|
||||
int linesPerPage, int charsPerLine,
|
||||
int maxPages,
|
||||
int textAreaHeight = 0, int lineHeight = 0) {
|
||||
int textAreaHeight = 0, int lineHeight = 0,
|
||||
DisplayDriver* pixelDisplay = nullptr) {
|
||||
const int BUF_SIZE = READER_BUF_SIZE; // Match page buffer to avoid chunk boundary wrap mismatches
|
||||
char buffer[BUF_SIZE];
|
||||
|
||||
@@ -269,7 +267,10 @@ inline int indexPagesWordWrap(File& file, long startPos,
|
||||
int pos = 0;
|
||||
while (pos < bufLen) {
|
||||
int lineStart = pos;
|
||||
WrapResult wrap = findLineBreak(buffer, bufLen, pos, charsPerLine);
|
||||
// Pixel-based wrapping for proportional fonts; char-count for monospaced
|
||||
WrapResult wrap = pixelDisplay
|
||||
? findLineBreakPixel(buffer, bufLen, pos, pixelDisplay, charsPerLine)
|
||||
: findLineBreak(buffer, bufLen, pos, charsPerLine);
|
||||
if (wrap.nextStart <= pos && wrap.lineEnd >= bufLen) break;
|
||||
|
||||
// Blank line = newline at line start (no printable content before it)
|
||||
@@ -322,9 +323,8 @@ inline int indexPagesWordWrap(File& file, long startPos,
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Pixel-based Page Indexer for T5S3 (proportional font word wrap)
|
||||
// Pixel-based Page Indexer (proportional font word wrap)
|
||||
// ============================================================================
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
inline int indexPagesWordWrapPixel(File& file, long startPos,
|
||||
std::vector<long>& pagePositions,
|
||||
int linesPerPage, int maxChars,
|
||||
@@ -377,7 +377,6 @@ inline int indexPagesWordWrapPixel(File& file, long startPos,
|
||||
display->setTextSize(1); // Restore
|
||||
return pagesAdded;
|
||||
}
|
||||
#endif // LilyGo_T5S3_EPaper_Pro
|
||||
|
||||
// ============================================================================
|
||||
// TextReaderScreen
|
||||
@@ -402,7 +401,8 @@ private:
|
||||
Mode _mode;
|
||||
bool _sdReady;
|
||||
bool _initialized; // Layout metrics calculated
|
||||
uint8_t _lastFontPref; // Font preference at last layout init (detect changes)
|
||||
uint8_t _lastFontPref; // Font preference at last layout init (large_font | fontStyle<<4)
|
||||
uint8_t _fontKey; // Current font key stored in .idx files for cache invalidation
|
||||
bool _bootIndexed; // Boot-time pre-indexing done
|
||||
DisplayDriver* _display; // Stored reference for splash screens
|
||||
|
||||
@@ -627,6 +627,15 @@ private:
|
||||
return false;
|
||||
}
|
||||
|
||||
// Font key: page boundaries depend on font metrics — discard if font changed
|
||||
uint8_t savedFontKey = 0;
|
||||
idxFile.read(&savedFontKey, 1);
|
||||
if (savedFontKey != _fontKey) {
|
||||
idxFile.close();
|
||||
SD.remove(idxPath.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
idxFile.read((uint8_t*)&savedSize, 4);
|
||||
idxFile.read((uint8_t*)&pageCount, 4);
|
||||
idxFile.read(&fullyFlag, 1);
|
||||
@@ -681,6 +690,7 @@ private:
|
||||
uint8_t fullyFlag = fullyIndexed ? 1 : 0;
|
||||
|
||||
idxFile.write(&version, 1);
|
||||
idxFile.write(&_fontKey, 1); // Font key for cache invalidation
|
||||
idxFile.write((uint8_t*)&fileSize, 4);
|
||||
idxFile.write((uint8_t*)&pageCount, 4);
|
||||
idxFile.write(&fullyFlag, 1);
|
||||
@@ -714,8 +724,8 @@ private:
|
||||
return false;
|
||||
}
|
||||
|
||||
// Seek to lastReadPage field: version(1) + fileSize(4) + pageCount(4) + fullyIndexed(1)
|
||||
idxFile.seek(1 + 4 + 4 + 1);
|
||||
// Seek to lastReadPage field: version(1) + fontKey(1) + fileSize(4) + pageCount(4) + fullyIndexed(1)
|
||||
idxFile.seek(1 + 1 + 4 + 4 + 1);
|
||||
idxFile.write((uint8_t*)&page, 4);
|
||||
idxFile.close();
|
||||
return true;
|
||||
@@ -935,17 +945,19 @@ private:
|
||||
}
|
||||
drawSplash("Indexing...", "Please wait", shortName);
|
||||
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
if (_pagePositions.empty()) {
|
||||
// Cache had no pages (e.g. dummy entry) — full index from scratch
|
||||
_pagePositions.push_back(0);
|
||||
indexPagesWordWrap(_file, 0, _pagePositions,
|
||||
_linesPerPage, _charsPerLine, 0,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
} else {
|
||||
long lastPos = cache->pagePositions.back();
|
||||
indexPagesWordWrap(_file, lastPos, _pagePositions,
|
||||
_linesPerPage, _charsPerLine, 0,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
}
|
||||
} else {
|
||||
// No cache — full index from scratch
|
||||
@@ -963,9 +975,11 @@ private:
|
||||
drawSplash("Indexing...", "Please wait", shortName);
|
||||
|
||||
_pagePositions.push_back(0);
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
indexPagesWordWrap(_file, 0, _pagePositions,
|
||||
_linesPerPage, _charsPerLine, 0,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
}
|
||||
|
||||
// Save complete index
|
||||
@@ -1109,8 +1123,10 @@ private:
|
||||
display.fillRect(0, y, display.width(), listLineH);
|
||||
#else
|
||||
// setCursor adds +5 to y internally, but fillRect does not.
|
||||
// Offset fillRect by +5 to align highlight bar with text.
|
||||
display.fillRect(0, y + _prefs->smallHighlightOff(), display.width(), listLineH);
|
||||
// Built-in font: offset by +5 to align with top-left positioned text.
|
||||
// GFX fonts (large_font or custom style): offset by -2 to cover ascenders above baseline.
|
||||
int hlOff = (!_prefs->large_font && display.getFontStyle() > 0) ? -2 : _prefs->smallHighlightOff();
|
||||
display.fillRect(0, y + hlOff, display.width(), listLineH);
|
||||
#endif
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
} else {
|
||||
@@ -1176,18 +1192,29 @@ private:
|
||||
int y = 0;
|
||||
int lineCount = 0;
|
||||
int pos = 0;
|
||||
int maxY = display.height() - _footerHeight - _lineHeight;
|
||||
int textArea = display.height() - _footerHeight; // total usable height (matches indexer's textAreaHeight)
|
||||
|
||||
// Render all lines in the page buffer using word wrap.
|
||||
// The buffer contains exactly the bytes for this page (from indexed positions),
|
||||
// so we render everything in it.
|
||||
while (pos < _pageBufLen && y <= maxY) {
|
||||
// Proportional fonts use pixel-based wrapping to match the indexer exactly.
|
||||
bool usePixelWrap = (_prefs->large_font || display.getFontStyle() > 0);
|
||||
while (pos < _pageBufLen) {
|
||||
int oldPos = pos;
|
||||
WrapResult wrap = findLineBreak(_pageBuf, _pageBufLen, pos, _charsPerLine);
|
||||
WrapResult wrap = usePixelWrap
|
||||
? findLineBreakPixel(_pageBuf, _pageBufLen, pos, &display, _charsPerLine)
|
||||
: findLineBreak(_pageBuf, _pageBufLen, pos, _charsPerLine);
|
||||
|
||||
// Safety: stop if findLineBreak made no progress (stuck at end of buffer)
|
||||
// Safety: stop if wrap made no progress (stuck at end of buffer)
|
||||
if (wrap.nextStart <= oldPos && wrap.lineEnd >= _pageBufLen) break;
|
||||
|
||||
// Height-aware stop check — must match the indexer exactly.
|
||||
// Blank lines (lineEnd == lineStart) get reduced height.
|
||||
// Check BEFORE rendering: does this line fit on the current page?
|
||||
bool isBlankLine = (wrap.lineEnd == pos);
|
||||
int thisH = isBlankLine ? max(2, _lineHeight * 2 / 5) : _lineHeight;
|
||||
if (y > 0 && y + thisH > textArea) break;
|
||||
|
||||
display.setCursor(0, y);
|
||||
// Print line with UTF-8 decoding: multi-byte sequences are decoded
|
||||
// to Unicode codepoints, then mapped to CP437 for the built-in font.
|
||||
@@ -1281,7 +1308,7 @@ private:
|
||||
|
||||
public:
|
||||
TextReaderScreen(UITask* task, NodePrefs* prefs = nullptr)
|
||||
: _task(task), _prefs(prefs), _mode(FILE_LIST), _sdReady(false), _initialized(false), _lastFontPref(0),
|
||||
: _task(task), _prefs(prefs), _mode(FILE_LIST), _sdReady(false), _initialized(false), _lastFontPref(0), _fontKey(0),
|
||||
_bootIndexed(false), _display(nullptr),
|
||||
_charsPerLine(38), _linesPerPage(22), _lineHeight(5),
|
||||
_textAreaHeight(100), _headerHeight(14), _footerHeight(14),
|
||||
@@ -1306,14 +1333,16 @@ public:
|
||||
|
||||
// Call once after display is available to calculate layout metrics
|
||||
void initLayout(DisplayDriver& display) {
|
||||
// Re-init if font preference changed since last layout
|
||||
uint8_t curFont = _prefs ? _prefs->large_font : 0;
|
||||
// Re-init if font preference OR font style changed since last layout
|
||||
uint8_t curFont = _prefs ? (_prefs->large_font | (display.getFontStyle() << 4)) : 0;
|
||||
if (_initialized && curFont != _lastFontPref) {
|
||||
_initialized = false;
|
||||
_fileCache.clear(); // Page positions are font-dependent — force re-index
|
||||
Serial.println("TextReader: font changed, recalculating layout");
|
||||
}
|
||||
if (_initialized) return;
|
||||
_lastFontPref = curFont;
|
||||
_fontKey = curFont; // Stored in .idx files for SD cache invalidation
|
||||
|
||||
// Store display reference for splash screens during openBook
|
||||
_display = &display;
|
||||
@@ -1344,13 +1373,16 @@ public:
|
||||
if (_charsPerLine < 15) _charsPerLine = 15;
|
||||
if (_charsPerLine > 80) _charsPerLine = 80;
|
||||
#else
|
||||
// T-Deck Pro: large_font uses FreeSans9pt (proportional) — same fix
|
||||
if (_prefs && _prefs->large_font) {
|
||||
// T-Deck Pro: proportional font — measure average character width from
|
||||
// a sample sentence (M is widest glyph, ~40% wider than average).
|
||||
// Large font (9pt) uses 70% safety margin; custom tiny (7pt) uses 85%.
|
||||
if (_prefs && (_prefs->large_font || display.getFontStyle() > 0)) {
|
||||
const char* sample = "the quick brown fox jumps over lazy dog";
|
||||
uint16_t sampleW = display.getTextWidth(sample);
|
||||
int sampleLen = strlen(sample);
|
||||
if (sampleW > 0 && sampleLen > 0) {
|
||||
_charsPerLine = (display.width() * sampleLen * 70) / ((int)sampleW * 100);
|
||||
int pct = _prefs->large_font ? 70 : 85;
|
||||
_charsPerLine = (display.width() * sampleLen * pct) / ((int)sampleW * 100);
|
||||
}
|
||||
}
|
||||
if (_charsPerLine < 15) _charsPerLine = 15;
|
||||
@@ -1378,10 +1410,13 @@ public:
|
||||
}
|
||||
#else
|
||||
// T-Deck Pro large_font uses FreeSans9pt (yAdvance=22px at scale 1.5625×).
|
||||
// The 6x8 formula above gives ~5-7 which is way too small — lines overlap.
|
||||
// Use smallLineH() which is already tuned for this font.
|
||||
// Custom proportional fonts (Noto Sans, Montserrat) at size 0 also need
|
||||
// a tuned line height — the 6x8 formula above uses a width:height ratio
|
||||
// that doesn't apply to GFX fonts, causing overlap or excessive spacing.
|
||||
if (_prefs && _prefs->large_font) {
|
||||
_lineHeight = _prefs->smallLineH();
|
||||
_lineHeight = _prefs->smallLineH(); // 11 — tested for FreeSans9pt
|
||||
} else if (display.getFontStyle() > 0) {
|
||||
_lineHeight = 7; // Custom 7pt fonts: 7 * 2.5 = 17.5px — fits ~16 lines/page
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1482,10 +1517,12 @@ public:
|
||||
cache.pagePositions.clear();
|
||||
cache.pagePositions.push_back(0);
|
||||
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
indexPagesWordWrap(file, 0, cache.pagePositions,
|
||||
_linesPerPage, _charsPerLine,
|
||||
PREINDEX_PAGES - 1,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
cache.fullyIndexed = !file.available();
|
||||
file.close();
|
||||
|
||||
@@ -1612,10 +1649,12 @@ public:
|
||||
cache.pagePositions.clear();
|
||||
cache.pagePositions.push_back(0);
|
||||
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
int added = indexPagesWordWrap(file, 0, cache.pagePositions,
|
||||
_linesPerPage, _charsPerLine,
|
||||
PREINDEX_PAGES - 1,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
cache.fullyIndexed = !file.available();
|
||||
file.close();
|
||||
|
||||
@@ -1678,9 +1717,11 @@ public:
|
||||
// Layout was invalidated (orientation change) — reindex the open book
|
||||
Serial.println("TextReader: Reindexing after layout change");
|
||||
_pagePositions.push_back(0);
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
indexPagesWordWrap(_file, 0, _pagePositions,
|
||||
_linesPerPage, _charsPerLine, 0,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
_totalPages = _pagePositions.size();
|
||||
if (_currentPage >= _totalPages) _currentPage = 0;
|
||||
_mode = READING;
|
||||
@@ -1718,7 +1759,7 @@ public:
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
const int bodyTop = startY;
|
||||
#else
|
||||
const int bodyTop = startY + (_prefs ? _prefs->smallHighlightOff() : 5);
|
||||
const int bodyTop = startY + ((_prefs && !_prefs->large_font && _prefs->ui_font_style > 0) ? -2 : (_prefs ? _prefs->smallHighlightOff() : 5));
|
||||
#endif
|
||||
if (vy < bodyTop || vy >= 128 - footerH) return 0;
|
||||
|
||||
@@ -1849,10 +1890,12 @@ public:
|
||||
cache.lastReadPage = 0;
|
||||
cache.pagePositions.clear();
|
||||
cache.pagePositions.push_back(0);
|
||||
DisplayDriver* pxd = (_prefs->large_font || _prefs->ui_font_style > 0) ? _display : nullptr;
|
||||
if (pxd) pxd->setTextSize(_prefs->smallTextSize());
|
||||
indexPagesWordWrap(file, 0, cache.pagePositions,
|
||||
_linesPerPage, _charsPerLine,
|
||||
PREINDEX_PAGES - 1,
|
||||
_textAreaHeight, _lineHeight);
|
||||
_textAreaHeight, _lineHeight, pxd);
|
||||
cache.fullyIndexed = !file.available();
|
||||
file.close();
|
||||
saveIndex(cache.filename, cache.pagePositions, cache.fileSize,
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
|
||||
#include "icons.h"
|
||||
#include "ChannelScreen.h"
|
||||
#include "ChannelPickerScreen.h"
|
||||
#include "ContactsScreen.h"
|
||||
#include "TextReaderScreen.h"
|
||||
#include "SettingsScreen.h"
|
||||
@@ -186,14 +187,14 @@ void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts,
|
||||
sprintf(pctStr, "%d%%", batteryPercentage);
|
||||
uint16_t textWidth = display.getTextWidth(pctStr);
|
||||
|
||||
if (_node_prefs->large_font) {
|
||||
// Large font: text only — no room for icon in header
|
||||
if (_node_prefs->large_font || display.getFontStyle() > 0) {
|
||||
// Large font or custom proportional font: text only — icon doesn't align
|
||||
int textX = display.width() - textWidth - 2;
|
||||
if (outIconX) *outIconX = textX;
|
||||
display.setCursor(textX, textY);
|
||||
display.print(pctStr);
|
||||
} else {
|
||||
// Tiny font: icon + text
|
||||
// Classic tiny font (monospaced): icon + text
|
||||
// layout: [icon][cap 2px][gap 2px][text][margin 2px]
|
||||
int totalWidth = iconWidth + 2 + 2 + textWidth + 2;
|
||||
int iconX = display.width() - totalWidth;
|
||||
@@ -481,11 +482,20 @@ public:
|
||||
display.setTextSize(_node_prefs->smallTextSize());
|
||||
int menuLH = _node_prefs->smallLineH();
|
||||
|
||||
if (_node_prefs->large_font) {
|
||||
if (_node_prefs->large_font || display.getFontStyle() > 0) {
|
||||
// Proportional font: two-column layout with fixed X positions
|
||||
y += 2;
|
||||
int col1 = 2;
|
||||
int col2 = display.width() / 2;
|
||||
int col1, col2;
|
||||
if (_node_prefs->large_font) {
|
||||
// 9pt font: measure widest left entry and place col2 just past it
|
||||
col1 = 2;
|
||||
int leftW = display.getTextWidth("[M] Messages");
|
||||
col2 = col1 + leftW + 3;
|
||||
} else {
|
||||
// Custom tiny (7pt): centered layout
|
||||
col1 = display.width() / 10;
|
||||
col2 = display.width() * 11 / 20;
|
||||
}
|
||||
|
||||
display.setCursor(col1, y); display.print("[M] Messages");
|
||||
display.setCursor(col2, y); display.print("[C] Contacts");
|
||||
@@ -523,7 +533,7 @@ public:
|
||||
#endif
|
||||
y += menuLH + 2;
|
||||
} else {
|
||||
// Monospaced built-in font: centered space-padded strings
|
||||
// Monospaced built-in font (Classic): centered space-padded strings
|
||||
y += 6;
|
||||
display.drawTextCentered(display.width() / 2, y, "Press:");
|
||||
y += 12;
|
||||
@@ -561,7 +571,7 @@ public:
|
||||
if (y < display.height() - 14) {
|
||||
display.setColor(DisplayDriver::GREEN);
|
||||
display.drawTextCentered(display.width() / 2, y,
|
||||
_node_prefs->large_font ? "A/D: cycle views" : "Press A/D to cycle home views");
|
||||
(_node_prefs->large_font || display.getFontStyle() > 0) ? "A/D: cycle views" : "Press A/D to cycle home views");
|
||||
}
|
||||
display.setTextSize(1); // restore
|
||||
#endif
|
||||
@@ -1286,6 +1296,8 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
|
||||
msg_preview = new MsgPreviewScreen(this, &rtc_clock);
|
||||
channel_screen = new ChannelScreen(this, &rtc_clock);
|
||||
((ChannelScreen*)channel_screen)->setDMUnreadPtr(_dmUnread);
|
||||
channel_picker_screen = new ChannelPickerScreen(this);
|
||||
((ChannelPickerScreen*)channel_picker_screen)->setChannelScreen((ChannelScreen*)channel_screen);
|
||||
contacts_screen = new ContactsScreen(this, &rtc_clock);
|
||||
((ContactsScreen*)contacts_screen)->setDMUnreadPtr(_dmUnread);
|
||||
text_reader = new TextReaderScreen(this, node_prefs);
|
||||
@@ -1324,6 +1336,11 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
|
||||
::display.setDarkMode(true);
|
||||
}
|
||||
|
||||
// Apply saved font style preference (Classic / Noto Sans / Montserrat)
|
||||
if (_node_prefs->ui_font_style > 0) {
|
||||
::display.setFontStyle(_node_prefs->ui_font_style);
|
||||
}
|
||||
|
||||
setCurrScreen(splash);
|
||||
}
|
||||
|
||||
@@ -1494,6 +1511,10 @@ void UITask::newMsg(uint8_t path_len, const char* from_name, const char* text, i
|
||||
snprintf(alertBuf, sizeof(alertBuf), "New: %s", from_name);
|
||||
showAlert(alertBuf, 2000);
|
||||
}
|
||||
// Ensure picker badges update after toaster clears
|
||||
if (isOnChannelPickerScreen()) {
|
||||
forceRefresh();
|
||||
}
|
||||
#else
|
||||
// Other devices: Show full preview screen (legacy behavior, skip room sync)
|
||||
if (!isRoomMsg) setCurrScreen(msg_preview);
|
||||
@@ -1674,6 +1695,12 @@ void UITask::loop() {
|
||||
gotoHomeScreen();
|
||||
}
|
||||
c = 0;
|
||||
} else if (isOnChannelPickerScreen()) {
|
||||
gotoHomeScreen(); // picker → home
|
||||
c = 0;
|
||||
} else if (isOnChannelScreen()) {
|
||||
gotoChannelPickerScreen(); // channel messages → picker
|
||||
c = 0;
|
||||
} else {
|
||||
gotoHomeScreen();
|
||||
c = 0; // consumed
|
||||
@@ -1822,6 +1849,10 @@ if (curr) curr->poll();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// Sync font style with prefs (settings toggle takes effect here)
|
||||
if (_node_prefs && display.getFontStyle() != _node_prefs->ui_font_style) {
|
||||
display.setFontStyle(_node_prefs->ui_font_style);
|
||||
}
|
||||
_display->startFrame();
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
if (_vkbActive) {
|
||||
@@ -2527,10 +2558,10 @@ bool UITask::isHomeOnRecentPage() const {
|
||||
return curr == home && ((HomeScreen *) home)->isOnRecentPage();
|
||||
}
|
||||
|
||||
void UITask::gotoChannelScreen() {
|
||||
void UITask::gotoChannelScreen(bool resetDmView) {
|
||||
ChannelScreen* cs = (ChannelScreen*)channel_screen;
|
||||
// If currently showing DM view, reset to channel 0
|
||||
if (cs->getViewChannelIdx() == 0xFF) {
|
||||
// If currently showing DM view, reset to channel 0 (unless caller opts out)
|
||||
if (resetDmView && cs->getViewChannelIdx() == 0xFF) {
|
||||
cs->setViewChannelIdx(0);
|
||||
}
|
||||
cs->resetScroll();
|
||||
@@ -2544,6 +2575,18 @@ void UITask::gotoChannelScreen() {
|
||||
_next_refresh = 100;
|
||||
}
|
||||
|
||||
void UITask::gotoChannelPickerScreen() {
|
||||
ChannelScreen* cs = (ChannelScreen*)channel_screen;
|
||||
ChannelPickerScreen* pick = (ChannelPickerScreen*)channel_picker_screen;
|
||||
pick->enter(cs->getViewChannelIdx());
|
||||
setCurrScreen(channel_picker_screen);
|
||||
if (_display != NULL && !_display->isOn()) {
|
||||
_display->turnOn();
|
||||
}
|
||||
_auto_off = millis() + AUTO_OFF_MILLIS;
|
||||
_next_refresh = 100;
|
||||
}
|
||||
|
||||
void UITask::gotoDMTab() {
|
||||
((ChannelScreen *) channel_screen)->setViewChannelIdx(0xFF); // switches + marks read
|
||||
((ChannelScreen *) channel_screen)->resetScroll();
|
||||
|
||||
@@ -81,6 +81,7 @@ class UITask : public AbstractUITask {
|
||||
UIScreen* home;
|
||||
UIScreen* msg_preview;
|
||||
UIScreen* channel_screen; // Channel message history screen
|
||||
UIScreen* channel_picker_screen; // Channel picker (bubble/list view)
|
||||
UIScreen* contacts_screen; // Contacts list screen
|
||||
UIScreen* text_reader; // *** NEW: Text reader screen ***
|
||||
UIScreen* notes_screen; // Notes editor screen
|
||||
@@ -179,7 +180,8 @@ public:
|
||||
void begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs);
|
||||
|
||||
void gotoHomeScreen();
|
||||
void gotoChannelScreen(); // Navigate to channel message screen
|
||||
void gotoChannelScreen(bool resetDmView = true); // Navigate to channel message screen
|
||||
void gotoChannelPickerScreen(); // Navigate to channel picker (bubble/list)
|
||||
void gotoDMTab(); // Navigate directly to DM tab on channel screen
|
||||
void gotoDMConversation(const char* contactName, int contactIdx = -1, uint8_t perms = 0);
|
||||
void gotoContactsScreen(); // Navigate to contacts list
|
||||
@@ -232,6 +234,7 @@ public:
|
||||
bool hasDisplay() const { return _display != NULL; }
|
||||
bool isButtonPressed() const;
|
||||
bool isOnChannelScreen() const { return curr == channel_screen; }
|
||||
bool isOnChannelPickerScreen() const { return curr == channel_picker_screen; }
|
||||
bool isOnContactsScreen() const { return curr == contacts_screen; }
|
||||
bool isOnTextReader() const { return curr == text_reader; } // *** NEW ***
|
||||
bool isOnHomeScreen() const { return curr == home; }
|
||||
@@ -311,6 +314,7 @@ public:
|
||||
UIScreen* getNotesScreen() const { return notes_screen; }
|
||||
UIScreen* getContactsScreen() const { return contacts_screen; }
|
||||
UIScreen* getChannelScreen() const { return channel_screen; }
|
||||
UIScreen* getChannelPickerScreen() const { return channel_picker_screen; }
|
||||
UIScreen* getSettingsScreen() const { return settings_screen; }
|
||||
NodePrefs* getNodePrefs() const { return _node_prefs; }
|
||||
UIScreen* getAudiobookScreen() const { return audiobook_screen; }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
// Emoji Picker with scrolling grid and scroll bar
|
||||
// 5 columns, 4 visible rows, scrollable through all 65 emoji
|
||||
// 5 columns, 4 visible rows, scrollable through all 76 emoji
|
||||
// WASD navigation, Enter to select, $/Q/Backspace to cancel
|
||||
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
@@ -12,71 +12,85 @@
|
||||
#define EMOJI_PICKER_TOTAL_ROWS ((EMOJI_COUNT + EMOJI_PICKER_COLS - 1) / EMOJI_PICKER_COLS)
|
||||
|
||||
static const char* EMOJI_LABELS[EMOJI_COUNT] = {
|
||||
// Faces/emotion
|
||||
"Lol", // 0 joy
|
||||
"Like", // 1 thumbsup
|
||||
"Sad", // 2 frown
|
||||
"WiFi", // 3 wireless
|
||||
"Inf", // 4 infinity
|
||||
"Rex", // 5 trex
|
||||
"Skul", // 6 skull
|
||||
"Cros", // 7 cross
|
||||
"Bolt", // 8 lightning
|
||||
"Hat", // 9 tophat
|
||||
"Moto", // 10 motorcycle
|
||||
"Leaf", // 11 seedling
|
||||
"AU", // 12 flag_au
|
||||
"Umbr", // 13 umbrella
|
||||
"Eye", // 14 nazar
|
||||
"Glob", // 15 globe
|
||||
"Rad", // 16 radioactive
|
||||
"Cow", // 17 cow
|
||||
"ET", // 18 alien
|
||||
"Inv", // 19 invader
|
||||
"Dagr", // 20 dagger
|
||||
"Grim", // 21 grimace
|
||||
"Mtn", // 22 mountain
|
||||
"End", // 23 end_arrow
|
||||
"Ring", // 24 hollow_circle
|
||||
"Drag", // 25 dragon
|
||||
"Web", // 26 globe_meridians
|
||||
"Eggp", // 27 eggplant
|
||||
"Shld", // 28 shield
|
||||
"Gogl", // 29 goggles
|
||||
"Lzrd", // 30 lizard
|
||||
"Zany", // 31 zany_face
|
||||
"Roo", // 32 kangaroo
|
||||
"Fthr", // 33 feather
|
||||
"Sun", // 34 bright
|
||||
"Wave", // 35 part_alt
|
||||
"Boat", // 36 motorboat
|
||||
"Domi", // 37 domino
|
||||
"Dish", // 38 satellite
|
||||
"Pass", // 39 customs
|
||||
"Cowb", // 40 cowboy
|
||||
"Whl", // 41 wheel
|
||||
"Koal", // 42 koala
|
||||
"Knob", // 43 control_knobs
|
||||
"Pch", // 44 peach
|
||||
"Race", // 45 racing_car
|
||||
"Mous", // 46 mouse
|
||||
"Shrm", // 47 mushroom
|
||||
"Bio", // 48 biohazard
|
||||
"Pnda", // 49 panda
|
||||
"Bang", // 50 anger
|
||||
"DrgF", // 51 dragon_face
|
||||
"Pagr", // 52 pager
|
||||
"Bee", // 53 bee
|
||||
"Bulb", // 54 bulb
|
||||
"Cat", // 55 cat
|
||||
"Flur", // 56 fleur
|
||||
"Moon", // 57 moon
|
||||
"Cafe", // 58 coffee
|
||||
"Toth", // 59 tooth
|
||||
"Prtz", // 60 pretzel
|
||||
"Abac", // 61 abacus
|
||||
"Moai", // 62 moai
|
||||
"Hiii", // 63 tipping
|
||||
"Hedg", // 64 hedgehog
|
||||
"Sad", // 1 frown
|
||||
"Cry", // 2 loudly_crying
|
||||
"Grim", // 3 grimace
|
||||
"Zany", // 4 zany_face
|
||||
"Cowb", // 5 cowboy
|
||||
// Thumbsup + heart
|
||||
"Like", // 6 thumbsup
|
||||
"Love", // 7 heart
|
||||
// Everything else
|
||||
"WiFi", // 8 wireless
|
||||
"Inf", // 9 infinity
|
||||
"Rex", // 10 trex
|
||||
"Skul", // 11 skull
|
||||
"Cros", // 12 cross
|
||||
"Bolt", // 13 lightning
|
||||
"Hat", // 14 tophat
|
||||
"Moto", // 15 motorcycle
|
||||
"Leaf", // 16 seedling
|
||||
"AU", // 17 flag_au
|
||||
"Umbr", // 18 umbrella
|
||||
"Eye", // 19 nazar
|
||||
"Glob", // 20 globe
|
||||
"Rad", // 21 radioactive
|
||||
"Cow", // 22 cow
|
||||
"ET", // 23 alien
|
||||
"Inv", // 24 invader
|
||||
"Dagr", // 25 dagger
|
||||
"Mtn", // 26 mountain
|
||||
"End", // 27 end_arrow
|
||||
"Ring", // 28 hollow_circle
|
||||
"Drag", // 29 dragon
|
||||
"Web", // 30 globe_meridians
|
||||
"Eggp", // 31 eggplant
|
||||
"Shld", // 32 shield
|
||||
"Gogl", // 33 goggles
|
||||
"Lzrd", // 34 lizard
|
||||
"Roo", // 35 kangaroo
|
||||
"Fthr", // 36 feather
|
||||
"Sun", // 37 bright
|
||||
"Wave", // 38 part_alt
|
||||
"Boat", // 39 motorboat
|
||||
"Domi", // 40 domino
|
||||
"Dish", // 41 satellite
|
||||
"Pass", // 42 customs
|
||||
"Whl", // 43 wheel
|
||||
"Koal", // 44 koala
|
||||
"Knob", // 45 control_knobs
|
||||
"Pch", // 46 peach
|
||||
"Race", // 47 racing_car
|
||||
"Mous", // 48 mouse
|
||||
"Shrm", // 49 mushroom
|
||||
"Bio", // 50 biohazard
|
||||
"Pnda", // 51 panda
|
||||
"Bang", // 52 anger
|
||||
"DrgF", // 53 dragon_face
|
||||
"Pagr", // 54 pager
|
||||
"Bee", // 55 bee
|
||||
"Bulb", // 56 bulb
|
||||
"Cat", // 57 cat
|
||||
"Flur", // 58 fleur
|
||||
"Moon", // 59 moon
|
||||
"Cafe", // 60 coffee
|
||||
"Toth", // 61 tooth
|
||||
"Prtz", // 62 pretzel
|
||||
"Abac", // 63 abacus
|
||||
"Moai", // 64 moai
|
||||
"Hiii", // 65 tipping
|
||||
"Hedg", // 66 hedgehog
|
||||
"Diam", // 67 diamond_suit
|
||||
"Spde", // 68 spade_suit
|
||||
"Piza", // 69 pizza
|
||||
"Luck", // 70 four_leaf_clover
|
||||
"Cld", // 71 cloud
|
||||
"Rckt", // 72 rocket
|
||||
"HFC", // 73 passport_control
|
||||
"Star", // 74 eight_spoked_asterisk
|
||||
"Sig", // 75 signal_strength
|
||||
};
|
||||
|
||||
struct EmojiPicker {
|
||||
@@ -105,13 +119,23 @@ struct EmojiPicker {
|
||||
|
||||
switch (key) {
|
||||
case 'w': case 'W': case 0xF2:
|
||||
if (row > 0) cursor -= EMOJI_PICKER_COLS;
|
||||
if (row > 0) {
|
||||
cursor -= EMOJI_PICKER_COLS;
|
||||
} else {
|
||||
// Wrap to last row, same column
|
||||
int target = (EMOJI_PICKER_TOTAL_ROWS - 1) * EMOJI_PICKER_COLS + col;
|
||||
cursor = (target >= EMOJI_COUNT) ? EMOJI_COUNT - 1 : target;
|
||||
}
|
||||
break;
|
||||
case 's': case 'S': case 0xF1:
|
||||
if (cursor + EMOJI_PICKER_COLS < EMOJI_COUNT)
|
||||
if (cursor + EMOJI_PICKER_COLS < EMOJI_COUNT) {
|
||||
cursor += EMOJI_PICKER_COLS;
|
||||
else if (row < EMOJI_PICKER_TOTAL_ROWS - 1)
|
||||
} else if (row < EMOJI_PICKER_TOTAL_ROWS - 1) {
|
||||
cursor = EMOJI_COUNT - 1;
|
||||
} else {
|
||||
// Wrap to first row, same column
|
||||
cursor = col;
|
||||
}
|
||||
break;
|
||||
case 'a': case 'A':
|
||||
if (cursor > 0) cursor--;
|
||||
|
||||
@@ -0,0 +1,288 @@
|
||||
#ifndef MONTSERRAT12PT7B_H
|
||||
#define MONTSERRAT12PT7B_H
|
||||
const uint8_t Montserrat_Regular12pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x8C, 0x63, 0x18, 0xC6, 0x20, 0x04,
|
||||
0x10, 0x18, 0x20, 0x30, 0x40, 0x61, 0x80, 0x83, 0x1F, 0xFF, 0xC2, 0x08,
|
||||
0x04, 0x10, 0x08, 0x20, 0x30, 0x40, 0x60, 0x87, 0xFF, 0xE1, 0x06, 0x02,
|
||||
0x0C, 0x04, 0x10, 0x08, 0x20, 0x10, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80,
|
||||
0x1F, 0x83, 0xFF, 0x31, 0x09, 0x88, 0x08, 0x40, 0x42, 0x03, 0x10, 0x0E,
|
||||
0x80, 0x3F, 0x00, 0x3E, 0x01, 0x18, 0x08, 0x60, 0x43, 0x02, 0x1E, 0x11,
|
||||
0x9E, 0xF8, 0x3F, 0x80, 0x20, 0x01, 0x00, 0x08, 0x00, 0x3C, 0x02, 0x19,
|
||||
0x81, 0x8C, 0x20, 0xC2, 0x08, 0x20, 0x83, 0x10, 0x20, 0xCC, 0x08, 0x22,
|
||||
0x01, 0x19, 0x00, 0x3C, 0xCF, 0x00, 0x26, 0x60, 0x11, 0x0C, 0x0C, 0xC1,
|
||||
0x02, 0x30, 0x41, 0x0C, 0x10, 0xC1, 0x0C, 0x20, 0x62, 0x10, 0x0F, 0x00,
|
||||
0x0F, 0x80, 0x3B, 0x80, 0xC1, 0x01, 0x82, 0x03, 0x04, 0x03, 0x18, 0x06,
|
||||
0xE0, 0x07, 0x00, 0x1E, 0x00, 0x66, 0x11, 0x86, 0x36, 0x06, 0x4C, 0x07,
|
||||
0x98, 0x06, 0x18, 0x0E, 0x3C, 0x76, 0x1F, 0x84, 0xFE, 0x18, 0x8C, 0x46,
|
||||
0x31, 0x88, 0x42, 0x31, 0x84, 0x21, 0x08, 0x63, 0x18, 0x43, 0x08, 0x60,
|
||||
0xC4, 0x66, 0x23, 0x33, 0x11, 0x11, 0x11, 0x13, 0x33, 0x26, 0x64, 0xC0,
|
||||
0x10, 0x10, 0x93, 0x7E, 0x38, 0x7C, 0x93, 0x10, 0x10, 0x0C, 0x03, 0x00,
|
||||
0xC0, 0x30, 0xFF, 0xC3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x1D, 0xA4,
|
||||
0xB0, 0xFE, 0x1F, 0x80, 0x00, 0xC0, 0x20, 0x18, 0x06, 0x01, 0x00, 0xC0,
|
||||
0x30, 0x08, 0x06, 0x01, 0x00, 0x40, 0x30, 0x08, 0x02, 0x01, 0x80, 0x40,
|
||||
0x30, 0x0C, 0x02, 0x01, 0x80, 0x60, 0x10, 0x00, 0x07, 0x80, 0x7F, 0x83,
|
||||
0x03, 0x18, 0x06, 0x60, 0x19, 0x00, 0x6C, 0x00, 0xF0, 0x03, 0xC0, 0x0F,
|
||||
0x00, 0x3C, 0x00, 0xD0, 0x02, 0x60, 0x19, 0x80, 0x63, 0x03, 0x07, 0xF8,
|
||||
0x0F, 0xC0, 0xFF, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
|
||||
0x30, 0xC3, 0x0C, 0x1F, 0x83, 0xFF, 0x38, 0x18, 0x00, 0x60, 0x03, 0x00,
|
||||
0x18, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0,
|
||||
0x0C, 0x00, 0xC0, 0x0F, 0xFF, 0x7F, 0xF8, 0x7F, 0xF7, 0xFF, 0x00, 0x60,
|
||||
0x0C, 0x01, 0x80, 0x30, 0x03, 0x00, 0x60, 0x07, 0xE0, 0x07, 0x00, 0x30,
|
||||
0x01, 0x00, 0x10, 0x03, 0x40, 0x37, 0xDE, 0x1F, 0xC0, 0x00, 0x60, 0x01,
|
||||
0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x30,
|
||||
0x30, 0x60, 0xC0, 0xC1, 0x81, 0x87, 0xFF, 0xFF, 0xFF, 0xE0, 0x0C, 0x00,
|
||||
0x18, 0x00, 0x30, 0x00, 0x60, 0x3F, 0xE7, 0xFE, 0x60, 0x06, 0x00, 0x60,
|
||||
0x06, 0x00, 0x60, 0x07, 0xF0, 0x7F, 0xC0, 0x06, 0x00, 0x60, 0x03, 0x00,
|
||||
0x30, 0x02, 0xC0, 0x6F, 0xBC, 0x3F, 0x80, 0x07, 0xE0, 0xFF, 0x8E, 0x00,
|
||||
0xC0, 0x06, 0x00, 0x20, 0x03, 0x00, 0x19, 0xF8, 0xDE, 0xE7, 0x81, 0xB8,
|
||||
0x07, 0xC0, 0x36, 0x01, 0xB0, 0x0C, 0xC0, 0xC3, 0x9E, 0x0F, 0xC0, 0xFF,
|
||||
0xFF, 0xFF, 0x80, 0x38, 0x06, 0x80, 0x60, 0x0C, 0x00, 0xC0, 0x18, 0x01,
|
||||
0x80, 0x10, 0x03, 0x00, 0x30, 0x06, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x18,
|
||||
0x00, 0x0F, 0x81, 0xFF, 0x18, 0x0C, 0xC0, 0x26, 0x01, 0xB0, 0x09, 0x80,
|
||||
0xC7, 0xBC, 0x1F, 0xE3, 0x83, 0x98, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0D,
|
||||
0x80, 0xEF, 0x1E, 0x1F, 0xC0, 0x1F, 0x07, 0xFC, 0xE0, 0x6C, 0x02, 0xC0,
|
||||
0x38, 0x03, 0xC0, 0x3C, 0x07, 0x71, 0xD3, 0xF9, 0x00, 0x30, 0x03, 0x00,
|
||||
0x30, 0x06, 0x00, 0xE6, 0x7C, 0x7F, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x7E,
|
||||
0x1F, 0x80, 0x00, 0x00, 0x76, 0x92, 0xC0, 0x00, 0xC1, 0xE1, 0xE3, 0xC0,
|
||||
0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xC0, 0x00, 0xFF, 0xFF, 0xF0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x0F, 0xFC, 0xC0, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0xC0,
|
||||
0xF0, 0xE1, 0xE0, 0xC0, 0x00, 0x00, 0x1F, 0x87, 0xFE, 0xE0, 0x60, 0x03,
|
||||
0x00, 0x30, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x03, 0x00, 0x20,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xFE, 0x00, 0x07,
|
||||
0x07, 0x00, 0x30, 0x01, 0x80, 0xC0, 0x01, 0x83, 0x00, 0x01, 0x84, 0x1F,
|
||||
0x91, 0x10, 0x61, 0xA3, 0x21, 0x80, 0xC2, 0xC2, 0x01, 0x85, 0x8C, 0x01,
|
||||
0x0B, 0x18, 0x02, 0x1E, 0x30, 0x04, 0x3C, 0x60, 0x08, 0x58, 0x40, 0x30,
|
||||
0x90, 0xC0, 0xE1, 0x30, 0xE3, 0x64, 0x20, 0xFC, 0x78, 0x60, 0x00, 0x00,
|
||||
0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0x80, 0x00,
|
||||
0x00, 0xC0, 0x00, 0xE0, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x22, 0x00, 0x31,
|
||||
0x80, 0x18, 0x40, 0x18, 0x30, 0x0C, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x03,
|
||||
0xFF, 0xC3, 0xFF, 0xE1, 0x00, 0x19, 0x80, 0x0C, 0xC0, 0x02, 0xC0, 0x01,
|
||||
0x80, 0xFF, 0xC3, 0xFF, 0xCC, 0x03, 0x30, 0x06, 0xC0, 0x1B, 0x00, 0x6C,
|
||||
0x01, 0x30, 0x1C, 0xFF, 0xE3, 0x00, 0xEC, 0x01, 0xB0, 0x03, 0xC0, 0x0F,
|
||||
0x00, 0x3C, 0x01, 0xB0, 0x3E, 0xFF, 0xE0, 0x03, 0xF0, 0x1F, 0xF8, 0x70,
|
||||
0x19, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01,
|
||||
0x80, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x01, 0x87,
|
||||
0xBE, 0x07, 0xF8, 0xFF, 0x80, 0xFF, 0xF0, 0xC0, 0x38, 0xC0, 0x0C, 0xC0,
|
||||
0x06, 0xC0, 0x06, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||
0x02, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x0C, 0xC0, 0x38, 0xFF, 0xF0, 0xFF,
|
||||
0xC0, 0xFF, 0xEF, 0xFE, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C,
|
||||
0x00, 0xFF, 0xCC, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F,
|
||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30,
|
||||
0x06, 0x00, 0xFF, 0xDF, 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06,
|
||||
0x00, 0xC0, 0x00, 0x03, 0xF0, 0x1F, 0xF8, 0x70, 0x19, 0x80, 0x06, 0x00,
|
||||
0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x07, 0x00, 0x0B,
|
||||
0x00, 0x16, 0x00, 0x26, 0x00, 0x46, 0x01, 0x87, 0xDF, 0x03, 0xF8, 0xC0,
|
||||
0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
|
||||
0x03, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C,
|
||||
0x00, 0xF0, 0x03, 0xC0, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0x9F,
|
||||
0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10,
|
||||
0x08, 0x0F, 0x07, 0xEE, 0x3E, 0x00, 0xC0, 0x1B, 0x00, 0xCC, 0x06, 0x30,
|
||||
0x30, 0xC1, 0x83, 0x0C, 0x0C, 0x60, 0x33, 0x00, 0xDE, 0x03, 0xFC, 0x0F,
|
||||
0x30, 0x38, 0x60, 0xC0, 0xC3, 0x01, 0x8C, 0x03, 0x30, 0x0E, 0xC0, 0x1C,
|
||||
0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0,
|
||||
0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0,
|
||||
0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7B, 0x00, 0x7C, 0x80,
|
||||
0x2E, 0x60, 0x37, 0x10, 0x33, 0x8C, 0x19, 0xC3, 0x18, 0xE1, 0x88, 0x70,
|
||||
0x6C, 0x38, 0x14, 0x1C, 0x0E, 0x0E, 0x02, 0x07, 0x00, 0x03, 0x80, 0x01,
|
||||
0x80, 0x80, 0x0F, 0x00, 0x3E, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0x60, 0x3C,
|
||||
0xC0, 0xF1, 0x83, 0xC3, 0x0F, 0x0E, 0x3C, 0x18, 0xF0, 0x33, 0xC0, 0x6F,
|
||||
0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0C, 0x03, 0xF0, 0x03, 0xFF, 0x01,
|
||||
0xC0, 0x60, 0xC0, 0x0C, 0x60, 0x01, 0x98, 0x00, 0x6C, 0x00, 0x0F, 0x00,
|
||||
0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0D, 0x80, 0x02, 0x60, 0x01,
|
||||
0x8C, 0x00, 0xC1, 0x80, 0x70, 0x3C, 0xF0, 0x03, 0xF8, 0x00, 0xFF, 0x87,
|
||||
0xFF, 0x30, 0x1D, 0x80, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0,
|
||||
0x36, 0x03, 0xBF, 0xF9, 0xFE, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00,
|
||||
0xC0, 0x00, 0x03, 0xF0, 0x01, 0xFF, 0x80, 0x70, 0x18, 0x18, 0x01, 0x86,
|
||||
0x00, 0x18, 0xC0, 0x03, 0x30, 0x00, 0x36, 0x00, 0x06, 0xC0, 0x00, 0xD8,
|
||||
0x00, 0x1B, 0x00, 0x03, 0x30, 0x00, 0xC6, 0x00, 0x18, 0x60, 0x06, 0x06,
|
||||
0x01, 0xC0, 0x79, 0xE0, 0x07, 0xF8, 0x00, 0x0E, 0x00, 0x00, 0xE3, 0x80,
|
||||
0x07, 0xE0, 0xFF, 0x87, 0xFF, 0x30, 0x1D, 0x80, 0x6C, 0x01, 0xE0, 0x0F,
|
||||
0x00, 0x78, 0x03, 0xC0, 0x36, 0x03, 0xBF, 0xF9, 0xFF, 0x0C, 0x0C, 0x60,
|
||||
0x33, 0x01, 0x98, 0x06, 0xC0, 0x18, 0x0F, 0xC1, 0xFF, 0x98, 0x04, 0xC0,
|
||||
0x04, 0x00, 0x20, 0x01, 0x80, 0x07, 0x00, 0x1F, 0x80, 0x0F, 0x00, 0x0C,
|
||||
0x00, 0x30, 0x01, 0x80, 0x0F, 0x00, 0xCF, 0x3C, 0x1F, 0xC0, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0,
|
||||
0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30,
|
||||
0x00, 0xC0, 0x03, 0x00, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00,
|
||||
0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x3C,
|
||||
0x01, 0xE0, 0x0D, 0x80, 0xC7, 0xBC, 0x1F, 0xC0, 0xC0, 0x01, 0xB0, 0x01,
|
||||
0x98, 0x00, 0xC4, 0x00, 0xC3, 0x00, 0x61, 0x80, 0x20, 0x60, 0x30, 0x30,
|
||||
0x10, 0x0C, 0x18, 0x06, 0x0C, 0x01, 0x8C, 0x00, 0xC6, 0x00, 0x26, 0x00,
|
||||
0x1B, 0x00, 0x0D, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x18, 0x01,
|
||||
0xE0, 0x0E, 0x00, 0x90, 0x07, 0x00, 0xCC, 0x06, 0x80, 0x66, 0x03, 0x60,
|
||||
0x21, 0x01, 0x30, 0x30, 0xC1, 0x88, 0x18, 0x60, 0xC6, 0x08, 0x18, 0x43,
|
||||
0x0C, 0x0C, 0x60, 0x86, 0x06, 0x30, 0x62, 0x01, 0x10, 0x33, 0x00, 0xD8,
|
||||
0x09, 0x80, 0x6C, 0x06, 0x80, 0x1C, 0x03, 0xC0, 0x0E, 0x00, 0xE0, 0x07,
|
||||
0x00, 0x60, 0x00, 0x60, 0x06, 0x60, 0x18, 0xE0, 0x60, 0xC0, 0x80, 0xC3,
|
||||
0x00, 0xCC, 0x01, 0xF0, 0x01, 0xE0, 0x01, 0x80, 0x07, 0x80, 0x1B, 0x80,
|
||||
0x63, 0x00, 0xC3, 0x03, 0x03, 0x0C, 0x07, 0x18, 0x06, 0x60, 0x06, 0xC0,
|
||||
0x06, 0xC0, 0x09, 0x80, 0x31, 0x80, 0xC1, 0x81, 0x83, 0x06, 0x03, 0x08,
|
||||
0x06, 0x30, 0x06, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x0C, 0x00, 0x18, 0x00,
|
||||
0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
|
||||
0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18,
|
||||
0x00, 0xC0, 0x07, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x3F, 0xFF, 0xFF,
|
||||
0xFC, 0xFF, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F,
|
||||
0xF0, 0xC0, 0x10, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x40, 0x18,
|
||||
0x02, 0x00, 0x80, 0x30, 0x04, 0x01, 0x80, 0x60, 0x08, 0x03, 0x00, 0xC0,
|
||||
0x10, 0x06, 0x01, 0x80, 0x20, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6,
|
||||
0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xFF, 0xE0, 0x0C, 0x07, 0x01, 0x60,
|
||||
0x48, 0x33, 0x08, 0x46, 0x19, 0x02, 0xC0, 0xA0, 0x30, 0xFF, 0xF0, 0xE0,
|
||||
0xC1, 0x80, 0x0E, 0x0F, 0xF9, 0x83, 0x00, 0x30, 0x06, 0x00, 0xCF, 0xFB,
|
||||
0x03, 0xC0, 0x78, 0x0F, 0x03, 0xB8, 0xF3, 0xF6, 0xC0, 0x06, 0x00, 0x30,
|
||||
0x01, 0x80, 0x0C, 0x00, 0x63, 0xC3, 0x7F, 0x9E, 0x0E, 0xE0, 0x36, 0x00,
|
||||
0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x7E, 0x06, 0xDC, 0xE6,
|
||||
0x7E, 0x00, 0x07, 0x01, 0xFC, 0x30, 0x66, 0x00, 0xC0, 0x0C, 0x00, 0xC0,
|
||||
0x0C, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x23, 0xDE, 0x0F, 0x80, 0x00, 0x18,
|
||||
0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x83, 0x8C, 0x7F, 0x6E, 0x0F, 0x60,
|
||||
0x3E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0D, 0x80, 0xEC, 0x07,
|
||||
0x3D, 0xD8, 0xFC, 0xC0, 0x07, 0x01, 0xFC, 0x70, 0x66, 0x03, 0xC0, 0x3C,
|
||||
0x01, 0xFF, 0xFC, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x23, 0xDE, 0x0F, 0xC0,
|
||||
0x0F, 0x0F, 0xC6, 0x02, 0x01, 0x07, 0xFB, 0xFC, 0x20, 0x10, 0x08, 0x04,
|
||||
0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x07, 0x19, 0xFE,
|
||||
0xDC, 0x1E, 0xC0, 0x7C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B,
|
||||
0x01, 0xCC, 0x1E, 0x3F, 0xB0, 0x21, 0x80, 0x0C, 0x00, 0x6C, 0x06, 0x3F,
|
||||
0xE0, 0x7C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x78,
|
||||
0xDF, 0xCF, 0x06, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0C,
|
||||
0x30, 0x00, 0x00, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
|
||||
0x30, 0xC3, 0x0F, 0xE7, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0,
|
||||
0x0C, 0x07, 0xC0, 0xEC, 0x1C, 0xC3, 0x0C, 0x60, 0xCC, 0x0D, 0xE0, 0xF3,
|
||||
0x0E, 0x18, 0xC1, 0x8C, 0x0C, 0xC0, 0x6C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xC7, 0x01, 0xC6, 0xFE, 0x7F, 0xBC, 0x1E, 0x0D, 0xC0, 0xE0, 0x3C,
|
||||
0x03, 0x01, 0xE0, 0x18, 0x0F, 0x00, 0xC0, 0x78, 0x06, 0x03, 0xC0, 0x30,
|
||||
0x1E, 0x01, 0x80, 0xF0, 0x0C, 0x07, 0x80, 0x60, 0x3C, 0x03, 0x01, 0x80,
|
||||
0xC7, 0x8D, 0xFC, 0xF0, 0x6E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x30, 0x07, 0x00, 0xFE, 0x0C,
|
||||
0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01,
|
||||
0x98, 0x0C, 0x7B, 0xC0, 0xF8, 0x00, 0xC7, 0x86, 0xFF, 0x3C, 0x1D, 0xC0,
|
||||
0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x00, 0xFC, 0x0D,
|
||||
0xB9, 0xCC, 0xFC, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x00,
|
||||
0x07, 0x18, 0xFE, 0xDC, 0x1E, 0xC0, 0x7C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
|
||||
0x03, 0xC0, 0x1B, 0x01, 0xD8, 0x0E, 0x7B, 0xB1, 0xF9, 0x80, 0x0C, 0x00,
|
||||
0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0xC7, 0xBF, 0xC7, 0x0C, 0x18, 0x30,
|
||||
0x60, 0xC1, 0x83, 0x06, 0x0C, 0x00, 0x0E, 0x1F, 0xFC, 0x0B, 0x00, 0xC0,
|
||||
0x38, 0x07, 0xE0, 0x1E, 0x00, 0xC0, 0x38, 0x0F, 0xCE, 0x7F, 0x00, 0x10,
|
||||
0x08, 0x3F, 0xDF, 0xE1, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02,
|
||||
0x01, 0x80, 0xE4, 0x3E, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C,
|
||||
0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x60, 0x77, 0x9F, 0x1F, 0x30,
|
||||
0xC0, 0x1A, 0x00, 0xD8, 0x0C, 0xC0, 0x63, 0x06, 0x18, 0x30, 0x41, 0x03,
|
||||
0x18, 0x08, 0x80, 0x6C, 0x03, 0x40, 0x0E, 0x00, 0x70, 0x00, 0xC0, 0x20,
|
||||
0x1A, 0x03, 0x80, 0xD8, 0x1C, 0x04, 0xC0, 0xA0, 0x62, 0x0D, 0x82, 0x18,
|
||||
0x44, 0x30, 0xC2, 0x31, 0x82, 0x31, 0x88, 0x19, 0x04, 0xC0, 0x58, 0x34,
|
||||
0x03, 0xC0, 0xA0, 0x1C, 0x07, 0x00, 0x60, 0x30, 0x00, 0x60, 0x32, 0x06,
|
||||
0x30, 0x41, 0x8C, 0x0D, 0x80, 0x70, 0x06, 0x00, 0x70, 0x0D, 0x81, 0x8C,
|
||||
0x30, 0x43, 0x06, 0x60, 0x30, 0x60, 0x0C, 0x80, 0x33, 0x01, 0x8C, 0x06,
|
||||
0x18, 0x30, 0x60, 0xC0, 0xC2, 0x03, 0x18, 0x04, 0x40, 0x1B, 0x00, 0x28,
|
||||
0x00, 0xE0, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x01, 0x80, 0xFC, 0x00, 0xE0,
|
||||
0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x18,
|
||||
0x0C, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0x0E, 0x3C, 0xC1, 0x83, 0x06, 0x0C,
|
||||
0x18, 0x30, 0x60, 0xC7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83,
|
||||
0x03, 0xC3, 0x80, 0xFF, 0xFF, 0xFE, 0xE1, 0xE0, 0x60, 0xC1, 0x83, 0x06,
|
||||
0x0C, 0x18, 0x30, 0x60, 0x71, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1,
|
||||
0x9E, 0x38, 0x00, 0x7C, 0x28, 0xC5, 0x0F, 0x00 };
|
||||
|
||||
const GFXglyph Montserrat_Regular12pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 17, 6, 2, -16 }, // 0x21 '!'
|
||||
{ 6, 5, 7, 9, 2, -16 }, // 0x22 '"'
|
||||
{ 11, 15, 17, 17, 1, -16 }, // 0x23 '#'
|
||||
{ 43, 13, 23, 15, 1, -19 }, // 0x24 '$'
|
||||
{ 81, 18, 17, 20, 1, -16 }, // 0x25 '%'
|
||||
{ 120, 15, 17, 16, 1, -16 }, // 0x26 '&'
|
||||
{ 152, 1, 7, 5, 2, -16 }, // 0x27 '''
|
||||
{ 153, 5, 23, 8, 2, -17 }, // 0x28 '('
|
||||
{ 168, 4, 23, 8, 1, -17 }, // 0x29 ')'
|
||||
{ 180, 8, 9, 9, 1, -17 }, // 0x2A '*'
|
||||
{ 189, 10, 10, 14, 2, -12 }, // 0x2B '+'
|
||||
{ 202, 3, 7, 5, 1, -2 }, // 0x2C ','
|
||||
{ 205, 7, 1, 9, 1, -6 }, // 0x2D '-'
|
||||
{ 206, 3, 3, 5, 1, -2 }, // 0x2E '.'
|
||||
{ 208, 10, 22, 8, -1, -19 }, // 0x2F '/'
|
||||
{ 236, 14, 17, 16, 1, -16 }, // 0x30 '0'
|
||||
{ 266, 6, 17, 9, 0, -16 }, // 0x31 '1'
|
||||
{ 279, 13, 17, 14, 0, -16 }, // 0x32 '2'
|
||||
{ 307, 12, 17, 14, 0, -16 }, // 0x33 '3'
|
||||
{ 333, 15, 17, 16, 1, -16 }, // 0x34 '4'
|
||||
{ 365, 12, 17, 14, 1, -16 }, // 0x35 '5'
|
||||
{ 391, 13, 17, 15, 1, -16 }, // 0x36 '6'
|
||||
{ 419, 12, 17, 14, 1, -16 }, // 0x37 '7'
|
||||
{ 445, 13, 17, 15, 1, -16 }, // 0x38 '8'
|
||||
{ 473, 12, 17, 15, 1, -16 }, // 0x39 '9'
|
||||
{ 499, 3, 13, 5, 1, -12 }, // 0x3A ':'
|
||||
{ 504, 3, 17, 5, 1, -12 }, // 0x3B ';'
|
||||
{ 511, 10, 10, 14, 2, -12 }, // 0x3C '<'
|
||||
{ 524, 10, 7, 14, 2, -11 }, // 0x3D '='
|
||||
{ 533, 10, 10, 14, 2, -12 }, // 0x3E '>'
|
||||
{ 546, 12, 17, 14, 0, -16 }, // 0x3F '?'
|
||||
{ 572, 23, 22, 25, 1, -16 }, // 0x40 '@'
|
||||
{ 636, 17, 17, 17, 0, -16 }, // 0x41 'A'
|
||||
{ 673, 14, 17, 18, 3, -16 }, // 0x42 'B'
|
||||
{ 703, 15, 17, 17, 1, -16 }, // 0x43 'C'
|
||||
{ 735, 16, 17, 20, 3, -16 }, // 0x44 'D'
|
||||
{ 769, 12, 17, 16, 3, -16 }, // 0x45 'E'
|
||||
{ 795, 11, 17, 15, 3, -16 }, // 0x46 'F'
|
||||
{ 819, 15, 17, 19, 1, -16 }, // 0x47 'G'
|
||||
{ 851, 14, 17, 20, 3, -16 }, // 0x48 'H'
|
||||
{ 881, 2, 17, 7, 3, -16 }, // 0x49 'I'
|
||||
{ 886, 9, 17, 12, 0, -16 }, // 0x4A 'J'
|
||||
{ 906, 14, 17, 17, 3, -16 }, // 0x4B 'K'
|
||||
{ 936, 11, 17, 14, 3, -16 }, // 0x4C 'L'
|
||||
{ 960, 17, 17, 23, 3, -16 }, // 0x4D 'M'
|
||||
{ 997, 14, 17, 20, 3, -16 }, // 0x4E 'N'
|
||||
{ 1027, 18, 17, 20, 1, -16 }, // 0x4F 'O'
|
||||
{ 1066, 13, 17, 17, 3, -16 }, // 0x50 'P'
|
||||
{ 1094, 19, 20, 20, 1, -16 }, // 0x51 'Q'
|
||||
{ 1142, 13, 17, 17, 3, -16 }, // 0x52 'R'
|
||||
{ 1170, 13, 17, 15, 1, -16 }, // 0x53 'S'
|
||||
{ 1198, 14, 17, 14, 0, -16 }, // 0x54 'T'
|
||||
{ 1228, 13, 17, 19, 3, -16 }, // 0x55 'U'
|
||||
{ 1256, 17, 17, 17, 0, -16 }, // 0x56 'V'
|
||||
{ 1293, 25, 17, 27, 1, -16 }, // 0x57 'W'
|
||||
{ 1347, 15, 17, 16, 0, -16 }, // 0x58 'X'
|
||||
{ 1379, 15, 17, 15, 0, -16 }, // 0x59 'Y'
|
||||
{ 1411, 14, 17, 16, 1, -16 }, // 0x5A 'Z'
|
||||
{ 1441, 4, 23, 8, 3, -17 }, // 0x5B '['
|
||||
{ 1453, 10, 22, 8, -1, -19 }, // 0x5C '\'
|
||||
{ 1481, 5, 23, 8, 0, -17 }, // 0x5D ']'
|
||||
{ 1496, 10, 10, 14, 2, -12 }, // 0x5E '^'
|
||||
{ 1509, 12, 1, 12, 0, 1 }, // 0x5F '_'
|
||||
{ 1511, 6, 3, 14, 3, -17 }, // 0x60 '`'
|
||||
{ 1514, 11, 13, 14, 1, -12 }, // 0x61 'a'
|
||||
{ 1532, 13, 18, 16, 2, -17 }, // 0x62 'b'
|
||||
{ 1562, 12, 13, 14, 1, -12 }, // 0x63 'c'
|
||||
{ 1582, 13, 18, 16, 1, -17 }, // 0x64 'd'
|
||||
{ 1612, 12, 13, 15, 1, -12 }, // 0x65 'e'
|
||||
{ 1632, 9, 18, 8, 0, -17 }, // 0x66 'f'
|
||||
{ 1653, 13, 18, 16, 1, -12 }, // 0x67 'g'
|
||||
{ 1683, 12, 18, 16, 2, -17 }, // 0x68 'h'
|
||||
{ 1710, 2, 18, 6, 2, -17 }, // 0x69 'i'
|
||||
{ 1715, 6, 23, 7, -2, -17 }, // 0x6A 'j'
|
||||
{ 1733, 12, 18, 14, 2, -17 }, // 0x6B 'k'
|
||||
{ 1760, 2, 18, 6, 2, -17 }, // 0x6C 'l'
|
||||
{ 1765, 21, 13, 25, 2, -12 }, // 0x6D 'm'
|
||||
{ 1800, 12, 13, 16, 2, -12 }, // 0x6E 'n'
|
||||
{ 1820, 13, 13, 15, 1, -12 }, // 0x6F 'o'
|
||||
{ 1842, 13, 18, 16, 2, -12 }, // 0x70 'p'
|
||||
{ 1872, 13, 18, 16, 1, -12 }, // 0x71 'q'
|
||||
{ 1902, 7, 13, 10, 2, -12 }, // 0x72 'r'
|
||||
{ 1914, 10, 13, 12, 1, -12 }, // 0x73 's'
|
||||
{ 1931, 9, 15, 10, 0, -14 }, // 0x74 't'
|
||||
{ 1948, 12, 13, 16, 2, -12 }, // 0x75 'u'
|
||||
{ 1968, 13, 13, 13, 0, -12 }, // 0x76 'v'
|
||||
{ 1990, 21, 13, 21, 0, -12 }, // 0x77 'w'
|
||||
{ 2025, 12, 13, 13, 0, -12 }, // 0x78 'x'
|
||||
{ 2045, 14, 18, 13, -1, -12 }, // 0x79 'y'
|
||||
{ 2077, 10, 13, 12, 1, -12 }, // 0x7A 'z'
|
||||
{ 2094, 7, 23, 8, 1, -17 }, // 0x7B '{'
|
||||
{ 2115, 1, 23, 7, 3, -17 }, // 0x7C '|'
|
||||
{ 2118, 7, 23, 8, 0, -17 }, // 0x7D '}'
|
||||
{ 2139, 11, 3, 14, 1, -9 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Regular12pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Regular12pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Regular12pt7bGlyphs,
|
||||
0x20, 0x7E, 29 };
|
||||
|
||||
// Approx. 2816 bytes
|
||||
|
||||
#endif // MONTSERRAT12PT7B_H
|
||||
@@ -0,0 +1,481 @@
|
||||
#ifndef MONTSERRAT18PT7B_H
|
||||
#define MONTSERRAT18PT7B_H
|
||||
const uint8_t Montserrat_Regular18pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x6C, 0x00, 0x3F, 0xE0, 0xE3,
|
||||
0xF1, 0xF8, 0xFC, 0x76, 0x1B, 0x0D, 0x86, 0x82, 0x41, 0x20, 0x80, 0x01,
|
||||
0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80,
|
||||
0xC0, 0x06, 0x03, 0x00, 0x30, 0x08, 0x1F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFC,
|
||||
0x0C, 0x06, 0x00, 0x30, 0x18, 0x00, 0xC0, 0x60, 0x03, 0x01, 0x80, 0x0C,
|
||||
0x06, 0x00, 0x60, 0x10, 0x01, 0x80, 0xC0, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF,
|
||||
0xE0, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x0C, 0x00,
|
||||
0xC0, 0x20, 0x03, 0x01, 0x80, 0x0C, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30,
|
||||
0x00, 0x0C, 0x00, 0x03, 0x00, 0x01, 0xF0, 0x03, 0xFF, 0x83, 0xFF, 0xF9,
|
||||
0xE3, 0x0C, 0x70, 0xC0, 0x38, 0x30, 0x0E, 0x0C, 0x03, 0x83, 0x00, 0xE0,
|
||||
0xC0, 0x1C, 0x30, 0x07, 0x8C, 0x00, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F,
|
||||
0x80, 0x0D, 0xF0, 0x03, 0x1E, 0x00, 0xC1, 0xC0, 0x30, 0x70, 0x0C, 0x1C,
|
||||
0x03, 0x07, 0x80, 0xC1, 0xF8, 0x30, 0xEF, 0x8C, 0xF0, 0xFF, 0xF8, 0x0F,
|
||||
0xF8, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x06,
|
||||
0x00, 0x06, 0x03, 0xF0, 0x01, 0x80, 0xC3, 0x00, 0x70, 0x30, 0x30, 0x0C,
|
||||
0x06, 0x06, 0x03, 0x00, 0x80, 0x40, 0xE0, 0x30, 0x0C, 0x18, 0x06, 0x01,
|
||||
0x86, 0x00, 0x40, 0x21, 0x80, 0x0C, 0x0C, 0x30, 0x01, 0x81, 0x8C, 0x00,
|
||||
0x18, 0x63, 0x00, 0x01, 0xF8, 0x63, 0xF0, 0x0C, 0x18, 0xFF, 0x00, 0x06,
|
||||
0x38, 0x70, 0x00, 0xC6, 0x06, 0x00, 0x30, 0x80, 0x40, 0x0C, 0x10, 0x08,
|
||||
0x01, 0x86, 0x01, 0x80, 0x60, 0x40, 0x30, 0x18, 0x08, 0x04, 0x07, 0x01,
|
||||
0x81, 0x80, 0xC0, 0x30, 0x30, 0x30, 0x03, 0xFC, 0x0E, 0x00, 0x3F, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x3F, 0xC0, 0x03, 0x87, 0x00, 0x38, 0x18, 0x01, 0x80,
|
||||
0xE0, 0x0C, 0x03, 0x00, 0x60, 0x38, 0x03, 0x81, 0x80, 0x0C, 0x18, 0x00,
|
||||
0x73, 0x80, 0x01, 0xF8, 0x00, 0x07, 0x80, 0x00, 0xFC, 0x00, 0x0E, 0x70,
|
||||
0x00, 0xE1, 0xC1, 0xCE, 0x07, 0x0C, 0xE0, 0x1C, 0x66, 0x00, 0x77, 0x30,
|
||||
0x01, 0xF1, 0x80, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x03, 0xF1, 0xE0, 0x39,
|
||||
0xC7, 0xFF, 0x87, 0x0F, 0xF0, 0x10, 0xFF, 0xF6, 0xDA, 0x48, 0x1C, 0x63,
|
||||
0x8C, 0x31, 0xC6, 0x18, 0xE3, 0x8E, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
|
||||
0x30, 0xC3, 0x0E, 0x38, 0xE1, 0x86, 0x1C, 0x30, 0xC3, 0x86, 0x0C, 0x60,
|
||||
0xE0, 0xC1, 0xC3, 0x83, 0x07, 0x0E, 0x0C, 0x18, 0x30, 0x70, 0xE1, 0xC3,
|
||||
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x06, 0x0C, 0x38, 0x70, 0xC3,
|
||||
0x86, 0x0C, 0x38, 0x60, 0x06, 0x00, 0x60, 0x06, 0x0C, 0x67, 0x77, 0xE1,
|
||||
0xF8, 0x0F, 0x03, 0xF8, 0xF6, 0xEC, 0x62, 0x06, 0x00, 0x60, 0x06, 0x00,
|
||||
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||
0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x4E, 0xFE, 0x66, 0x4C, 0xC0, 0xFF,
|
||||
0xFF, 0xFF, 0xE0, 0x4E, 0xFE, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x0E,
|
||||
0x00, 0x30, 0x00, 0xC0, 0x07, 0x00, 0x18, 0x00, 0x60, 0x03, 0x00, 0x0C,
|
||||
0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, 0x1C,
|
||||
0x00, 0x60, 0x01, 0x80, 0x0E, 0x00, 0x30, 0x00, 0xC0, 0x07, 0x00, 0x18,
|
||||
0x00, 0x60, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x38,
|
||||
0x00, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0xFF, 0x80, 0x3F, 0xFC, 0x0E, 0x03,
|
||||
0xC3, 0x80, 0x38, 0xE0, 0x03, 0x9C, 0x00, 0x33, 0x00, 0x07, 0xE0, 0x00,
|
||||
0xFC, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00,
|
||||
0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1D, 0x80, 0x03,
|
||||
0x38, 0x00, 0xE3, 0x80, 0x1C, 0x78, 0x07, 0x07, 0x83, 0xC0, 0x7F, 0xF0,
|
||||
0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07,
|
||||
0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0,
|
||||
0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x80, 0x03, 0xE0, 0x07, 0xFE,
|
||||
0x07, 0xFF, 0xE3, 0xC0, 0x3C, 0xC0, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x30,
|
||||
0x00, 0x0C, 0x00, 0x03, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00,
|
||||
0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0,
|
||||
0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xFF, 0xF8,
|
||||
0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00,
|
||||
0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0xE0, 0x01, 0xFE, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C,
|
||||
0x00, 0x07, 0x40, 0x01, 0xD8, 0x00, 0xE7, 0xC0, 0xF0, 0xFF, 0xF8, 0x0F,
|
||||
0xF8, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x07,
|
||||
0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00,
|
||||
0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0xE0, 0x0E,
|
||||
0x03, 0x80, 0x70, 0x0E, 0x03, 0x80, 0x38, 0x1C, 0x00, 0xE0, 0x7F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xE0, 0x00, 0x03, 0x80,
|
||||
0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x1F,
|
||||
0xFF, 0x0F, 0xFF, 0x87, 0xFF, 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00,
|
||||
0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x07, 0xFF,
|
||||
0x03, 0xFF, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0x80,
|
||||
0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x3F, 0x00, 0x3B, 0xE0, 0x7C,
|
||||
0x7F, 0xFC, 0x0F, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0xFF, 0xE0, 0xFF, 0xF0,
|
||||
0x78, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, 0xE0,
|
||||
0x00, 0x38, 0x00, 0x0C, 0x0F, 0x03, 0x1F, 0xF8, 0xCF, 0xBF, 0x37, 0x00,
|
||||
0xEF, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x36, 0x00, 0x0D,
|
||||
0xC0, 0x07, 0x70, 0x01, 0xCE, 0x00, 0xE1, 0xE0, 0x78, 0x3F, 0xF8, 0x03,
|
||||
0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xE0,
|
||||
0x03, 0xB8, 0x00, 0xEE, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03,
|
||||
0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80,
|
||||
0x01, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x01,
|
||||
0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x00, 0x01,
|
||||
0xF0, 0x01, 0xFF, 0xC0, 0xFC, 0xFC, 0x3C, 0x03, 0xC7, 0x00, 0x38, 0xC0,
|
||||
0x03, 0x98, 0x00, 0x73, 0x00, 0x0E, 0x60, 0x01, 0xCE, 0x00, 0x70, 0xE0,
|
||||
0x1C, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x7C, 0x3E, 0x1C, 0x00, 0xE7, 0x00,
|
||||
0x0E, 0xE0, 0x00, 0xD8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00,
|
||||
0x1C, 0xE0, 0x03, 0x9F, 0x01, 0xE1, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0x03,
|
||||
0xC0, 0x01, 0xFF, 0x80, 0xFD, 0xF8, 0x3C, 0x03, 0x87, 0x00, 0x39, 0xC0,
|
||||
0x07, 0x38, 0x00, 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x39, 0x80,
|
||||
0x0F, 0x38, 0x03, 0xE3, 0xC0, 0xEC, 0x3F, 0xF9, 0x81, 0xFC, 0x30, 0x00,
|
||||
0x06, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x30, 0x00, 0x1E, 0x0C, 0x0F, 0x81, 0xFF, 0xE0, 0x1F, 0xF0, 0x00, 0x4E,
|
||||
0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xE0, 0x4E, 0xFE, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xE6, 0x64, 0xCC, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x1F, 0x00, 0xFC, 0x03, 0xE0, 0x1F, 0x80, 0x7C, 0x00, 0xE0,
|
||||
0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00,
|
||||
0x3E, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7C, 0x03, 0xF0, 0x0F, 0x80, 0x7E,
|
||||
0x00, 0xF0, 0x00, 0xC0, 0x00, 0x01, 0xF0, 0x07, 0xFE, 0x0F, 0xFF, 0xCF,
|
||||
0x00, 0xE6, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03,
|
||||
0x80, 0x01, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01,
|
||||
0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x00,
|
||||
0x03, 0xE0, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xF0, 0x0F, 0x80, 0x03,
|
||||
0x80, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x70, 0x0C, 0x00, 0x00, 0x38, 0x18,
|
||||
0x00, 0x00, 0x1C, 0x30, 0x07, 0xC1, 0x8C, 0x30, 0x1F, 0xF1, 0x86, 0x60,
|
||||
0x3C, 0x3D, 0x86, 0x60, 0x70, 0x0D, 0x83, 0xC0, 0xE0, 0x07, 0x83, 0xC0,
|
||||
0xC0, 0x03, 0x83, 0xC1, 0xC0, 0x03, 0x83, 0xC1, 0x80, 0x03, 0x83, 0xC1,
|
||||
0x80, 0x03, 0x81, 0xC1, 0x80, 0x01, 0x81, 0xC1, 0x80, 0x03, 0x83, 0xC1,
|
||||
0xC0, 0x03, 0x83, 0xC1, 0xC0, 0x03, 0x83, 0xC0, 0xE0, 0x07, 0x83, 0x60,
|
||||
0xE0, 0x0F, 0x86, 0x60, 0x78, 0x1D, 0x86, 0x70, 0x3F, 0xF9, 0xFC, 0x30,
|
||||
0x0F, 0xE0, 0xF8, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E,
|
||||
0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x00, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0E,
|
||||
0x00, 0x00, 0x0F, 0x80, 0x00, 0x06, 0xC0, 0x00, 0x07, 0x70, 0x00, 0x03,
|
||||
0x98, 0x00, 0x01, 0x8E, 0x00, 0x01, 0xC7, 0x00, 0x00, 0xC1, 0x80, 0x00,
|
||||
0xE0, 0xE0, 0x00, 0x60, 0x30, 0x00, 0x70, 0x1C, 0x00, 0x30, 0x06, 0x00,
|
||||
0x38, 0x03, 0x80, 0x18, 0x00, 0xC0, 0x1C, 0x00, 0x70, 0x0F, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0xFE, 0x07, 0x00, 0x07, 0x03, 0x00, 0x01, 0xC3, 0x80, 0x00,
|
||||
0xE1, 0x80, 0x00, 0x31, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x06, 0xE0, 0x00,
|
||||
0x03, 0x80, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C,
|
||||
0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0x6E, 0x00, 0x06, 0xE0, 0x00,
|
||||
0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE, 0x01, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF,
|
||||
0xFC, 0xE0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
|
||||
0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x03, 0xEF,
|
||||
0xFF, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x03, 0xC0, 0x1E, 0x1E, 0x00, 0x18, 0xE0, 0x00, 0x07, 0x00, 0x00,
|
||||
0x1C, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30,
|
||||
0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00,
|
||||
0x3C, 0x00, 0x18, 0x78, 0x00, 0xF0, 0xFC, 0x0F, 0x80, 0xFF, 0xF8, 0x00,
|
||||
0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x07, 0x00,
|
||||
0x1F, 0x0E, 0x00, 0x0F, 0x1C, 0x00, 0x07, 0x38, 0x00, 0x0F, 0x70, 0x00,
|
||||
0x0E, 0xE0, 0x00, 0x0D, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00,
|
||||
0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x3B, 0x80, 0x00, 0x77, 0x00, 0x01, 0xCE,
|
||||
0x00, 0x07, 0x1C, 0x00, 0x3E, 0x38, 0x03, 0xF0, 0x7F, 0xFF, 0xC0, 0xFF,
|
||||
0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00,
|
||||
0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38,
|
||||
0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00,
|
||||
0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00,
|
||||
0x03, 0x80, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0,
|
||||
0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0F, 0xFF, 0xE7,
|
||||
0xFF, 0xF3, 0xFF, 0xF9, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00,
|
||||
0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0,
|
||||
0x00, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0x80, 0x7F, 0xFF, 0x03, 0xC0,
|
||||
0x1F, 0x1E, 0x00, 0x18, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0,
|
||||
0x00, 0x03, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x1D, 0x80, 0x00, 0x77, 0x00, 0x01, 0xCE, 0x00, 0x07, 0x3C, 0x00, 0x1C,
|
||||
0x78, 0x00, 0xF0, 0xFC, 0x0F, 0x80, 0xFF, 0xFC, 0x00, 0xFF, 0x80, 0xE0,
|
||||
0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03,
|
||||
0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
||||
0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00,
|
||||
0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
|
||||
0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||
0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01,
|
||||
0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00,
|
||||
0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x40,
|
||||
0x1B, 0x80, 0xEF, 0x07, 0x9F, 0xFC, 0x1F, 0xC0, 0xE0, 0x00, 0x77, 0x00,
|
||||
0x07, 0x38, 0x00, 0x71, 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x70, 0x07, 0x03,
|
||||
0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0, 0x70, 0x07, 0x07, 0x00, 0x38, 0x70,
|
||||
0x01, 0xC7, 0x00, 0x0E, 0x7C, 0x00, 0x77, 0xF0, 0x03, 0xFB, 0xC0, 0x1F,
|
||||
0x8F, 0x00, 0xF8, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0x03, 0x81, 0xC0, 0x0E,
|
||||
0x0E, 0x00, 0x38, 0x70, 0x00, 0xE3, 0x80, 0x07, 0x9C, 0x00, 0x1C, 0xE0,
|
||||
0x00, 0x70, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x70,
|
||||
0x00, 0x37, 0x98, 0x00, 0x3B, 0xCE, 0x00, 0x19, 0xE3, 0x00, 0x1C, 0xF1,
|
||||
0xC0, 0x1C, 0x78, 0x70, 0x0C, 0x3C, 0x18, 0x0E, 0x1E, 0x0E, 0x06, 0x0F,
|
||||
0x03, 0x07, 0x07, 0x81, 0xC3, 0x03, 0xC0, 0x73, 0x01, 0xE0, 0x1B, 0x80,
|
||||
0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xC0, 0x1E, 0x00, 0x60,
|
||||
0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0xC0,
|
||||
0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F,
|
||||
0xC0, 0x03, 0xEE, 0x00, 0x3E, 0xF0, 0x03, 0xE7, 0x00, 0x3E, 0x38, 0x03,
|
||||
0xE1, 0xC0, 0x3E, 0x0E, 0x03, 0xE0, 0xF0, 0x3E, 0x07, 0x03, 0xE0, 0x38,
|
||||
0x3E, 0x01, 0xC3, 0xE0, 0x0E, 0x3E, 0x00, 0xF3, 0xE0, 0x07, 0x3E, 0x00,
|
||||
0x3B, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0,
|
||||
0x00, 0x30, 0x00, 0x3E, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x3C, 0x01, 0xF0, 0x1C, 0x00, 0x1E, 0x0E, 0x00, 0x03, 0x87, 0x00, 0x00,
|
||||
0x71, 0xC0, 0x00, 0x0C, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x00, 0xEE, 0x00,
|
||||
0x00, 0x1B, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x00, 0x1B, 0x80, 0x00, 0x06, 0xE0, 0x00, 0x03, 0x98, 0x00, 0x00,
|
||||
0xE7, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x3C, 0x3C, 0x00, 0x1E, 0x07, 0x80,
|
||||
0x0F, 0x00, 0xFC, 0x0F, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0x80, 0x00,
|
||||
0xFF, 0xC0, 0x1F, 0xFF, 0xC3, 0xFF, 0xFC, 0x70, 0x03, 0xCE, 0x00, 0x1D,
|
||||
0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F,
|
||||
0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0D, 0xC0, 0x03, 0xB8, 0x01, 0xE7,
|
||||
0xFF, 0xF8, 0xFF, 0xFC, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x00,
|
||||
0x00, 0x3E, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0x80,
|
||||
0x3E, 0x01, 0xC0, 0x01, 0xE0, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x01, 0xC3,
|
||||
0x80, 0x00, 0x18, 0xE0, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x73, 0x80, 0x00,
|
||||
0x06, 0x60, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x1D, 0x80, 0x00, 0x03, 0xB8,
|
||||
0x00, 0x00, 0x67, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x03, 0x8E, 0x00, 0x00,
|
||||
0x71, 0xC0, 0x00, 0x1C, 0x1C, 0x00, 0x07, 0x83, 0xC0, 0x01, 0xE0, 0x3C,
|
||||
0x00, 0x78, 0x03, 0xF0, 0x3E, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0x80,
|
||||
0x00, 0x00, 0xE0, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0xF0, 0xE0, 0x00,
|
||||
0x0F, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0xFF,
|
||||
0xFF, 0x0E, 0x00, 0x78, 0xE0, 0x01, 0xCE, 0x00, 0x0E, 0xE0, 0x00, 0xEE,
|
||||
0x00, 0x0E, 0xE0, 0x00, 0x6E, 0x00, 0x06, 0xE0, 0x00, 0xEE, 0x00, 0x0E,
|
||||
0xE0, 0x00, 0xCE, 0x00, 0x1C, 0xE0, 0x07, 0x8F, 0xFF, 0xF0, 0xFF, 0xFC,
|
||||
0x0E, 0x01, 0xC0, 0xE0, 0x0E, 0x0E, 0x00, 0x70, 0xE0, 0x03, 0x0E, 0x00,
|
||||
0x38, 0xE0, 0x01, 0xCE, 0x00, 0x0E, 0xE0, 0x00, 0xE0, 0x01, 0xF0, 0x03,
|
||||
0xFF, 0x83, 0xFF, 0xF9, 0xE0, 0x0C, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00,
|
||||
0x03, 0x80, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x07, 0x80, 0x00, 0xFE, 0x00,
|
||||
0x0F, 0xF8, 0x00, 0x7F, 0x80, 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xC0,
|
||||
0x00, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x80, 0x01, 0xF8, 0x00, 0xEF, 0x80,
|
||||
0xF0, 0xFF, 0xF8, 0x0F, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00,
|
||||
0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
|
||||
0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60,
|
||||
0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06,
|
||||
0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x7C,
|
||||
0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07,
|
||||
0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00,
|
||||
0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00,
|
||||
0x07, 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x66, 0x00, 0x0E, 0x70,
|
||||
0x00, 0xE3, 0x80, 0x1C, 0x3E, 0x07, 0x80, 0xFF, 0xF0, 0x03, 0xFC, 0x00,
|
||||
0xE0, 0x00, 0x03, 0x60, 0x00, 0x07, 0x70, 0x00, 0x06, 0x70, 0x00, 0x0E,
|
||||
0x38, 0x00, 0x0E, 0x38, 0x00, 0x0C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x18,
|
||||
0x0C, 0x00, 0x38, 0x0E, 0x00, 0x30, 0x06, 0x00, 0x70, 0x07, 0x00, 0x70,
|
||||
0x07, 0x00, 0xE0, 0x03, 0x80, 0xE0, 0x03, 0x80, 0xC0, 0x01, 0xC1, 0xC0,
|
||||
0x01, 0xC1, 0x80, 0x00, 0xC3, 0x80, 0x00, 0xE3, 0x00, 0x00, 0x67, 0x00,
|
||||
0x00, 0x77, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00,
|
||||
0x00, 0x1C, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x3B, 0x00, 0x03, 0x80, 0x01,
|
||||
0x9C, 0x00, 0x1C, 0x00, 0x1C, 0xE0, 0x01, 0xF0, 0x00, 0xE3, 0x00, 0x0D,
|
||||
0x80, 0x06, 0x1C, 0x00, 0x6C, 0x00, 0x70, 0xE0, 0x07, 0x70, 0x03, 0x83,
|
||||
0x00, 0x31, 0x80, 0x18, 0x1C, 0x01, 0x8C, 0x01, 0xC0, 0xE0, 0x1C, 0x70,
|
||||
0x0E, 0x03, 0x00, 0xC1, 0x80, 0x60, 0x1C, 0x06, 0x0C, 0x07, 0x00, 0xE0,
|
||||
0x70, 0x70, 0x38, 0x03, 0x03, 0x01, 0x81, 0x80, 0x1C, 0x38, 0x0C, 0x1C,
|
||||
0x00, 0xE1, 0xC0, 0x70, 0xE0, 0x03, 0x0C, 0x01, 0x86, 0x00, 0x1C, 0xE0,
|
||||
0x0E, 0x70, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x03, 0x30, 0x01, 0x98, 0x00,
|
||||
0x1F, 0x80, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x01,
|
||||
0xE0, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, 0x78, 0x00, 0xE0,
|
||||
0x00, 0x3B, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x70, 0x01, 0xC1, 0xC0, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x1C, 0x1C, 0x00, 0xE0, 0xE0, 0x03, 0x8E, 0x00, 0x0E,
|
||||
0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x00,
|
||||
0x07, 0x70, 0x00, 0x3B, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x38, 0x03, 0x80,
|
||||
0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x1C, 0x1C, 0x00, 0x71, 0xC0, 0x01, 0xCE,
|
||||
0x00, 0x0E, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x0D, 0x80, 0x00, 0x77, 0x00,
|
||||
0x03, 0x8E, 0x00, 0x0C, 0x38, 0x00, 0x70, 0x70, 0x01, 0x80, 0xC0, 0x0E,
|
||||
0x03, 0x80, 0x70, 0x07, 0x01, 0x80, 0x0C, 0x0E, 0x00, 0x38, 0x70, 0x00,
|
||||
0x71, 0x80, 0x01, 0xCE, 0x00, 0x03, 0xB0, 0x00, 0x07, 0xC0, 0x00, 0x1E,
|
||||
0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00,
|
||||
0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00,
|
||||
0x30, 0x00, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x1C,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0F,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
|
||||
0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
|
||||
0x0C, 0x30, 0xC3, 0x0C, 0x3F, 0xFC, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x18,
|
||||
0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x18, 0x00, 0x70, 0x00,
|
||||
0xC0, 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x00,
|
||||
0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x30,
|
||||
0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xE0, 0x01,
|
||||
0x80, 0x06, 0x00, 0x1C, 0xFF, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30,
|
||||
0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30,
|
||||
0xC3, 0x0C, 0x30, 0xFF, 0xFC, 0x03, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xE0,
|
||||
0x0C, 0xC0, 0x33, 0x01, 0xC6, 0x06, 0x18, 0x18, 0x30, 0xC0, 0xC3, 0x03,
|
||||
0x18, 0x06, 0x60, 0x19, 0x80, 0x3C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xE0, 0x70, 0x38, 0x0C, 0x07, 0x01, 0x00, 0x3F, 0xE1, 0xFF, 0xF3,
|
||||
0x80, 0xE4, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x3F,
|
||||
0xFD, 0xF8, 0x1F, 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xF0, 0x07,
|
||||
0x70, 0x3E, 0xFF, 0xEC, 0x7F, 0x18, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80,
|
||||
0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00,
|
||||
0x00, 0xE3, 0xFC, 0x1D, 0xFF, 0xE3, 0xF0, 0x1E, 0x7C, 0x00, 0xEF, 0x00,
|
||||
0x1D, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00,
|
||||
0x0F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x0D, 0xE0, 0x03, 0xBE, 0x00,
|
||||
0xE7, 0x70, 0x7C, 0xE7, 0xFE, 0x1C, 0x7F, 0x80, 0x00, 0x40, 0x0F, 0xFC,
|
||||
0x1F, 0xFE, 0x3C, 0x0F, 0x70, 0x03, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x00,
|
||||
0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0x70, 0x02, 0x78, 0x07, 0x3C, 0x0F, 0x1F, 0xFE, 0x07, 0xF8, 0x00, 0x00,
|
||||
0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30,
|
||||
0x00, 0x0C, 0x02, 0x03, 0x0F, 0xF8, 0xC7, 0xFF, 0x33, 0xC0, 0xED, 0xC0,
|
||||
0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
|
||||
0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xDC, 0x00, 0xF7,
|
||||
0x80, 0x7C, 0xF0, 0x3B, 0x1F, 0xFC, 0xC1, 0xFC, 0x30, 0x00, 0xC0, 0x03,
|
||||
0xFE, 0x01, 0xFF, 0xC0, 0xE0, 0x38, 0x70, 0x07, 0x38, 0x00, 0xEE, 0x00,
|
||||
0x1B, 0x00, 0x06, 0xC0, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x0C, 0x3E, 0x0F, 0x07,
|
||||
0xFF, 0x80, 0x7F, 0x80, 0x07, 0xE0, 0xFF, 0x1E, 0x01, 0xC0, 0x18, 0x01,
|
||||
0x80, 0x18, 0x01, 0x80, 0xFF, 0xEF, 0xFE, 0x18, 0x01, 0x80, 0x18, 0x01,
|
||||
0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01,
|
||||
0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x00, 0x80, 0x01, 0xFF, 0x1C,
|
||||
0x7F, 0xFB, 0x9C, 0x03, 0xF7, 0x00, 0x3F, 0xC0, 0x03, 0xF8, 0x00, 0x3E,
|
||||
0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E,
|
||||
0x00, 0x1E, 0xC0, 0x03, 0xDC, 0x00, 0xF9, 0xE0, 0x77, 0x1F, 0xFC, 0xE0,
|
||||
0xFF, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x9C,
|
||||
0x00, 0xE3, 0xF0, 0xF8, 0x1F, 0xFE, 0x00, 0xFF, 0x00, 0xE0, 0x00, 0x70,
|
||||
0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01,
|
||||
0xC0, 0x80, 0xE7, 0xFC, 0x77, 0xFF, 0x3F, 0x01, 0xDF, 0x00, 0x7F, 0x00,
|
||||
0x3F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
|
||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03,
|
||||
0xE0, 0x01, 0xF0, 0x00, 0xC0, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x03, 0x81, 0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0,
|
||||
0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18,
|
||||
0x1F, 0x1D, 0xFE, 0x7C, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03,
|
||||
0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0,
|
||||
0x07, 0x38, 0x03, 0x8E, 0x01, 0xC3, 0x80, 0xE0, 0xE0, 0x70, 0x38, 0x78,
|
||||
0x0E, 0x3C, 0x03, 0x9E, 0x00, 0xEF, 0xC0, 0x3F, 0x38, 0x0F, 0x87, 0x03,
|
||||
0xC1, 0xE0, 0xE0, 0x38, 0x38, 0x07, 0x0E, 0x00, 0xE3, 0x80, 0x1C, 0xE0,
|
||||
0x07, 0xB8, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFC, 0x00, 0x60, 0x01, 0x01, 0xCF, 0xF8, 0x3F, 0xE3, 0xBF, 0xF8,
|
||||
0xFF, 0xE7, 0xE0, 0x7B, 0x81, 0xEF, 0x80, 0x7E, 0x01, 0xDE, 0x00, 0x78,
|
||||
0x01, 0xF8, 0x00, 0xE0, 0x03, 0xF0, 0x01, 0xC0, 0x07, 0xE0, 0x03, 0x80,
|
||||
0x0F, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x0E, 0x00, 0x3F, 0x00, 0x1C, 0x00,
|
||||
0x7E, 0x00, 0x38, 0x00, 0xFC, 0x00, 0x70, 0x01, 0xF8, 0x00, 0xE0, 0x03,
|
||||
0xF0, 0x01, 0xC0, 0x07, 0xE0, 0x03, 0x80, 0x0F, 0xC0, 0x07, 0x00, 0x1F,
|
||||
0x80, 0x0E, 0x00, 0x38, 0x00, 0x40, 0x73, 0xFE, 0x3B, 0xFF, 0x9F, 0x80,
|
||||
0xEF, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0,
|
||||
0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
|
||||
0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x60, 0x00, 0x00, 0x03,
|
||||
0xFF, 0x01, 0xFF, 0xE0, 0xF0, 0x3C, 0x70, 0x03, 0x98, 0x00, 0x6E, 0x00,
|
||||
0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03,
|
||||
0xE0, 0x01, 0xF8, 0x00, 0x77, 0x00, 0x39, 0xE0, 0x1E, 0x3C, 0x0F, 0x07,
|
||||
0xFF, 0x80, 0x7F, 0x80, 0x00, 0x00, 0x1C, 0x7F, 0x83, 0xBF, 0xFC, 0x7E,
|
||||
0x03, 0xCF, 0x80, 0x1D, 0xE0, 0x03, 0xBC, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
||||
0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0,
|
||||
0x01, 0xBC, 0x00, 0x77, 0xC0, 0x1C, 0xEE, 0x0F, 0x9C, 0xFF, 0xC3, 0x8F,
|
||||
0xF0, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x80, 0x03, 0xFE, 0x31, 0xFF,
|
||||
0xCC, 0xF0, 0x3B, 0x70, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0x07,
|
||||
0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x01, 0xF8,
|
||||
0x00, 0x77, 0x00, 0x3D, 0xE0, 0x1F, 0x3C, 0x0E, 0xC7, 0xFF, 0x30, 0x7F,
|
||||
0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
|
||||
0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x79, 0xFE, 0xFF, 0xF0, 0xF8, 0x3C,
|
||||
0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03,
|
||||
0x80, 0xE0, 0x38, 0x0E, 0x00, 0x01, 0x00, 0x3F, 0xF0, 0xFF, 0xF3, 0x80,
|
||||
0x66, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x7E, 0x00, 0x3F, 0xC0,
|
||||
0x1F, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0xA0, 0x07, 0xF0,
|
||||
0x1C, 0xFF, 0xF0, 0x7F, 0xC0, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0xFF,
|
||||
0xEF, 0xFE, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18,
|
||||
0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x1C, 0x01, 0xE0, 0x0F,
|
||||
0xF0, 0x7E, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
|
||||
0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
|
||||
0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x3D, 0xC0, 0x1E, 0x78, 0x3B,
|
||||
0x1F, 0xF9, 0x87, 0xF8, 0xC0, 0xE0, 0x00, 0xEC, 0x00, 0x19, 0xC0, 0x07,
|
||||
0x18, 0x00, 0xC3, 0x80, 0x38, 0x30, 0x06, 0x07, 0x01, 0xC0, 0x60, 0x30,
|
||||
0x0E, 0x06, 0x01, 0xC1, 0xC0, 0x18, 0x30, 0x03, 0x8E, 0x00, 0x31, 0x80,
|
||||
0x07, 0x70, 0x00, 0x6C, 0x00, 0x0F, 0x80, 0x00, 0xE0, 0x00, 0x1C, 0x00,
|
||||
0x60, 0x03, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x77, 0x00, 0x7C, 0x01, 0x8C,
|
||||
0x01, 0xB0, 0x06, 0x30, 0x0E, 0xC0, 0x38, 0xE0, 0x33, 0x80, 0xC1, 0x80,
|
||||
0xC6, 0x03, 0x07, 0x07, 0x18, 0x1C, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x60,
|
||||
0xC3, 0x80, 0xE3, 0x03, 0x8C, 0x01, 0x8C, 0x06, 0x30, 0x06, 0x70, 0x19,
|
||||
0xC0, 0x1D, 0x80, 0x76, 0x00, 0x36, 0x00, 0xD8, 0x00, 0xF8, 0x03, 0xC0,
|
||||
0x01, 0xC0, 0x07, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x60, 0x07, 0x38, 0x07,
|
||||
0x0E, 0x03, 0x03, 0x83, 0x80, 0xE3, 0x80, 0x33, 0x80, 0x1D, 0x80, 0x07,
|
||||
0xC0, 0x01, 0xC0, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xCE, 0x00, 0xE3, 0x80,
|
||||
0xE0, 0xE0, 0xE0, 0x30, 0x60, 0x1C, 0x70, 0x07, 0x70, 0x01, 0xC0, 0x70,
|
||||
0x00, 0x73, 0x00, 0x06, 0x38, 0x00, 0xE1, 0x80, 0x0C, 0x1C, 0x01, 0xC0,
|
||||
0xC0, 0x18, 0x0E, 0x03, 0x80, 0x60, 0x30, 0x07, 0x03, 0x00, 0x70, 0x70,
|
||||
0x03, 0x06, 0x00, 0x38, 0xE0, 0x01, 0x8C, 0x00, 0x1D, 0xC0, 0x00, 0xD8,
|
||||
0x00, 0x0F, 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x06,
|
||||
0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x63, 0x80, 0x0F, 0xF8, 0x00, 0x3E,
|
||||
0x00, 0x00, 0x7F, 0xFE, 0xFF, 0xFC, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80,
|
||||
0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70,
|
||||
0x01, 0xC0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0x07, 0x87, 0xC7, 0x03, 0x81, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06,
|
||||
0x03, 0x01, 0x80, 0xC0, 0x61, 0xF0, 0xF0, 0x3C, 0x06, 0x03, 0x01, 0x80,
|
||||
0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x78, 0x1F,
|
||||
0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0,
|
||||
0x7C, 0x0E, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
|
||||
0x81, 0xC0, 0xE0, 0x70, 0x1F, 0x07, 0x87, 0x07, 0x03, 0x81, 0xC0, 0xE0,
|
||||
0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0xE1, 0xF0, 0xE0,
|
||||
0x00, 0x3E, 0x03, 0x7F, 0x03, 0x63, 0x83, 0xC1, 0xEE, 0xC0, 0x7C };
|
||||
|
||||
const GFXglyph Montserrat_Regular18pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 3, 25, 9, 3, -24 }, // 0x21 '!'
|
||||
{ 11, 9, 10, 13, 2, -24 }, // 0x22 '"'
|
||||
{ 23, 22, 25, 24, 1, -24 }, // 0x23 '#'
|
||||
{ 92, 18, 33, 22, 2, -28 }, // 0x24 '$'
|
||||
{ 167, 27, 25, 29, 1, -24 }, // 0x25 '%'
|
||||
{ 252, 21, 25, 23, 2, -24 }, // 0x26 '&'
|
||||
{ 318, 3, 10, 7, 2, -24 }, // 0x27 '''
|
||||
{ 322, 6, 33, 12, 4, -25 }, // 0x28 '('
|
||||
{ 347, 7, 33, 12, 1, -25 }, // 0x29 ')'
|
||||
{ 376, 12, 13, 14, 1, -25 }, // 0x2A '*'
|
||||
{ 396, 16, 15, 20, 2, -19 }, // 0x2B '+'
|
||||
{ 426, 4, 9, 7, 2, -3 }, // 0x2C ','
|
||||
{ 431, 9, 3, 13, 2, -10 }, // 0x2D '-'
|
||||
{ 435, 4, 4, 7, 2, -3 }, // 0x2E '.'
|
||||
{ 437, 14, 33, 12, -1, -28 }, // 0x2F '/'
|
||||
{ 495, 19, 25, 23, 2, -24 }, // 0x30 '0'
|
||||
{ 555, 9, 25, 13, 0, -24 }, // 0x31 '1'
|
||||
{ 584, 18, 25, 20, 1, -24 }, // 0x32 '2'
|
||||
{ 641, 18, 25, 20, 0, -24 }, // 0x33 '3'
|
||||
{ 698, 22, 25, 23, 1, -24 }, // 0x34 '4'
|
||||
{ 767, 17, 25, 20, 1, -24 }, // 0x35 '5'
|
||||
{ 821, 18, 25, 21, 2, -24 }, // 0x36 '6'
|
||||
{ 878, 18, 25, 21, 1, -24 }, // 0x37 '7'
|
||||
{ 935, 19, 25, 22, 2, -24 }, // 0x38 '8'
|
||||
{ 995, 19, 25, 21, 1, -24 }, // 0x39 '9'
|
||||
{ 1055, 4, 19, 7, 2, -18 }, // 0x3A ':'
|
||||
{ 1065, 4, 24, 7, 2, -18 }, // 0x3B ';'
|
||||
{ 1077, 16, 15, 20, 2, -19 }, // 0x3C '<'
|
||||
{ 1107, 16, 10, 20, 2, -16 }, // 0x3D '='
|
||||
{ 1127, 16, 15, 20, 2, -19 }, // 0x3E '>'
|
||||
{ 1157, 17, 25, 20, 0, -24 }, // 0x3F '?'
|
||||
{ 1211, 32, 32, 36, 2, -24 }, // 0x40 '@'
|
||||
{ 1339, 25, 25, 25, 0, -24 }, // 0x41 'A'
|
||||
{ 1418, 20, 25, 26, 4, -24 }, // 0x42 'B'
|
||||
{ 1481, 22, 25, 25, 2, -24 }, // 0x43 'C'
|
||||
{ 1550, 23, 25, 29, 4, -24 }, // 0x44 'D'
|
||||
{ 1622, 17, 25, 23, 4, -24 }, // 0x45 'E'
|
||||
{ 1676, 17, 25, 22, 4, -24 }, // 0x46 'F'
|
||||
{ 1730, 22, 25, 27, 2, -24 }, // 0x47 'G'
|
||||
{ 1799, 20, 25, 28, 4, -24 }, // 0x48 'H'
|
||||
{ 1862, 3, 25, 11, 4, -24 }, // 0x49 'I'
|
||||
{ 1872, 14, 25, 18, 0, -24 }, // 0x4A 'J'
|
||||
{ 1916, 21, 25, 25, 4, -24 }, // 0x4B 'K'
|
||||
{ 1982, 16, 25, 21, 4, -24 }, // 0x4C 'L'
|
||||
{ 2032, 25, 25, 33, 4, -24 }, // 0x4D 'M'
|
||||
{ 2111, 20, 25, 28, 4, -24 }, // 0x4E 'N'
|
||||
{ 2174, 26, 25, 29, 2, -24 }, // 0x4F 'O'
|
||||
{ 2256, 19, 25, 25, 4, -24 }, // 0x50 'P'
|
||||
{ 2316, 27, 30, 29, 2, -24 }, // 0x51 'Q'
|
||||
{ 2418, 20, 25, 25, 4, -24 }, // 0x52 'R'
|
||||
{ 2481, 18, 25, 22, 2, -24 }, // 0x53 'S'
|
||||
{ 2538, 20, 25, 20, 0, -24 }, // 0x54 'T'
|
||||
{ 2601, 20, 25, 28, 4, -24 }, // 0x55 'U'
|
||||
{ 2664, 24, 25, 24, 0, -24 }, // 0x56 'V'
|
||||
{ 2739, 37, 25, 39, 1, -24 }, // 0x57 'W'
|
||||
{ 2855, 21, 25, 23, 1, -24 }, // 0x58 'X'
|
||||
{ 2921, 22, 25, 22, 0, -24 }, // 0x59 'Y'
|
||||
{ 2990, 20, 25, 23, 2, -24 }, // 0x5A 'Z'
|
||||
{ 3053, 6, 33, 11, 4, -25 }, // 0x5B '['
|
||||
{ 3078, 14, 33, 12, -1, -28 }, // 0x5C '\'
|
||||
{ 3136, 6, 33, 11, 1, -25 }, // 0x5D ']'
|
||||
{ 3161, 14, 15, 20, 3, -19 }, // 0x5E '^'
|
||||
{ 3188, 18, 2, 18, 0, 1 }, // 0x5F '_'
|
||||
{ 3193, 8, 5, 21, 5, -25 }, // 0x60 '`'
|
||||
{ 3198, 15, 19, 21, 2, -18 }, // 0x61 'a'
|
||||
{ 3234, 19, 26, 24, 3, -25 }, // 0x62 'b'
|
||||
{ 3296, 16, 19, 20, 2, -18 }, // 0x63 'c'
|
||||
{ 3334, 18, 26, 24, 2, -25 }, // 0x64 'd'
|
||||
{ 3393, 18, 19, 21, 2, -18 }, // 0x65 'e'
|
||||
{ 3436, 12, 26, 12, 1, -25 }, // 0x66 'f'
|
||||
{ 3475, 19, 26, 24, 2, -18 }, // 0x67 'g'
|
||||
{ 3537, 17, 26, 24, 3, -25 }, // 0x68 'h'
|
||||
{ 3593, 3, 26, 9, 3, -25 }, // 0x69 'i'
|
||||
{ 3603, 9, 33, 10, -3, -25 }, // 0x6A 'j'
|
||||
{ 3641, 18, 26, 21, 3, -25 }, // 0x6B 'k'
|
||||
{ 3700, 3, 26, 9, 3, -25 }, // 0x6C 'l'
|
||||
{ 3710, 31, 19, 37, 3, -18 }, // 0x6D 'm'
|
||||
{ 3784, 17, 19, 24, 3, -18 }, // 0x6E 'n'
|
||||
{ 3825, 18, 19, 22, 2, -18 }, // 0x6F 'o'
|
||||
{ 3868, 19, 26, 24, 3, -18 }, // 0x70 'p'
|
||||
{ 3930, 18, 26, 24, 2, -18 }, // 0x71 'q'
|
||||
{ 3989, 10, 19, 14, 3, -18 }, // 0x72 'r'
|
||||
{ 4013, 15, 19, 17, 1, -18 }, // 0x73 's'
|
||||
{ 4049, 12, 22, 14, 1, -21 }, // 0x74 't'
|
||||
{ 4082, 17, 18, 24, 3, -17 }, // 0x75 'u'
|
||||
{ 4121, 19, 18, 19, 0, -17 }, // 0x76 'v'
|
||||
{ 4164, 30, 18, 31, 0, -17 }, // 0x77 'w'
|
||||
{ 4232, 17, 18, 19, 1, -17 }, // 0x78 'x'
|
||||
{ 4271, 20, 25, 19, -1, -17 }, // 0x79 'y'
|
||||
{ 4334, 15, 18, 18, 1, -17 }, // 0x7A 'z'
|
||||
{ 4368, 9, 33, 12, 2, -25 }, // 0x7B '{'
|
||||
{ 4406, 2, 33, 10, 4, -25 }, // 0x7C '|'
|
||||
{ 4415, 9, 33, 12, 1, -25 }, // 0x7D '}'
|
||||
{ 4453, 16, 5, 20, 2, -14 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Regular18pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Regular18pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Regular18pt7bGlyphs,
|
||||
0x20, 0x7E, 43 };
|
||||
|
||||
// Approx. 5135 bytes
|
||||
|
||||
#endif // MONTSERRAT18PT7B_H
|
||||
@@ -0,0 +1,568 @@
|
||||
#ifndef MONTSERRAT20PT7B_H
|
||||
#define MONTSERRAT20PT7B_H
|
||||
const uint8_t Montserrat_Regular20pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x00,
|
||||
0x06, 0xFF, 0x70, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
|
||||
0xC1, 0xE0, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0x60, 0x18, 0x00, 0x30, 0x0C,
|
||||
0x00, 0x18, 0x06, 0x00, 0x0C, 0x03, 0x00, 0x0E, 0x01, 0x80, 0x06, 0x01,
|
||||
0xC0, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x80, 0xC0, 0x30, 0x00, 0x60,
|
||||
0x18, 0x00, 0x30, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x1C, 0x03, 0x00, 0x0C,
|
||||
0x03, 0x80, 0x06, 0x01, 0x80, 0x03, 0x00, 0xC0, 0x7F, 0xFF, 0xFF, 0xBF,
|
||||
0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x30, 0x0C, 0x00, 0x38, 0x06, 0x00,
|
||||
0x18, 0x07, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x01, 0x80, 0x03, 0x00, 0xC0,
|
||||
0x01, 0x80, 0x60, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00,
|
||||
0x06, 0x00, 0x00, 0x70, 0x00, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xE6, 0x3E,
|
||||
0x78, 0x60, 0x47, 0x06, 0x00, 0x70, 0x60, 0x0E, 0x06, 0x00, 0xE0, 0x60,
|
||||
0x07, 0x06, 0x00, 0x70, 0x60, 0x07, 0xC6, 0x00, 0x3F, 0x60, 0x00, 0xFF,
|
||||
0x00, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x67, 0xE0, 0x06, 0x1E, 0x00,
|
||||
0x60, 0xF0, 0x06, 0x07, 0x00, 0x60, 0x70, 0x06, 0x07, 0x00, 0x60, 0x7C,
|
||||
0x06, 0x0F, 0xF0, 0x61, 0xE7, 0xE6, 0x7C, 0x3F, 0xFF, 0x80, 0x7F, 0xE0,
|
||||
0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60,
|
||||
0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x18, 0x1E, 0x70, 0x01, 0x80,
|
||||
0xC0, 0xC0, 0x1C, 0x0C, 0x06, 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00,
|
||||
0xC0, 0xE0, 0x18, 0x06, 0x06, 0x00, 0xC0, 0x30, 0x60, 0x06, 0x01, 0x87,
|
||||
0x00, 0x30, 0x0C, 0x30, 0x01, 0x80, 0xC3, 0x00, 0x06, 0x0E, 0x38, 0x00,
|
||||
0x3F, 0xE1, 0x81, 0x80, 0x7E, 0x18, 0x7F, 0x00, 0x01, 0xC7, 0x1C, 0x00,
|
||||
0x0C, 0x70, 0x70, 0x00, 0xC3, 0x01, 0x80, 0x0E, 0x18, 0x0C, 0x00, 0xE1,
|
||||
0x80, 0x30, 0x06, 0x0C, 0x01, 0x80, 0x60, 0x60, 0x0C, 0x07, 0x03, 0x00,
|
||||
0x60, 0x30, 0x0C, 0x06, 0x03, 0x00, 0x60, 0x30, 0x38, 0x01, 0x83, 0x81,
|
||||
0x80, 0x0F, 0xF8, 0x18, 0x00, 0x1F, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x0E, 0x07, 0x00, 0x0C, 0x03, 0x00, 0x1C, 0x03,
|
||||
0x80, 0x1C, 0x03, 0x80, 0x1C, 0x03, 0x00, 0x0C, 0x07, 0x00, 0x0E, 0x0E,
|
||||
0x00, 0x07, 0x1C, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x38, 0x3C, 0x0C, 0x70, 0x1E,
|
||||
0x1C, 0xE0, 0x0F, 0x1C, 0xE0, 0x07, 0x98, 0xE0, 0x03, 0xF8, 0xE0, 0x01,
|
||||
0xF0, 0xE0, 0x00, 0xF0, 0xE0, 0x00, 0xF8, 0x70, 0x01, 0xFC, 0x3C, 0x0F,
|
||||
0x9E, 0x1F, 0xFF, 0x0E, 0x07, 0xFC, 0x06, 0xFF, 0xFF, 0xF0, 0x0E, 0x18,
|
||||
0x70, 0xE3, 0x87, 0x0C, 0x38, 0x70, 0xE1, 0x83, 0x0E, 0x1C, 0x38, 0x70,
|
||||
0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x87, 0x06,
|
||||
0x0E, 0x1C, 0x18, 0x38, 0x70, 0x70, 0x60, 0xC1, 0xC1, 0xC3, 0x83, 0x07,
|
||||
0x0E, 0x0C, 0x1C, 0x38, 0x70, 0x60, 0xC1, 0xC3, 0x87, 0x0E, 0x1C, 0x38,
|
||||
0x70, 0xE1, 0xC3, 0x87, 0x0C, 0x38, 0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x30,
|
||||
0xE1, 0x87, 0x0C, 0x00, 0x02, 0x00, 0x10, 0x00, 0x81, 0x84, 0x3F, 0x27,
|
||||
0x9D, 0x70, 0x3E, 0x01, 0xF0, 0x3F, 0xE7, 0x93, 0xF8, 0x86, 0x04, 0x00,
|
||||
0x20, 0x01, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00,
|
||||
0x18, 0x00, 0x0C, 0x00, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03,
|
||||
0x00, 0x01, 0x80, 0x00, 0x7F, 0xF7, 0x76, 0x66, 0xCC, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x80, 0x7F, 0xF7, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x60,
|
||||
0x01, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x60, 0x01,
|
||||
0xC0, 0x03, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0,
|
||||
0x03, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xC0, 0x03,
|
||||
0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00,
|
||||
0x0E, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00, 0x0E,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xF8, 0x03, 0xC1,
|
||||
0xF0, 0x1E, 0x01, 0xE0, 0xE0, 0x03, 0xC3, 0x80, 0x07, 0x1C, 0x00, 0x0E,
|
||||
0x70, 0x00, 0x39, 0x80, 0x00, 0xEE, 0x00, 0x01, 0xB8, 0x00, 0x07, 0xE0,
|
||||
0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0x9C, 0x00, 0x0E, 0x70, 0x00, 0x39,
|
||||
0xC0, 0x01, 0xE3, 0x80, 0x07, 0x0F, 0x00, 0x3C, 0x1E, 0x01, 0xE0, 0x3F,
|
||||
0x3F, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0x80, 0xFF, 0xFF, 0xF0, 0x1C, 0x07,
|
||||
0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0,
|
||||
0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x70, 0x1C, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x3F, 0xFF,
|
||||
0x07, 0xC0, 0xF8, 0xF0, 0x03, 0xC4, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00,
|
||||
0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00,
|
||||
0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x3C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x3C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07,
|
||||
0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x60, 0x00,
|
||||
0xEF, 0x80, 0x1E, 0x7F, 0x1F, 0xC1, 0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x00,
|
||||
0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03,
|
||||
0x80, 0x00, 0x0F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0,
|
||||
0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x0E, 0x00, 0xE0, 0x1C,
|
||||
0x03, 0x80, 0x38, 0x0E, 0x00, 0x70, 0x3C, 0x00, 0xE0, 0x70, 0x01, 0xC1,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1C, 0x00,
|
||||
0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x03, 0x80, 0x00, 0x07, 0x00, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1C, 0x00,
|
||||
0x01, 0x80, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80,
|
||||
0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0xFF, 0xC0, 0x3F,
|
||||
0xFF, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x60, 0x00, 0x0E,
|
||||
0x40, 0x01, 0xEF, 0x00, 0x3C, 0x7F, 0x1F, 0x83, 0xFF, 0xF0, 0x07, 0xFC,
|
||||
0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFE, 0x01, 0xFF, 0xF8, 0x1F, 0x01, 0x81,
|
||||
0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00,
|
||||
0x03, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x1F, 0xF0, 0x73,
|
||||
0xFF, 0xE3, 0xBC, 0x0F, 0x9F, 0x80, 0x1C, 0xF8, 0x00, 0x77, 0x80, 0x03,
|
||||
0xBC, 0x00, 0x0C, 0xE0, 0x00, 0x77, 0x00, 0x03, 0xB8, 0x00, 0x18, 0xE0,
|
||||
0x01, 0xC7, 0x00, 0x0E, 0x1C, 0x00, 0xE0, 0x78, 0x1E, 0x01, 0xFF, 0xE0,
|
||||
0x03, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xC0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80,
|
||||
0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x00,
|
||||
0x20, 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7C, 0x07, 0xC3, 0x80, 0x0E,
|
||||
0x38, 0x00, 0x39, 0xC0, 0x01, 0xCE, 0x00, 0x0E, 0x70, 0x00, 0x73, 0x80,
|
||||
0x03, 0x9E, 0x00, 0x38, 0x78, 0x03, 0xC1, 0xF8, 0xFC, 0x03, 0xFF, 0x80,
|
||||
0x7F, 0xFF, 0x07, 0x80, 0x7C, 0x78, 0x00, 0xF7, 0x80, 0x03, 0xB8, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xEE,
|
||||
0x00, 0x0E, 0x78, 0x00, 0xF1, 0xF0, 0x1F, 0x07, 0xFF, 0xF0, 0x0F, 0xFE,
|
||||
0x00, 0x00, 0x60, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0xC0, 0x78, 0x0F, 0x07,
|
||||
0x80, 0x1C, 0x38, 0x00, 0x73, 0x80, 0x03, 0x9C, 0x00, 0x0E, 0xE0, 0x00,
|
||||
0x77, 0x00, 0x03, 0xB8, 0x00, 0x1C, 0xE0, 0x01, 0xF7, 0x00, 0x1F, 0x9C,
|
||||
0x01, 0xDC, 0xFE, 0x7C, 0xE1, 0xFF, 0xC7, 0x03, 0xF8, 0x38, 0x00, 0x01,
|
||||
0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00,
|
||||
0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x81, 0xC0, 0xF8, 0x0F, 0xFF, 0x80,
|
||||
0x3F, 0xF0, 0x00, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
|
||||
0xFF, 0x70, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF,
|
||||
0x77, 0x66, 0x6C, 0xC0, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x07, 0xE0, 0x0F,
|
||||
0xC0, 0x3F, 0x00, 0x7E, 0x01, 0xF8, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x7C,
|
||||
0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3E,
|
||||
0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0xFC,
|
||||
0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x0F, 0xC0,
|
||||
0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x03, 0xF0, 0x03, 0xE0, 0x01, 0x80, 0x00,
|
||||
0x00, 0x60, 0x00, 0xFF, 0xC0, 0x7F, 0xFE, 0x3E, 0x03, 0xEF, 0x00, 0x1E,
|
||||
0x40, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
|
||||
0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x80,
|
||||
0x00, 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
|
||||
0x0F, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xDF, 0xE0, 0x00, 0x1F, 0x00, 0x07,
|
||||
0x80, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0x00, 0x03, 0x01, 0xC0, 0x00, 0x00, 0x18, 0x18, 0x01, 0xF8, 0x71, 0xC3,
|
||||
0x00, 0xFF, 0xE7, 0x0C, 0x30, 0x1F, 0x1F, 0x70, 0x66, 0x03, 0xC0, 0x3F,
|
||||
0x06, 0x60, 0x78, 0x01, 0xF0, 0x76, 0x07, 0x00, 0x0F, 0x03, 0xE0, 0xE0,
|
||||
0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07, 0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C,
|
||||
0x0E, 0x00, 0x07, 0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07,
|
||||
0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07, 0x03, 0xE0, 0x70,
|
||||
0x00, 0xF0, 0x36, 0x07, 0x00, 0x0F, 0x06, 0x60, 0x38, 0x03, 0xF0, 0x67,
|
||||
0x01, 0xE0, 0x73, 0x8E, 0x30, 0x0F, 0xFE, 0x3F, 0xC3, 0x80, 0x3F, 0x81,
|
||||
0xF8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x07, 0x00,
|
||||
0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x40, 0x00,
|
||||
0x07, 0xE0, 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x3F, 0xC0,
|
||||
0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x70,
|
||||
0xE0, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x60, 0x60, 0x00, 0x0E, 0x07, 0x00,
|
||||
0x00, 0xC0, 0x70, 0x00, 0x1C, 0x03, 0x80, 0x01, 0xC0, 0x38, 0x00, 0x38,
|
||||
0x01, 0xC0, 0x03, 0x80, 0x1C, 0x00, 0x70, 0x00, 0xE0, 0x07, 0x00, 0x0E,
|
||||
0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x1C,
|
||||
0x00, 0x03, 0x81, 0xC0, 0x00, 0x38, 0x38, 0x00, 0x01, 0xC3, 0x80, 0x00,
|
||||
0x1C, 0x70, 0x00, 0x00, 0xE7, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x70,
|
||||
0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC3, 0x80, 0x07, 0xC7, 0x00, 0x03, 0xCE,
|
||||
0x00, 0x03, 0x9C, 0x00, 0x03, 0xB8, 0x00, 0x07, 0x70, 0x00, 0x0E, 0xE0,
|
||||
0x00, 0x1D, 0xC0, 0x00, 0x73, 0x80, 0x01, 0xE7, 0x00, 0x0F, 0x8F, 0xFF,
|
||||
0xFC, 0x1F, 0xFF, 0xFC, 0x38, 0x00, 0xFE, 0x70, 0x00, 0x1E, 0xE0, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00,
|
||||
0xFC, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x1E, 0xE0, 0x03, 0xF9,
|
||||
0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xF0,
|
||||
0x01, 0xFF, 0xFC, 0x07, 0xE0, 0x3E, 0x0F, 0x80, 0x0F, 0x1E, 0x00, 0x02,
|
||||
0x3C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00,
|
||||
0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00,
|
||||
0x1C, 0x00, 0x02, 0x1E, 0x00, 0x07, 0x0F, 0x80, 0x0F, 0x07, 0xF8, 0xFE,
|
||||
0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8,
|
||||
0x0E, 0x00, 0x3F, 0x83, 0x80, 0x01, 0xF0, 0xE0, 0x00, 0x1E, 0x38, 0x00,
|
||||
0x03, 0xCE, 0x00, 0x00, 0x73, 0x80, 0x00, 0x0E, 0xE0, 0x00, 0x03, 0xB8,
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x01,
|
||||
0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x0E, 0xE0,
|
||||
0x00, 0x07, 0x38, 0x00, 0x03, 0xCE, 0x00, 0x01, 0xE3, 0x80, 0x01, 0xF0,
|
||||
0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF,
|
||||
0xEF, 0xFF, 0xFE, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0xE0, 0x00, 0x0E,
|
||||
0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
|
||||
0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00,
|
||||
0x01, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00,
|
||||
0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0xFC, 0x07, 0xE0,
|
||||
0xF8, 0x00, 0x78, 0xF0, 0x00, 0x18, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x00,
|
||||
0x70, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1C, 0x00, 0x00,
|
||||
0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x80, 0x00, 0x0D, 0xC0, 0x00,
|
||||
0x06, 0xE0, 0x00, 0x03, 0x70, 0x00, 0x01, 0x9C, 0x00, 0x00, 0xCE, 0x00,
|
||||
0x00, 0x67, 0x80, 0x00, 0x31, 0xC0, 0x00, 0x18, 0x70, 0x00, 0x0C, 0x3C,
|
||||
0x00, 0x06, 0x0F, 0x80, 0x0F, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0xFF, 0x00,
|
||||
0x07, 0xFC, 0x00, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F,
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00,
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00,
|
||||
0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x38, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFE, 0x7F, 0xFC,
|
||||
0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00,
|
||||
0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03,
|
||||
0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE8,
|
||||
0x01, 0xD0, 0x03, 0xF8, 0x0E, 0x7C, 0x7C, 0x7F, 0xF0, 0x3F, 0x80, 0xE0,
|
||||
0x00, 0x1C, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x70, 0xE0, 0x00, 0xE0, 0xE0,
|
||||
0x01, 0xC0, 0xE0, 0x03, 0x80, 0xE0, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0,
|
||||
0x1C, 0x00, 0xE0, 0x38, 0x00, 0xE0, 0x70, 0x00, 0xE0, 0xE0, 0x00, 0xE1,
|
||||
0xE0, 0x00, 0xE3, 0xF0, 0x00, 0xE7, 0xF8, 0x00, 0xEF, 0x3C, 0x00, 0xFE,
|
||||
0x1E, 0x00, 0xFC, 0x0E, 0x00, 0xF8, 0x07, 0x00, 0xF0, 0x03, 0x80, 0xE0,
|
||||
0x03, 0xC0, 0xE0, 0x01, 0xE0, 0xE0, 0x00, 0xF0, 0xE0, 0x00, 0x78, 0xE0,
|
||||
0x00, 0x38, 0xE0, 0x00, 0x1C, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00,
|
||||
0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00,
|
||||
0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x38, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F,
|
||||
0xF0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xFF, 0xB8,
|
||||
0x00, 0x0E, 0xFC, 0xC0, 0x00, 0x77, 0xE7, 0x00, 0x07, 0x3F, 0x1C, 0x00,
|
||||
0x39, 0xF8, 0xE0, 0x03, 0x8F, 0xC3, 0x80, 0x18, 0x7E, 0x1C, 0x01, 0xC3,
|
||||
0xF0, 0x70, 0x1C, 0x1F, 0x81, 0xC0, 0xE0, 0xFC, 0x0E, 0x0E, 0x07, 0xE0,
|
||||
0x38, 0x60, 0x3F, 0x01, 0xC7, 0x01, 0xF8, 0x07, 0x30, 0x0F, 0xC0, 0x1B,
|
||||
0x80, 0x7E, 0x00, 0xF8, 0x03, 0xF0, 0x03, 0xC0, 0x1F, 0x80, 0x1C, 0x00,
|
||||
0xFC, 0x00, 0x40, 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x00, 0x0E, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x3F,
|
||||
0xE0, 0x00, 0x7F, 0xE0, 0x00, 0xFD, 0xC0, 0x01, 0xF9, 0xC0, 0x03, 0xF3,
|
||||
0xC0, 0x07, 0xE3, 0xC0, 0x0F, 0xC3, 0xC0, 0x1F, 0x83, 0x80, 0x3F, 0x03,
|
||||
0x80, 0x7E, 0x07, 0x80, 0xFC, 0x07, 0x81, 0xF8, 0x07, 0x83, 0xF0, 0x07,
|
||||
0x07, 0xE0, 0x07, 0x0F, 0xC0, 0x0F, 0x1F, 0x80, 0x0F, 0x3F, 0x00, 0x0F,
|
||||
0x7E, 0x00, 0x0E, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x1F,
|
||||
0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x38, 0x00, 0x02, 0x00,
|
||||
0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x0F, 0xC0, 0x7E, 0x00,
|
||||
0xF0, 0x00, 0xF8, 0x0F, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x07, 0x07, 0x00,
|
||||
0x00, 0x1C, 0x70, 0x00, 0x00, 0xE3, 0x80, 0x00, 0x03, 0xB8, 0x00, 0x00,
|
||||
0x1D, 0xC0, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x1F,
|
||||
0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00,
|
||||
0x00, 0x03, 0x9C, 0x00, 0x00, 0x1C, 0xE0, 0x00, 0x00, 0xE7, 0x80, 0x00,
|
||||
0x0E, 0x1C, 0x00, 0x00, 0xF0, 0x70, 0x00, 0x0F, 0x03, 0xC0, 0x00, 0xF0,
|
||||
0x0F, 0x80, 0x0F, 0x00, 0x1F, 0xC7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00,
|
||||
0x7F, 0xC0, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x0E, 0x00, 0x7E, 0x38,
|
||||
0x00, 0x3C, 0xE0, 0x00, 0x7B, 0x80, 0x00, 0xEE, 0x00, 0x01, 0xF8, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x3B, 0x80, 0x01, 0xEE, 0x00, 0x0F, 0x38, 0x01, 0xF8, 0xFF,
|
||||
0xFF, 0xC3, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03,
|
||||
0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFF,
|
||||
0xC0, 0x00, 0x1F, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xC0, 0x0F, 0x00, 0x0F,
|
||||
0x80, 0x78, 0x00, 0x0F, 0x03, 0xC0, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x38,
|
||||
0x70, 0x00, 0x00, 0xE1, 0xC0, 0x00, 0x01, 0xCE, 0x00, 0x00, 0x07, 0x38,
|
||||
0x00, 0x00, 0x1C, 0xE0, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x00, 0xEE, 0x00,
|
||||
0x00, 0x03, 0xB8, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x3B, 0x80, 0x00,
|
||||
0x01, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x1C, 0x78, 0x00, 0x00,
|
||||
0xE0, 0xE0, 0x00, 0x07, 0x81, 0xC0, 0x00, 0x3C, 0x07, 0x80, 0x01, 0xE0,
|
||||
0x0F, 0x80, 0x0F, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x1F, 0xFF, 0xC0, 0x00,
|
||||
0x0F, 0xF8, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0x80, 0x20, 0x00,
|
||||
0x0F, 0x83, 0xC0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xFF,
|
||||
0x03, 0xFF, 0xFF, 0x0E, 0x00, 0x7E, 0x38, 0x00, 0x3C, 0xE0, 0x00, 0x7B,
|
||||
0x80, 0x00, 0xEE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x3B, 0x80, 0x01,
|
||||
0xEE, 0x00, 0x0F, 0x38, 0x00, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x0E,
|
||||
0x00, 0x70, 0x38, 0x00, 0xE0, 0xE0, 0x03, 0xC3, 0x80, 0x07, 0x0E, 0x00,
|
||||
0x0E, 0x38, 0x00, 0x1C, 0xE0, 0x00, 0x73, 0x80, 0x00, 0xEE, 0x00, 0x01,
|
||||
0xC0, 0x00, 0x30, 0x00, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xE0, 0x3E, 0x78,
|
||||
0x00, 0x47, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07,
|
||||
0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1E, 0x00, 0x00,
|
||||
0xF0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x00,
|
||||
0x0F, 0xF0, 0x01, 0xE7, 0xE0, 0x7C, 0x3F, 0xFF, 0x80, 0x7F, 0xE0, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38,
|
||||
0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03,
|
||||
0x80, 0x00, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00,
|
||||
0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00,
|
||||
0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x33, 0x80, 0x00, 0xE7,
|
||||
0x00, 0x01, 0xCF, 0x00, 0x07, 0x8E, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1F,
|
||||
0xC7, 0xE0, 0x0F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0xF0, 0x00, 0x00, 0xEE,
|
||||
0x00, 0x00, 0x39, 0xC0, 0x00, 0x07, 0x1C, 0x00, 0x00, 0xC3, 0x80, 0x00,
|
||||
0x38, 0x38, 0x00, 0x07, 0x07, 0x00, 0x01, 0xC0, 0x70, 0x00, 0x38, 0x0E,
|
||||
0x00, 0x0E, 0x01, 0xE0, 0x01, 0xC0, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x0E,
|
||||
0x00, 0x38, 0x01, 0x80, 0x07, 0x00, 0x70, 0x00, 0x70, 0x0E, 0x00, 0x0E,
|
||||
0x03, 0x80, 0x00, 0xE0, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x03, 0xC3, 0x80,
|
||||
0x00, 0x38, 0xE0, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x73, 0x00, 0x00, 0x0E,
|
||||
0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x00,
|
||||
0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x03, 0xB8, 0x00, 0x0F,
|
||||
0x00, 0x01, 0x9C, 0x00, 0x0F, 0x80, 0x01, 0xC7, 0x00, 0x07, 0xC0, 0x00,
|
||||
0xE3, 0x80, 0x03, 0x70, 0x00, 0x61, 0xC0, 0x03, 0xB8, 0x00, 0x70, 0x70,
|
||||
0x01, 0xCC, 0x00, 0x38, 0x38, 0x00, 0xC7, 0x00, 0x18, 0x1C, 0x00, 0xE3,
|
||||
0x80, 0x1C, 0x07, 0x00, 0x70, 0xC0, 0x0E, 0x03, 0x80, 0x30, 0x70, 0x0E,
|
||||
0x01, 0xC0, 0x38, 0x38, 0x07, 0x00, 0x70, 0x1C, 0x0C, 0x03, 0x80, 0x38,
|
||||
0x0C, 0x07, 0x03, 0x80, 0x1C, 0x0E, 0x03, 0x81, 0xC0, 0x07, 0x07, 0x00,
|
||||
0xC0, 0xE0, 0x03, 0x83, 0x00, 0x70, 0xE0, 0x01, 0xC3, 0x80, 0x38, 0x70,
|
||||
0x00, 0x71, 0xC0, 0x0C, 0x38, 0x00, 0x38, 0xC0, 0x07, 0x38, 0x00, 0x1C,
|
||||
0xE0, 0x03, 0x9C, 0x00, 0x07, 0x70, 0x00, 0xEE, 0x00, 0x03, 0xB0, 0x00,
|
||||
0x7E, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0x80,
|
||||
0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x70,
|
||||
0x00, 0x1E, 0x38, 0x00, 0x1C, 0x3C, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x0E,
|
||||
0x00, 0x70, 0x07, 0x00, 0xE0, 0x07, 0x81, 0xC0, 0x03, 0x83, 0x80, 0x01,
|
||||
0xC3, 0x80, 0x01, 0xE7, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00,
|
||||
0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xEE, 0x00, 0x01,
|
||||
0xE7, 0x00, 0x01, 0xC3, 0x80, 0x03, 0x83, 0xC0, 0x07, 0x01, 0xC0, 0x0F,
|
||||
0x00, 0xE0, 0x0E, 0x00, 0xF0, 0x1C, 0x00, 0x78, 0x3C, 0x00, 0x38, 0x78,
|
||||
0x00, 0x1C, 0x70, 0x00, 0x1E, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x38,
|
||||
0x00, 0x03, 0x8E, 0x00, 0x03, 0x87, 0x00, 0x01, 0x81, 0xC0, 0x01, 0xC0,
|
||||
0x70, 0x01, 0xC0, 0x38, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0xE0,
|
||||
0x01, 0xC0, 0x70, 0x00, 0x70, 0x70, 0x00, 0x38, 0x38, 0x00, 0x0E, 0x38,
|
||||
0x00, 0x07, 0xB8, 0x00, 0x01, 0xDC, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01,
|
||||
0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00, 0x00,
|
||||
0x1C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x07, 0x80, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00,
|
||||
0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
|
||||
0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00,
|
||||
0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00,
|
||||
0xE0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x07, 0x00, 0x06, 0x00, 0x0E,
|
||||
0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0,
|
||||
0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00,
|
||||
0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, 0xFF,
|
||||
0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3,
|
||||
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70,
|
||||
0xE1, 0xC3, 0x87, 0x0E, 0x1F, 0xFF, 0xFF, 0xE0, 0x01, 0xC0, 0x01, 0xC0,
|
||||
0x03, 0xC0, 0x03, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, 0x30, 0x0C, 0x30,
|
||||
0x0C, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06,
|
||||
0x60, 0x06, 0x60, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x07,
|
||||
0x01, 0xC0, 0x78, 0x01, 0xC0, 0x0F, 0xFE, 0x1F, 0xFF, 0x8F, 0x01, 0xE2,
|
||||
0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x01, 0x80, 0xFF,
|
||||
0xC7, 0xFF, 0xE7, 0xE0, 0x37, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||
0x07, 0xE0, 0x03, 0xB8, 0x03, 0xDE, 0x07, 0x67, 0xFF, 0x30, 0xFF, 0x18,
|
||||
0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x70, 0x07,
|
||||
0x1F, 0xF0, 0x3B, 0xFF, 0xE1, 0xFC, 0x07, 0x8F, 0x80, 0x1E, 0x78, 0x00,
|
||||
0x73, 0xC0, 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B, 0x80, 0x01,
|
||||
0xDE, 0x00, 0x1E, 0xF8, 0x00, 0xE7, 0xE0, 0x0E, 0x3B, 0xC3, 0xF1, 0xCF,
|
||||
0xFE, 0x0E, 0x1F, 0xC0, 0x00, 0x00, 0xF0, 0x01, 0xFF, 0x80, 0xFF, 0xF8,
|
||||
0x78, 0x0F, 0x38, 0x01, 0xDC, 0x00, 0x27, 0x00, 0x03, 0x80, 0x00, 0xE0,
|
||||
0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00,
|
||||
0x0E, 0x00, 0x01, 0xC0, 0x00, 0x78, 0x00, 0x8F, 0x00, 0x71, 0xF0, 0xF8,
|
||||
0x3F, 0xFC, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x07, 0x00, 0x60, 0x38, 0x3F, 0xF1, 0xC7, 0xFF, 0xCE, 0x7C, 0x07,
|
||||
0x73, 0x80, 0x1F, 0xB8, 0x00, 0x7D, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03,
|
||||
0xF0, 0x00, 0x3F, 0x80, 0x01, 0xEE, 0x00, 0x1F, 0x78, 0x00, 0xF9, 0xE0,
|
||||
0x0F, 0xC7, 0xC3, 0xEE, 0x1F, 0xFE, 0x70, 0x3F, 0xC3, 0x80, 0x00, 0xE0,
|
||||
0x00, 0x7F, 0xE0, 0x1F, 0xFF, 0x03, 0xC0, 0x78, 0x38, 0x01, 0xC7, 0x00,
|
||||
0x0E, 0x60, 0x00, 0xEE, 0x00, 0x06, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07,
|
||||
0x00, 0x00, 0x78, 0x00, 0x83, 0xC0, 0x1C, 0x1F, 0x87, 0xC0, 0xFF, 0xF8,
|
||||
0x03, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0xF1, 0x83, 0x80, 0x1C, 0x00,
|
||||
0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x03, 0xFF, 0xCF, 0xFF, 0x07, 0x00,
|
||||
0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0,
|
||||
0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70,
|
||||
0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x3F, 0xF1, 0xC7,
|
||||
0xFF, 0xEE, 0x7C, 0x07, 0xF7, 0x80, 0x0F, 0xB8, 0x00, 0x3F, 0xC0, 0x01,
|
||||
0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3D, 0xC0, 0x01, 0xEF, 0x00, 0x1F,
|
||||
0x3C, 0x01, 0xF8, 0xF8, 0x3D, 0xC3, 0xFF, 0xCE, 0x07, 0xF8, 0x70, 0x00,
|
||||
0x03, 0x80, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x30, 0x00, 0xF3,
|
||||
0xE0, 0x0F, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0x00, 0x1F, 0x80, 0x00, 0xE0,
|
||||
0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0,
|
||||
0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0xF0, 0x1C, 0xFF, 0xC3, 0xBF,
|
||||
0xFC, 0x7E, 0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x03, 0xB8, 0x00, 0x37, 0x00,
|
||||
0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
|
||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0E, 0xEF, 0xFE, 0x00, 0x00,
|
||||
0x0E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00,
|
||||
0xE0, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0xE4, 0x1C, 0x7F, 0xC7, 0xF8, 0x1C, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03,
|
||||
0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07,
|
||||
0x00, 0x00, 0xE0, 0x00, 0x5C, 0x00, 0x73, 0x80, 0x1C, 0x70, 0x07, 0x0E,
|
||||
0x01, 0xC1, 0xC0, 0xF0, 0x38, 0x3C, 0x07, 0x0F, 0x00, 0xE3, 0xC0, 0x1C,
|
||||
0xF8, 0x03, 0xBF, 0x80, 0x7F, 0x78, 0x0F, 0xC7, 0x01, 0xE0, 0x70, 0x38,
|
||||
0x07, 0x07, 0x00, 0xF0, 0xE0, 0x0F, 0x1C, 0x00, 0xE3, 0x80, 0x0E, 0x70,
|
||||
0x00, 0xEE, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0x00, 0x60, 0x00, 0xE0, 0x39, 0xFF, 0x81, 0xFF, 0x0E,
|
||||
0xFF, 0xF1, 0xFF, 0xE3, 0xF0, 0x1E, 0xF0, 0x3C, 0xF8, 0x03, 0xF0, 0x07,
|
||||
0xBC, 0x00, 0x78, 0x00, 0xEE, 0x00, 0x1E, 0x00, 0x1B, 0x80, 0x07, 0x80,
|
||||
0x07, 0xE0, 0x01, 0xC0, 0x01, 0xF8, 0x00, 0x70, 0x00, 0x7E, 0x00, 0x1C,
|
||||
0x00, 0x1F, 0x80, 0x07, 0x00, 0x07, 0xE0, 0x01, 0xC0, 0x01, 0xF8, 0x00,
|
||||
0x70, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, 0x80, 0x07, 0x00, 0x07, 0xE0,
|
||||
0x01, 0xC0, 0x01, 0xF8, 0x00, 0x70, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F,
|
||||
0x80, 0x07, 0x00, 0x07, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0xF0, 0x1C,
|
||||
0xFF, 0xC3, 0xBF, 0xFC, 0x7E, 0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x03, 0xB8,
|
||||
0x00, 0x37, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
|
||||
0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
||||
0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0E, 0x00,
|
||||
0x70, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0xE0, 0x3C, 0x07, 0x83, 0x80, 0x1E,
|
||||
0x38, 0x00, 0x71, 0xC0, 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B,
|
||||
0x80, 0x01, 0xCE, 0x00, 0x1E, 0x78, 0x00, 0xE1, 0xE0, 0x0E, 0x07, 0xC3,
|
||||
0xE0, 0x1F, 0xFE, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x70, 0x07, 0x1F, 0xF0,
|
||||
0x3B, 0xFF, 0xE1, 0xFC, 0x07, 0x8F, 0x80, 0x1E, 0x78, 0x00, 0x73, 0xC0,
|
||||
0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00, 0x01, 0xF8, 0x00, 0x0F,
|
||||
0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B, 0x80, 0x01, 0xDE, 0x00,
|
||||
0x1E, 0xF8, 0x00, 0xE7, 0xE0, 0x0E, 0x3B, 0xC3, 0xF1, 0xCF, 0xFE, 0x0E,
|
||||
0x1F, 0xC0, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x00,
|
||||
0x00, 0x60, 0x00, 0x3F, 0xF1, 0xC7, 0xFF, 0xCE, 0x7C, 0x07, 0x73, 0x80,
|
||||
0x1F, 0xB8, 0x00, 0x7D, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
|
||||
0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x3F, 0x80, 0x01, 0xEE, 0x00, 0x1F, 0x78, 0x00, 0xF9, 0xE0, 0x0F, 0xC7,
|
||||
0xC3, 0xEE, 0x1F, 0xFE, 0x70, 0x3F, 0xC3, 0x80, 0x00, 0x1C, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00,
|
||||
0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x79, 0xFE, 0xFF, 0xF8, 0xF8, 0x3C,
|
||||
0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03,
|
||||
0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x01, 0xE0, 0x07, 0xFF,
|
||||
0x0F, 0xFF, 0xCF, 0x00, 0xC7, 0x00, 0x03, 0x80, 0x01, 0x80, 0x00, 0xE0,
|
||||
0x00, 0x78, 0x00, 0x1F, 0x80, 0x07, 0xFE, 0x00, 0x7F, 0xC0, 0x01, 0xF0,
|
||||
0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0xB0, 0x03, 0xBF, 0x07,
|
||||
0xCF, 0xFF, 0xC0, 0xFF, 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00,
|
||||
0x1C, 0x03, 0xFF, 0xCF, 0xFF, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0,
|
||||
0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70,
|
||||
0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF1, 0x81, 0xFF, 0x03,
|
||||
0xF8, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
|
||||
0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C,
|
||||
0x00, 0x0F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0,
|
||||
0x0F, 0x78, 0x07, 0xCF, 0x8F, 0xB1, 0xFF, 0xCC, 0x3F, 0xC3, 0xE0, 0x00,
|
||||
0x3B, 0x80, 0x03, 0x9C, 0x00, 0x1C, 0x70, 0x00, 0xC3, 0x80, 0x0E, 0x0E,
|
||||
0x00, 0x60, 0x70, 0x07, 0x01, 0x80, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C,
|
||||
0x01, 0xC1, 0xC0, 0x0E, 0x0E, 0x00, 0x38, 0x60, 0x01, 0xC7, 0x00, 0x06,
|
||||
0x30, 0x00, 0x3B, 0x80, 0x00, 0xDC, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x60, 0x00, 0xE0, 0x01, 0xDC, 0x00, 0x78, 0x00, 0x67,
|
||||
0x00, 0x1E, 0x00, 0x38, 0xC0, 0x0F, 0xC0, 0x0C, 0x38, 0x03, 0xB0, 0x03,
|
||||
0x06, 0x00, 0xCE, 0x01, 0xC1, 0xC0, 0x73, 0x80, 0x60, 0x70, 0x18, 0x60,
|
||||
0x38, 0x0C, 0x06, 0x1C, 0x0E, 0x03, 0x83, 0x83, 0x03, 0x00, 0xE0, 0xC0,
|
||||
0xC1, 0xC0, 0x18, 0x70, 0x38, 0x60, 0x07, 0x1C, 0x06, 0x18, 0x00, 0xC6,
|
||||
0x01, 0xCE, 0x00, 0x3B, 0x80, 0x73, 0x00, 0x0E, 0xC0, 0x0D, 0xC0, 0x01,
|
||||
0xB0, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x1E, 0x00,
|
||||
0x03, 0x80, 0x07, 0x00, 0x70, 0x01, 0xC7, 0x00, 0x70, 0xF0, 0x1C, 0x0E,
|
||||
0x07, 0x80, 0xE0, 0xE0, 0x0E, 0x38, 0x00, 0xEE, 0x00, 0x1F, 0x80, 0x01,
|
||||
0xF0, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00, 0x3B, 0x80, 0x0E,
|
||||
0x38, 0x03, 0x83, 0x80, 0xE0, 0x78, 0x3C, 0x07, 0x07, 0x00, 0x71, 0xC0,
|
||||
0x07, 0x70, 0x00, 0x70, 0x70, 0x00, 0x1C, 0xE0, 0x00, 0xE3, 0x80, 0x03,
|
||||
0x87, 0x00, 0x0C, 0x1C, 0x00, 0x70, 0x38, 0x01, 0x80, 0xE0, 0x0E, 0x01,
|
||||
0x80, 0x38, 0x07, 0x01, 0xC0, 0x1C, 0x07, 0x00, 0x38, 0x38, 0x00, 0xE0,
|
||||
0xE0, 0x01, 0xC3, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x60, 0x00, 0x3B, 0x80,
|
||||
0x00, 0x6E, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00,
|
||||
0x38, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x40, 0xE0,
|
||||
0x03, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00,
|
||||
0xE0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1E,
|
||||
0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x03, 0xC1, 0xF0, 0xF0, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x3F, 0x0F,
|
||||
0x80, 0xF0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70,
|
||||
0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xFC, 0x1F, 0x00, 0xC0,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFE, 0xF0, 0x3E, 0x03, 0xC0, 0x70, 0x0E, 0x03, 0x80, 0xE0, 0x38,
|
||||
0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03,
|
||||
0xF0, 0x7C, 0x3C, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||
0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, 0x0F, 0xC3, 0xE0, 0xC0,
|
||||
0x00, 0x0E, 0x00, 0xCF, 0xE0, 0x37, 0xBC, 0x0D, 0x83, 0x86, 0x60, 0x7F,
|
||||
0xB0, 0x0F, 0xC0 };
|
||||
|
||||
const GFXglyph Montserrat_Regular20pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 10, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 4, 27, 10, 3, -26 }, // 0x21 '!'
|
||||
{ 15, 9, 10, 15, 3, -26 }, // 0x22 '"'
|
||||
{ 27, 25, 27, 27, 1, -26 }, // 0x23 '#'
|
||||
{ 112, 20, 37, 24, 2, -31 }, // 0x24 '$'
|
||||
{ 205, 29, 28, 32, 2, -27 }, // 0x25 '%'
|
||||
{ 307, 24, 28, 26, 2, -27 }, // 0x26 '&'
|
||||
{ 391, 2, 10, 8, 3, -26 }, // 0x27 '''
|
||||
{ 394, 7, 37, 13, 4, -28 }, // 0x28 '('
|
||||
{ 427, 7, 37, 13, 2, -28 }, // 0x29 ')'
|
||||
{ 460, 13, 14, 15, 1, -28 }, // 0x2A '*'
|
||||
{ 483, 17, 17, 22, 3, -21 }, // 0x2B '+'
|
||||
{ 520, 4, 10, 8, 2, -3 }, // 0x2C ','
|
||||
{ 525, 11, 3, 15, 2, -11 }, // 0x2D '-'
|
||||
{ 530, 4, 4, 8, 2, -3 }, // 0x2E '.'
|
||||
{ 532, 15, 37, 13, -1, -32 }, // 0x2F '/'
|
||||
{ 602, 22, 28, 26, 2, -27 }, // 0x30 '0'
|
||||
{ 679, 10, 27, 14, 0, -26 }, // 0x31 '1'
|
||||
{ 713, 20, 28, 22, 1, -27 }, // 0x32 '2'
|
||||
{ 783, 20, 27, 22, 0, -26 }, // 0x33 '3'
|
||||
{ 851, 23, 27, 26, 2, -26 }, // 0x34 '4'
|
||||
{ 929, 20, 27, 22, 1, -26 }, // 0x35 '5'
|
||||
{ 997, 21, 28, 24, 2, -27 }, // 0x36 '6'
|
||||
{ 1071, 20, 27, 23, 1, -26 }, // 0x37 '7'
|
||||
{ 1139, 21, 28, 25, 2, -27 }, // 0x38 '8'
|
||||
{ 1213, 21, 28, 24, 1, -27 }, // 0x39 '9'
|
||||
{ 1287, 4, 21, 8, 2, -20 }, // 0x3A ':'
|
||||
{ 1298, 4, 27, 8, 2, -20 }, // 0x3B ';'
|
||||
{ 1312, 17, 16, 22, 3, -21 }, // 0x3C '<'
|
||||
{ 1346, 17, 11, 22, 3, -18 }, // 0x3D '='
|
||||
{ 1370, 17, 16, 22, 3, -21 }, // 0x3E '>'
|
||||
{ 1404, 19, 28, 22, 0, -27 }, // 0x3F '?'
|
||||
{ 1471, 36, 36, 40, 2, -27 }, // 0x40 '@'
|
||||
{ 1633, 28, 27, 28, 0, -26 }, // 0x41 'A'
|
||||
{ 1728, 23, 27, 29, 4, -26 }, // 0x42 'B'
|
||||
{ 1806, 24, 28, 28, 2, -27 }, // 0x43 'C'
|
||||
{ 1890, 26, 27, 32, 4, -26 }, // 0x44 'D'
|
||||
{ 1978, 20, 27, 26, 4, -26 }, // 0x45 'E'
|
||||
{ 2046, 19, 27, 25, 4, -26 }, // 0x46 'F'
|
||||
{ 2111, 25, 28, 30, 2, -27 }, // 0x47 'G'
|
||||
{ 2199, 23, 27, 32, 4, -26 }, // 0x48 'H'
|
||||
{ 2277, 3, 27, 12, 4, -26 }, // 0x49 'I'
|
||||
{ 2288, 15, 27, 20, 0, -26 }, // 0x4A 'J'
|
||||
{ 2339, 24, 27, 28, 4, -26 }, // 0x4B 'K'
|
||||
{ 2420, 19, 27, 23, 4, -26 }, // 0x4C 'L'
|
||||
{ 2485, 29, 27, 37, 4, -26 }, // 0x4D 'M'
|
||||
{ 2583, 23, 27, 32, 4, -26 }, // 0x4E 'N'
|
||||
{ 2661, 29, 28, 33, 2, -27 }, // 0x4F 'O'
|
||||
{ 2763, 22, 27, 28, 4, -26 }, // 0x50 'P'
|
||||
{ 2838, 30, 33, 33, 2, -27 }, // 0x51 'Q'
|
||||
{ 2962, 22, 27, 28, 4, -26 }, // 0x52 'R'
|
||||
{ 3037, 20, 28, 24, 2, -27 }, // 0x53 'S'
|
||||
{ 3107, 22, 27, 22, 0, -26 }, // 0x54 'T'
|
||||
{ 3182, 23, 27, 31, 4, -26 }, // 0x55 'U'
|
||||
{ 3260, 27, 27, 27, 0, -26 }, // 0x56 'V'
|
||||
{ 3352, 41, 27, 43, 1, -26 }, // 0x57 'W'
|
||||
{ 3491, 24, 27, 26, 1, -26 }, // 0x58 'X'
|
||||
{ 3572, 25, 27, 25, 0, -26 }, // 0x59 'Y'
|
||||
{ 3657, 22, 27, 25, 2, -26 }, // 0x5A 'Z'
|
||||
{ 3732, 8, 37, 12, 4, -28 }, // 0x5B '['
|
||||
{ 3769, 15, 37, 13, -1, -32 }, // 0x5C '\'
|
||||
{ 3839, 7, 37, 12, 1, -28 }, // 0x5D ']'
|
||||
{ 3872, 16, 16, 22, 3, -21 }, // 0x5E '^'
|
||||
{ 3904, 20, 2, 20, 0, 1 }, // 0x5F '_'
|
||||
{ 3909, 9, 5, 23, 5, -28 }, // 0x60 '`'
|
||||
{ 3915, 17, 21, 23, 2, -20 }, // 0x61 'a'
|
||||
{ 3960, 21, 29, 26, 4, -28 }, // 0x62 'b'
|
||||
{ 4037, 18, 21, 22, 2, -20 }, // 0x63 'c'
|
||||
{ 4085, 21, 29, 26, 2, -28 }, // 0x64 'd'
|
||||
{ 4162, 20, 21, 24, 2, -20 }, // 0x65 'e'
|
||||
{ 4215, 14, 29, 13, 1, -28 }, // 0x66 'f'
|
||||
{ 4266, 21, 29, 27, 2, -20 }, // 0x67 'g'
|
||||
{ 4343, 19, 29, 26, 4, -28 }, // 0x68 'h'
|
||||
{ 4412, 4, 29, 10, 4, -28 }, // 0x69 'i'
|
||||
{ 4427, 12, 37, 11, -4, -28 }, // 0x6A 'j'
|
||||
{ 4483, 19, 29, 23, 4, -28 }, // 0x6B 'k'
|
||||
{ 4552, 3, 29, 10, 4, -28 }, // 0x6C 'l'
|
||||
{ 4563, 34, 21, 41, 4, -20 }, // 0x6D 'm'
|
||||
{ 4653, 19, 21, 26, 4, -20 }, // 0x6E 'n'
|
||||
{ 4703, 21, 21, 24, 2, -20 }, // 0x6F 'o'
|
||||
{ 4759, 21, 29, 26, 4, -20 }, // 0x70 'p'
|
||||
{ 4836, 21, 29, 26, 2, -20 }, // 0x71 'q'
|
||||
{ 4913, 10, 21, 16, 4, -20 }, // 0x72 'r'
|
||||
{ 4940, 17, 21, 19, 1, -20 }, // 0x73 's'
|
||||
{ 4985, 14, 25, 16, 1, -24 }, // 0x74 't'
|
||||
{ 5029, 18, 20, 26, 4, -19 }, // 0x75 'u'
|
||||
{ 5074, 21, 20, 21, 0, -19 }, // 0x76 'v'
|
||||
{ 5127, 34, 20, 34, 0, -19 }, // 0x77 'w'
|
||||
{ 5212, 19, 20, 21, 1, -19 }, // 0x78 'x'
|
||||
{ 5260, 22, 28, 21, -1, -19 }, // 0x79 'y'
|
||||
{ 5337, 16, 20, 20, 2, -19 }, // 0x7A 'z'
|
||||
{ 5377, 10, 37, 13, 2, -28 }, // 0x7B '{'
|
||||
{ 5424, 3, 37, 11, 4, -28 }, // 0x7C '|'
|
||||
{ 5438, 10, 37, 13, 1, -28 }, // 0x7D '}'
|
||||
{ 5485, 18, 6, 22, 2, -16 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Regular20pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Regular20pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Regular20pt7bGlyphs,
|
||||
0x20, 0x7E, 48 };
|
||||
|
||||
// Approx. 6171 bytes
|
||||
|
||||
#endif // MONTSERRAT20PT7B_H
|
||||
@@ -0,0 +1,170 @@
|
||||
#ifndef MONTSERRAT7PT7B_H
|
||||
#define MONTSERRAT7PT7B_H
|
||||
const uint8_t Montserrat_Regular7pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xAA, 0xA8, 0x30, 0xB6, 0xD0, 0x11, 0x08, 0x84, 0x4F, 0xF1, 0x20,
|
||||
0x91, 0xFC, 0x44, 0x22, 0x11, 0x00, 0x10, 0xFB, 0x44, 0x89, 0x0E, 0x07,
|
||||
0x09, 0x13, 0x25, 0xF0, 0x81, 0x00, 0x60, 0x24, 0x49, 0x22, 0x50, 0xB4,
|
||||
0x12, 0xE1, 0x24, 0x51, 0x22, 0x50, 0xE0, 0x38, 0x44, 0x44, 0x48, 0x30,
|
||||
0x50, 0x89, 0x86, 0x86, 0x79, 0xF0, 0x29, 0x25, 0x24, 0x49, 0x22, 0xA5,
|
||||
0x55, 0x56, 0x80, 0x23, 0xDC, 0x52, 0x00, 0x00, 0x41, 0x3F, 0x10, 0x40,
|
||||
0xE0, 0xF0, 0x80, 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, 0x00,
|
||||
0x38, 0x44, 0x82, 0x82, 0x83, 0x81, 0x82, 0x82, 0x46, 0x3C, 0xE4, 0x92,
|
||||
0x49, 0x24, 0x3D, 0x8C, 0x08, 0x10, 0x41, 0x86, 0x18, 0x60, 0xFC, 0x7E,
|
||||
0x08, 0x30, 0x41, 0x80, 0xC0, 0x81, 0x82, 0xF8, 0x04, 0x08, 0x10, 0x20,
|
||||
0x44, 0x44, 0xFF, 0x04, 0x04, 0x04, 0x7E, 0x81, 0x02, 0x07, 0x80, 0xC0,
|
||||
0x81, 0x02, 0xF8, 0x3C, 0x82, 0x04, 0x0B, 0xD8, 0xE0, 0xC1, 0x42, 0x78,
|
||||
0xFF, 0x82, 0x82, 0x04, 0x04, 0x0C, 0x08, 0x08, 0x10, 0x10, 0x79, 0x8E,
|
||||
0x0C, 0x17, 0xD8, 0xA0, 0xC1, 0x82, 0xF8, 0x3C, 0x42, 0x82, 0x83, 0x43,
|
||||
0x3D, 0x01, 0x02, 0x02, 0x7C, 0x82, 0x83, 0x80, 0x04, 0x6E, 0x30, 0x38,
|
||||
0x10, 0xFC, 0x00, 0x3F, 0x81, 0x81, 0xC3, 0x72, 0x00, 0x3D, 0x8C, 0x08,
|
||||
0x10, 0x41, 0x04, 0x00, 0x00, 0x30, 0x0F, 0x81, 0x83, 0x10, 0x05, 0x1E,
|
||||
0xA9, 0x0C, 0xC8, 0x26, 0x41, 0x32, 0x09, 0x90, 0xCC, 0x7B, 0x90, 0x00,
|
||||
0x60, 0x00, 0xF8, 0x00, 0x0C, 0x03, 0x01, 0x20, 0x48, 0x12, 0x08, 0x43,
|
||||
0xF1, 0x02, 0x40, 0xA0, 0x10, 0xFC, 0x82, 0x82, 0x82, 0x86, 0xFE, 0x81,
|
||||
0x81, 0x83, 0xFE, 0x1E, 0x61, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x61,
|
||||
0x3E, 0xFC, 0x41, 0x20, 0x50, 0x18, 0x0C, 0x06, 0x03, 0x02, 0x83, 0x7E,
|
||||
0x00, 0xFD, 0x02, 0x04, 0x08, 0x1F, 0x20, 0x40, 0x81, 0xFC, 0xFE, 0x08,
|
||||
0x20, 0x83, 0xF8, 0x20, 0x82, 0x00, 0x1E, 0x30, 0xF0, 0x10, 0x08, 0x04,
|
||||
0x0A, 0x05, 0x82, 0x61, 0x1F, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFD,
|
||||
0x81, 0x81, 0x81, 0x81, 0xFF, 0xC0, 0x7C, 0x30, 0xC3, 0x0C, 0x30, 0xC2,
|
||||
0x89, 0xE0, 0x82, 0x84, 0x88, 0x90, 0xA0, 0xF0, 0xC8, 0x8C, 0x86, 0x82,
|
||||
0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x83, 0xF0, 0x80, 0x60, 0x3C, 0x0F,
|
||||
0x05, 0xA2, 0x64, 0x99, 0x46, 0x31, 0x88, 0x60, 0x10, 0x81, 0x81, 0xC1,
|
||||
0xA1, 0x91, 0x99, 0x89, 0x85, 0x83, 0x81, 0x1E, 0x18, 0x6C, 0x0A, 0x01,
|
||||
0x80, 0x60, 0x18, 0x07, 0x02, 0x61, 0x8F, 0x80, 0xF9, 0x0E, 0x0C, 0x18,
|
||||
0x30, 0xFE, 0x40, 0x81, 0x00, 0x1E, 0x18, 0x6C, 0x0A, 0x01, 0x80, 0x60,
|
||||
0x18, 0x07, 0x02, 0x61, 0x8F, 0x80, 0x60, 0x0F, 0xF9, 0x0E, 0x0C, 0x18,
|
||||
0x30, 0xFE, 0x42, 0x85, 0x04, 0x7D, 0x82, 0x04, 0x06, 0x03, 0x80, 0x81,
|
||||
0x82, 0xF8, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0xC2, 0x7C, 0x80, 0x50,
|
||||
0x24, 0x08, 0x84, 0x21, 0x08, 0x81, 0x20, 0x58, 0x0C, 0x03, 0x00, 0x82,
|
||||
0x06, 0x0C, 0x18, 0x30, 0x91, 0x42, 0x44, 0x89, 0x22, 0x42, 0x89, 0x0A,
|
||||
0x14, 0x30, 0x60, 0x41, 0x80, 0x41, 0x30, 0x88, 0x82, 0x80, 0xC0, 0x60,
|
||||
0x50, 0x44, 0x61, 0x20, 0xC0, 0x80, 0xA0, 0x98, 0x84, 0x41, 0x40, 0xA0,
|
||||
0x20, 0x10, 0x08, 0x04, 0x00, 0xFF, 0x02, 0x04, 0x08, 0x18, 0x10, 0x20,
|
||||
0x40, 0x80, 0xFF, 0xEA, 0xAA, 0xAA, 0xC0, 0x84, 0x20, 0x84, 0x20, 0x84,
|
||||
0x20, 0x84, 0x20, 0x80, 0x64, 0x92, 0x49, 0x24, 0x9E, 0x30, 0xC2, 0x92,
|
||||
0x4A, 0x10, 0xFE, 0x44, 0xF8, 0x10, 0x7F, 0x86, 0x37, 0x40, 0x80, 0x80,
|
||||
0x80, 0xBE, 0xC2, 0x81, 0x81, 0xC1, 0xC2, 0xBC, 0x7E, 0x08, 0x20, 0x83,
|
||||
0x17, 0x80, 0x02, 0x04, 0x0B, 0xF8, 0x30, 0x60, 0xC1, 0xC6, 0xF4, 0x7D,
|
||||
0x0A, 0x0F, 0xF8, 0x18, 0x1F, 0x00, 0x39, 0x08, 0xE2, 0x10, 0x84, 0x21,
|
||||
0x00, 0x7F, 0x06, 0x0C, 0x18, 0x38, 0xCE, 0x81, 0xC6, 0x70, 0x81, 0x02,
|
||||
0x05, 0xEC, 0x30, 0x60, 0xC1, 0x83, 0x04, 0xC2, 0xAA, 0xA0, 0x30, 0x02,
|
||||
0x22, 0x22, 0x22, 0x22, 0xC0, 0x81, 0x02, 0x04, 0x28, 0x92, 0x2E, 0x64,
|
||||
0x85, 0x04, 0xFF, 0xC0, 0xBD, 0xF6, 0x10, 0xA0, 0x83, 0x04, 0x18, 0x20,
|
||||
0xC1, 0x06, 0x08, 0x20, 0xBD, 0x86, 0x0C, 0x18, 0x30, 0x60, 0x80, 0x7D,
|
||||
0x06, 0x0C, 0x18, 0x38, 0xDE, 0x00, 0xBE, 0xC2, 0x81, 0x81, 0xC1, 0xC2,
|
||||
0xBC, 0x80, 0x80, 0x80, 0x7F, 0x06, 0x0C, 0x18, 0x38, 0xDE, 0x81, 0x02,
|
||||
0x04, 0xBC, 0x88, 0x88, 0x80, 0x7D, 0x04, 0x0F, 0x04, 0x17, 0xC0, 0x21,
|
||||
0x1C, 0x42, 0x10, 0x84, 0x38, 0x83, 0x06, 0x0C, 0x18, 0x28, 0xDE, 0x80,
|
||||
0x82, 0x42, 0x44, 0x24, 0x28, 0x18, 0x18, 0x86, 0x14, 0x61, 0x45, 0x22,
|
||||
0x92, 0x29, 0x43, 0x0C, 0x10, 0xC0, 0x46, 0x48, 0x60, 0x82, 0x8C, 0x90,
|
||||
0x80, 0x82, 0x42, 0x44, 0x24, 0x28, 0x18, 0x18, 0x10, 0x30, 0xE0, 0xF8,
|
||||
0x61, 0x08, 0x42, 0x0F, 0xC0, 0x69, 0x24, 0xB2, 0x49, 0x22, 0xFF, 0xF8,
|
||||
0x62, 0x22, 0x22, 0x32, 0x22, 0x22, 0xC0, 0xE6, 0x70 };
|
||||
|
||||
const GFXglyph Montserrat_Regular7pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 10, 4, 1, -9 }, // 0x21 '!'
|
||||
{ 4, 3, 4, 5, 1, -9 }, // 0x22 '"'
|
||||
{ 6, 9, 10, 10, 0, -9 }, // 0x23 '#'
|
||||
{ 18, 7, 13, 9, 1, -10 }, // 0x24 '$'
|
||||
{ 30, 10, 10, 12, 1, -9 }, // 0x25 '%'
|
||||
{ 43, 8, 10, 9, 1, -9 }, // 0x26 '&'
|
||||
{ 53, 1, 4, 3, 1, -9 }, // 0x27 '''
|
||||
{ 54, 3, 13, 5, 1, -9 }, // 0x28 '('
|
||||
{ 59, 2, 13, 5, 1, -9 }, // 0x29 ')'
|
||||
{ 63, 5, 5, 5, 0, -9 }, // 0x2A '*'
|
||||
{ 67, 6, 6, 8, 1, -7 }, // 0x2B '+'
|
||||
{ 72, 1, 3, 3, 1, 0 }, // 0x2C ','
|
||||
{ 73, 4, 1, 5, 1, -3 }, // 0x2D '-'
|
||||
{ 74, 1, 1, 3, 1, 0 }, // 0x2E '.'
|
||||
{ 75, 5, 13, 5, 0, -11 }, // 0x2F '/'
|
||||
{ 84, 8, 10, 9, 1, -9 }, // 0x30 '0'
|
||||
{ 94, 3, 10, 5, 0, -9 }, // 0x31 '1'
|
||||
{ 98, 7, 10, 8, 0, -9 }, // 0x32 '2'
|
||||
{ 107, 7, 10, 8, 0, -9 }, // 0x33 '3'
|
||||
{ 116, 8, 10, 9, 1, -9 }, // 0x34 '4'
|
||||
{ 126, 7, 10, 8, 0, -9 }, // 0x35 '5'
|
||||
{ 135, 7, 10, 9, 1, -9 }, // 0x36 '6'
|
||||
{ 144, 8, 10, 8, 0, -9 }, // 0x37 '7'
|
||||
{ 154, 7, 10, 9, 1, -9 }, // 0x38 '8'
|
||||
{ 163, 8, 10, 9, 0, -9 }, // 0x39 '9'
|
||||
{ 173, 1, 7, 3, 1, -6 }, // 0x3A ':'
|
||||
{ 174, 1, 9, 3, 1, -6 }, // 0x3B ';'
|
||||
{ 176, 6, 6, 8, 1, -7 }, // 0x3C '<'
|
||||
{ 181, 6, 4, 8, 1, -6 }, // 0x3D '='
|
||||
{ 184, 6, 6, 8, 1, -7 }, // 0x3E '>'
|
||||
{ 189, 7, 10, 8, 0, -9 }, // 0x3F '?'
|
||||
{ 198, 13, 13, 14, 1, -9 }, // 0x40 '@'
|
||||
{ 220, 10, 10, 10, 0, -9 }, // 0x41 'A'
|
||||
{ 233, 8, 10, 11, 2, -9 }, // 0x42 'B'
|
||||
{ 243, 8, 10, 10, 1, -9 }, // 0x43 'C'
|
||||
{ 253, 9, 10, 12, 2, -9 }, // 0x44 'D'
|
||||
{ 265, 7, 10, 9, 2, -9 }, // 0x45 'E'
|
||||
{ 274, 6, 10, 9, 2, -9 }, // 0x46 'F'
|
||||
{ 282, 9, 10, 11, 1, -9 }, // 0x47 'G'
|
||||
{ 294, 8, 10, 11, 2, -9 }, // 0x48 'H'
|
||||
{ 304, 1, 10, 4, 2, -9 }, // 0x49 'I'
|
||||
{ 306, 6, 10, 7, 0, -9 }, // 0x4A 'J'
|
||||
{ 314, 8, 10, 10, 2, -9 }, // 0x4B 'K'
|
||||
{ 324, 6, 10, 8, 2, -9 }, // 0x4C 'L'
|
||||
{ 332, 10, 10, 13, 2, -9 }, // 0x4D 'M'
|
||||
{ 345, 8, 10, 11, 2, -9 }, // 0x4E 'N'
|
||||
{ 355, 10, 10, 12, 1, -9 }, // 0x4F 'O'
|
||||
{ 368, 7, 10, 10, 2, -9 }, // 0x50 'P'
|
||||
{ 377, 10, 12, 12, 1, -9 }, // 0x51 'Q'
|
||||
{ 392, 7, 10, 10, 2, -9 }, // 0x52 'R'
|
||||
{ 401, 7, 10, 9, 1, -9 }, // 0x53 'S'
|
||||
{ 410, 8, 10, 8, 0, -9 }, // 0x54 'T'
|
||||
{ 420, 8, 10, 11, 2, -9 }, // 0x55 'U'
|
||||
{ 430, 10, 10, 10, 0, -9 }, // 0x56 'V'
|
||||
{ 443, 14, 10, 16, 1, -9 }, // 0x57 'W'
|
||||
{ 461, 9, 10, 9, 0, -9 }, // 0x58 'X'
|
||||
{ 473, 9, 10, 9, 0, -9 }, // 0x59 'Y'
|
||||
{ 485, 8, 10, 9, 1, -9 }, // 0x5A 'Z'
|
||||
{ 495, 2, 13, 4, 2, -9 }, // 0x5B '['
|
||||
{ 499, 5, 13, 5, 0, -11 }, // 0x5C '\'
|
||||
{ 508, 3, 13, 4, 0, -9 }, // 0x5D ']'
|
||||
{ 513, 6, 6, 8, 1, -7 }, // 0x5E '^'
|
||||
{ 518, 7, 1, 7, 0, 1 }, // 0x5F '_'
|
||||
{ 519, 3, 2, 8, 2, -9 }, // 0x60 '`'
|
||||
{ 520, 6, 7, 8, 1, -6 }, // 0x61 'a'
|
||||
{ 526, 8, 10, 9, 1, -9 }, // 0x62 'b'
|
||||
{ 536, 6, 7, 8, 1, -6 }, // 0x63 'c'
|
||||
{ 542, 7, 10, 9, 1, -9 }, // 0x64 'd'
|
||||
{ 551, 7, 7, 8, 1, -6 }, // 0x65 'e'
|
||||
{ 558, 5, 10, 5, 0, -9 }, // 0x66 'f'
|
||||
{ 565, 7, 10, 10, 1, -6 }, // 0x67 'g'
|
||||
{ 574, 7, 10, 9, 1, -9 }, // 0x68 'h'
|
||||
{ 583, 2, 10, 4, 1, -9 }, // 0x69 'i'
|
||||
{ 586, 4, 13, 4, -1, -9 }, // 0x6A 'j'
|
||||
{ 593, 7, 10, 8, 1, -9 }, // 0x6B 'k'
|
||||
{ 602, 1, 10, 4, 1, -9 }, // 0x6C 'l'
|
||||
{ 604, 13, 7, 15, 1, -6 }, // 0x6D 'm'
|
||||
{ 616, 7, 7, 9, 1, -6 }, // 0x6E 'n'
|
||||
{ 623, 7, 7, 9, 1, -6 }, // 0x6F 'o'
|
||||
{ 630, 8, 10, 9, 1, -6 }, // 0x70 'p'
|
||||
{ 640, 7, 10, 9, 1, -6 }, // 0x71 'q'
|
||||
{ 649, 4, 7, 6, 1, -6 }, // 0x72 'r'
|
||||
{ 653, 6, 7, 7, 0, -6 }, // 0x73 's'
|
||||
{ 659, 5, 9, 6, 0, -8 }, // 0x74 't'
|
||||
{ 665, 7, 7, 9, 1, -6 }, // 0x75 'u'
|
||||
{ 672, 8, 7, 8, 0, -6 }, // 0x76 'v'
|
||||
{ 679, 12, 7, 12, 0, -6 }, // 0x77 'w'
|
||||
{ 690, 7, 7, 7, 0, -6 }, // 0x78 'x'
|
||||
{ 697, 8, 10, 8, 0, -6 }, // 0x79 'y'
|
||||
{ 707, 6, 7, 7, 1, -6 }, // 0x7A 'z'
|
||||
{ 713, 3, 13, 5, 1, -9 }, // 0x7B '{'
|
||||
{ 718, 1, 13, 4, 2, -9 }, // 0x7C '|'
|
||||
{ 720, 4, 13, 5, 0, -9 }, // 0x7D '}'
|
||||
{ 727, 6, 2, 8, 1, -5 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Regular7pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Regular7pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Regular7pt7bGlyphs,
|
||||
0x20, 0x7E, 17 };
|
||||
|
||||
// Approx. 1401 bytes
|
||||
|
||||
#endif // MONTSERRAT7PT7B_H
|
||||
@@ -0,0 +1,210 @@
|
||||
#ifndef MONTSERRAT9PT7B_H
|
||||
#define MONTSERRAT9PT7B_H
|
||||
const uint8_t Montserrat_Regular9pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0x55, 0x55, 0x41, 0xC0, 0x99, 0x99, 0x90, 0x10, 0x82, 0x10, 0x42,
|
||||
0x08, 0x8F, 0xFE, 0x22, 0x08, 0x41, 0x08, 0x21, 0x1F, 0xF8, 0x84, 0x10,
|
||||
0x82, 0x20, 0x08, 0x04, 0x07, 0x8F, 0x7C, 0x84, 0x43, 0x20, 0xD0, 0x3C,
|
||||
0x07, 0x82, 0x61, 0x10, 0x8E, 0x4D, 0xF8, 0x10, 0x08, 0x00, 0x30, 0x26,
|
||||
0x43, 0x22, 0x11, 0x11, 0x08, 0x90, 0x44, 0x81, 0xC9, 0xC0, 0x93, 0x04,
|
||||
0x88, 0x48, 0x44, 0x42, 0x21, 0x12, 0x07, 0x00, 0x1C, 0x06, 0x40, 0x8C,
|
||||
0x11, 0x82, 0x60, 0x38, 0x0E, 0x03, 0x22, 0xC2, 0x50, 0x7A, 0x06, 0x61,
|
||||
0xE3, 0xE6, 0xF8, 0x69, 0x69, 0x24, 0x92, 0x4C, 0x93, 0x89, 0x36, 0x49,
|
||||
0x24, 0x96, 0x94, 0x11, 0xA8, 0xE1, 0xC5, 0x42, 0x00, 0x08, 0x08, 0x08,
|
||||
0xFF, 0x08, 0x08, 0x08, 0x08, 0xF6, 0x80, 0xF8, 0xF0, 0x04, 0x08, 0x10,
|
||||
0x40, 0x81, 0x04, 0x08, 0x30, 0x40, 0x83, 0x04, 0x08, 0x30, 0x40, 0x80,
|
||||
0x0C, 0x0F, 0xC6, 0x1B, 0x02, 0xC0, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x70,
|
||||
0x34, 0x09, 0x84, 0x1E, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10,
|
||||
0x1C, 0x1D, 0xC4, 0x18, 0x02, 0x00, 0x80, 0x60, 0x30, 0x18, 0x0C, 0x06,
|
||||
0x03, 0x01, 0x80, 0x7F, 0xC0, 0x7F, 0xBF, 0xC0, 0xC0, 0x40, 0x40, 0x40,
|
||||
0x3C, 0x03, 0x00, 0x80, 0x40, 0x38, 0x33, 0xE0, 0x03, 0x00, 0x40, 0x10,
|
||||
0x04, 0x01, 0x80, 0x60, 0x08, 0x42, 0x08, 0x81, 0x1F, 0xFC, 0x04, 0x00,
|
||||
0x80, 0x10, 0x3F, 0x9F, 0xC8, 0x04, 0x02, 0x03, 0x01, 0xFC, 0x03, 0x00,
|
||||
0x80, 0x40, 0x3C, 0x33, 0xF0, 0x0F, 0x1C, 0x98, 0x08, 0x0C, 0x04, 0x62,
|
||||
0xFD, 0x83, 0xC0, 0xE0, 0x50, 0x2C, 0x31, 0xF0, 0xFF, 0xFF, 0xE0, 0x50,
|
||||
0x60, 0x20, 0x10, 0x10, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x00, 0x1C,
|
||||
0x1C, 0xC4, 0x0B, 0x02, 0xC0, 0x98, 0x63, 0xE1, 0x06, 0x80, 0xA0, 0x38,
|
||||
0x0B, 0x06, 0x3F, 0x00, 0x38, 0x33, 0x20, 0x50, 0x38, 0x1C, 0x0F, 0x0A,
|
||||
0x79, 0x00, 0x80, 0xC0, 0x40, 0xCF, 0xC0, 0xF0, 0x00, 0xF0, 0xF0, 0x00,
|
||||
0xF6, 0x80, 0x01, 0x0E, 0x38, 0xC0, 0x70, 0x1C, 0x03, 0xFF, 0x00, 0x00,
|
||||
0x00, 0xFF, 0xC0, 0x70, 0x0E, 0x03, 0x07, 0x38, 0xE0, 0x1C, 0x39, 0x90,
|
||||
0x60, 0x10, 0x18, 0x08, 0x08, 0x08, 0x0C, 0x00, 0x00, 0x01, 0x80, 0xC0,
|
||||
0x03, 0xE0, 0x06, 0x0C, 0x0C, 0x01, 0x0C, 0x00, 0x44, 0x3C, 0x94, 0x21,
|
||||
0x4A, 0x20, 0x63, 0x10, 0x11, 0x88, 0x08, 0xC4, 0x04, 0x62, 0x06, 0x58,
|
||||
0x85, 0x24, 0x3C, 0xE1, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x60, 0x01, 0xC0,
|
||||
0x00, 0x02, 0x00, 0x38, 0x01, 0x40, 0x1B, 0x00, 0x88, 0x0C, 0x40, 0x41,
|
||||
0x02, 0x08, 0x20, 0x61, 0xFF, 0x18, 0x0C, 0x80, 0x2C, 0x01, 0x80, 0xFE,
|
||||
0x1F, 0xF2, 0x03, 0x40, 0x28, 0x0D, 0x01, 0x3F, 0xC4, 0x06, 0x80, 0x50,
|
||||
0x0E, 0x01, 0x40, 0x6F, 0xF8, 0x07, 0x03, 0xB9, 0x80, 0xA0, 0x0C, 0x01,
|
||||
0x00, 0x20, 0x04, 0x00, 0xC0, 0x08, 0x01, 0x80, 0x18, 0x30, 0xF8, 0xFC,
|
||||
0x0F, 0xF8, 0x80, 0x48, 0x02, 0x80, 0x38, 0x01, 0x80, 0x18, 0x01, 0x80,
|
||||
0x38, 0x02, 0x80, 0x68, 0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, 0x10, 0x08,
|
||||
0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0F, 0xF8, 0xFF, 0xFF,
|
||||
0xE0, 0x10, 0x08, 0x04, 0x03, 0xFD, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x08,
|
||||
0x00, 0x07, 0x03, 0xBD, 0x80, 0xA0, 0x0C, 0x01, 0x00, 0x20, 0x04, 0x01,
|
||||
0xC0, 0x28, 0x05, 0x80, 0x98, 0x30, 0xFC, 0x80, 0x70, 0x0E, 0x01, 0xC0,
|
||||
0x38, 0x07, 0x00, 0xFF, 0xFC, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38,
|
||||
0x06, 0xFF, 0xF8, 0x7E, 0xFC, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04,
|
||||
0x0E, 0x37, 0xC0, 0x80, 0x50, 0x12, 0x04, 0x41, 0x08, 0x41, 0x10, 0x26,
|
||||
0x05, 0xE0, 0xE6, 0x18, 0x62, 0x06, 0x40, 0x48, 0x04, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x0E,
|
||||
0x00, 0xF0, 0x07, 0x40, 0x7B, 0x02, 0xC8, 0x26, 0x61, 0x31, 0x11, 0x85,
|
||||
0x8C, 0x28, 0x60, 0x83, 0x00, 0x18, 0x00, 0x80, 0x80, 0x78, 0x0F, 0x81,
|
||||
0xD8, 0x39, 0x07, 0x10, 0xE3, 0x1C, 0x33, 0x83, 0x70, 0x2E, 0x03, 0xC0,
|
||||
0x78, 0x06, 0x07, 0x00, 0xEF, 0x18, 0x0C, 0x80, 0x2C, 0x01, 0xC0, 0x06,
|
||||
0x00, 0x30, 0x01, 0xC0, 0x0A, 0x00, 0xD8, 0x0C, 0x60, 0xC0, 0xFC, 0x00,
|
||||
0xFC, 0x3F, 0xC8, 0x0A, 0x03, 0x80, 0x60, 0x18, 0x0E, 0x06, 0xFF, 0x20,
|
||||
0x08, 0x02, 0x00, 0x80, 0x00, 0x07, 0x00, 0x77, 0x86, 0x03, 0x10, 0x04,
|
||||
0xC0, 0x1A, 0x00, 0x28, 0x00, 0xA0, 0x02, 0xC0, 0x09, 0x00, 0x66, 0x03,
|
||||
0x0C, 0x18, 0x0F, 0xC0, 0x06, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x3F, 0xC8,
|
||||
0x0A, 0x03, 0x80, 0x60, 0x18, 0x0E, 0x06, 0xFF, 0x20, 0xC8, 0x12, 0x02,
|
||||
0x80, 0xC0, 0x1E, 0x39, 0xF0, 0x10, 0x0C, 0x03, 0x00, 0xF0, 0x0E, 0x01,
|
||||
0x80, 0x40, 0x38, 0x37, 0xE0, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03,
|
||||
0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x00, 0x80, 0x60,
|
||||
0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x70, 0x1C, 0x0D,
|
||||
0x86, 0x3F, 0x00, 0xC0, 0x12, 0x00, 0x90, 0x0C, 0xC0, 0x42, 0x06, 0x18,
|
||||
0x20, 0x43, 0x03, 0x10, 0x08, 0x80, 0x6C, 0x01, 0x40, 0x0E, 0x00, 0x60,
|
||||
0x00, 0x80, 0xC0, 0x60, 0x30, 0x1C, 0x0C, 0x0D, 0x07, 0x82, 0x41, 0x20,
|
||||
0x98, 0x48, 0x62, 0x33, 0x10, 0x88, 0x44, 0x32, 0x13, 0x05, 0x86, 0x81,
|
||||
0x40, 0xA0, 0x70, 0x38, 0x08, 0x04, 0x00, 0x40, 0x26, 0x04, 0x30, 0xC1,
|
||||
0x18, 0x09, 0x00, 0xE0, 0x06, 0x00, 0xE0, 0x09, 0x01, 0x18, 0x30, 0xC6,
|
||||
0x04, 0x40, 0x20, 0x80, 0x28, 0x0D, 0x81, 0x10, 0x61, 0x08, 0x32, 0x02,
|
||||
0xC0, 0x70, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, 0xFF, 0xFF, 0xF0,
|
||||
0x18, 0x04, 0x02, 0x01, 0x80, 0xC0, 0x60, 0x10, 0x08, 0x06, 0x03, 0x00,
|
||||
0xFF, 0xC0, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x27, 0x40, 0x81, 0x01, 0x02,
|
||||
0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40, 0x80, 0x81, 0x02, 0xF3,
|
||||
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x18, 0x18, 0x14, 0x24, 0x22,
|
||||
0x42, 0x42, 0xFF, 0x80, 0x60, 0x80, 0x18, 0x7E, 0x03, 0x01, 0x01, 0x7F,
|
||||
0x81, 0x81, 0xC3, 0x7D, 0x80, 0x40, 0x20, 0x11, 0x0B, 0xF6, 0x0E, 0x03,
|
||||
0x01, 0x80, 0xC0, 0x70, 0x7C, 0x6B, 0xE0, 0x08, 0x3F, 0x41, 0xC0, 0x80,
|
||||
0x80, 0x80, 0xC0, 0x63, 0x3E, 0x00, 0x80, 0x40, 0x21, 0x17, 0xEA, 0x0F,
|
||||
0x03, 0x01, 0x80, 0xC0, 0x70, 0x2C, 0x73, 0xE8, 0x08, 0x3F, 0x10, 0x50,
|
||||
0x18, 0x0F, 0xFE, 0x01, 0x80, 0x61, 0x1F, 0x00, 0x1E, 0x40, 0x81, 0x0F,
|
||||
0xC4, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x00, 0x08, 0x1F, 0xF4, 0x1E,
|
||||
0x03, 0x80, 0xE0, 0x38, 0x0F, 0x07, 0x7F, 0xC7, 0x30, 0x08, 0x02, 0x7F,
|
||||
0x03, 0x00, 0x80, 0x40, 0x20, 0x11, 0x0B, 0xE6, 0x0A, 0x05, 0x02, 0x81,
|
||||
0xC0, 0xE0, 0x70, 0x38, 0x18, 0xC0, 0x55, 0x55, 0x40, 0x18, 0x00, 0x00,
|
||||
0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x2F, 0x20, 0x80, 0x40, 0x20, 0x10,
|
||||
0x28, 0x24, 0x22, 0x61, 0x60, 0xF8, 0x66, 0x21, 0x90, 0x48, 0x10, 0xFF,
|
||||
0xF8, 0x08, 0x11, 0x7C, 0xFB, 0x0E, 0x0C, 0x08, 0x18, 0x10, 0x30, 0x20,
|
||||
0x60, 0x40, 0xC0, 0x81, 0x81, 0x03, 0x02, 0x04, 0x08, 0x5F, 0x30, 0x50,
|
||||
0x28, 0x14, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xC0, 0x08, 0x1F, 0x90, 0x78,
|
||||
0x18, 0x0C, 0x06, 0x03, 0x81, 0x63, 0x1F, 0x00, 0x08, 0x5F, 0xB0, 0x70,
|
||||
0x18, 0x0C, 0x06, 0x03, 0x83, 0xE3, 0x5F, 0x20, 0x10, 0x08, 0x00, 0x08,
|
||||
0x3F, 0x50, 0x78, 0x18, 0x0C, 0x06, 0x03, 0x81, 0x63, 0x9F, 0x40, 0x20,
|
||||
0x10, 0x08, 0x0D, 0xF1, 0x08, 0x42, 0x10, 0x84, 0x00, 0x08, 0x7F, 0x40,
|
||||
0x40, 0x60, 0x1E, 0x03, 0x01, 0x43, 0x7E, 0x20, 0x40, 0x87, 0xE2, 0x04,
|
||||
0x08, 0x10, 0x20, 0x40, 0xC0, 0xF0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
|
||||
0x81, 0xC3, 0x7D, 0xC0, 0x90, 0x26, 0x10, 0x84, 0x33, 0x04, 0x81, 0x60,
|
||||
0x30, 0x0C, 0x00, 0xC1, 0x82, 0x41, 0x82, 0x42, 0xC6, 0x22, 0x44, 0x26,
|
||||
0x44, 0x34, 0x28, 0x14, 0x28, 0x18, 0x28, 0x08, 0x10, 0x61, 0x91, 0x85,
|
||||
0x81, 0x80, 0xC0, 0xB0, 0xC8, 0x42, 0x41, 0x80, 0xC0, 0x90, 0x26, 0x10,
|
||||
0x84, 0x33, 0x04, 0x81, 0x60, 0x30, 0x0C, 0x02, 0x00, 0x83, 0xC0, 0x60,
|
||||
0x00, 0xFE, 0x08, 0x30, 0xC1, 0x04, 0x18, 0x60, 0xFE, 0x39, 0x18, 0xC6,
|
||||
0x31, 0x8C, 0xE3, 0x18, 0xC6, 0x30, 0x87, 0xFF, 0xFF, 0xE1, 0x0C, 0x63,
|
||||
0x18, 0xC6, 0x39, 0x8C, 0x63, 0x18, 0x9C, 0x61, 0xD9, 0x8F };
|
||||
|
||||
const GFXglyph Montserrat_Regular9pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 13, 5, 1, -12 }, // 0x21 '!'
|
||||
{ 5, 4, 5, 7, 1, -12 }, // 0x22 '"'
|
||||
{ 8, 11, 13, 13, 1, -12 }, // 0x23 '#'
|
||||
{ 26, 9, 17, 11, 1, -14 }, // 0x24 '$'
|
||||
{ 46, 13, 13, 15, 1, -12 }, // 0x25 '%'
|
||||
{ 68, 11, 13, 12, 1, -12 }, // 0x26 '&'
|
||||
{ 86, 1, 5, 4, 1, -12 }, // 0x27 '''
|
||||
{ 87, 3, 16, 6, 2, -12 }, // 0x28 '('
|
||||
{ 93, 3, 16, 6, 1, -12 }, // 0x29 ')'
|
||||
{ 99, 7, 6, 7, 0, -12 }, // 0x2A '*'
|
||||
{ 105, 8, 8, 10, 1, -9 }, // 0x2B '+'
|
||||
{ 113, 2, 5, 4, 1, -1 }, // 0x2C ','
|
||||
{ 115, 5, 1, 7, 1, -4 }, // 0x2D '-'
|
||||
{ 116, 2, 2, 4, 1, -1 }, // 0x2E '.'
|
||||
{ 117, 7, 17, 6, 0, -14 }, // 0x2F '/'
|
||||
{ 132, 10, 13, 12, 1, -12 }, // 0x30 '0'
|
||||
{ 149, 4, 13, 7, 0, -12 }, // 0x31 '1'
|
||||
{ 156, 10, 13, 10, 0, -12 }, // 0x32 '2'
|
||||
{ 173, 9, 13, 10, 0, -12 }, // 0x33 '3'
|
||||
{ 188, 11, 13, 12, 1, -12 }, // 0x34 '4'
|
||||
{ 206, 9, 13, 10, 0, -12 }, // 0x35 '5'
|
||||
{ 221, 9, 13, 11, 1, -12 }, // 0x36 '6'
|
||||
{ 236, 9, 13, 11, 1, -12 }, // 0x37 '7'
|
||||
{ 251, 10, 13, 11, 1, -12 }, // 0x38 '8'
|
||||
{ 268, 9, 13, 11, 1, -12 }, // 0x39 '9'
|
||||
{ 283, 2, 10, 4, 1, -9 }, // 0x3A ':'
|
||||
{ 286, 2, 13, 4, 1, -9 }, // 0x3B ';'
|
||||
{ 290, 8, 7, 10, 1, -9 }, // 0x3C '<'
|
||||
{ 297, 8, 5, 10, 1, -8 }, // 0x3D '='
|
||||
{ 302, 8, 7, 10, 1, -9 }, // 0x3E '>'
|
||||
{ 309, 9, 13, 10, 0, -12 }, // 0x3F '?'
|
||||
{ 324, 17, 17, 19, 1, -12 }, // 0x40 '@'
|
||||
{ 361, 13, 13, 13, 0, -12 }, // 0x41 'A'
|
||||
{ 383, 11, 13, 14, 2, -12 }, // 0x42 'B'
|
||||
{ 401, 11, 13, 13, 1, -12 }, // 0x43 'C'
|
||||
{ 419, 12, 13, 15, 2, -12 }, // 0x44 'D'
|
||||
{ 439, 9, 13, 12, 2, -12 }, // 0x45 'E'
|
||||
{ 454, 9, 13, 11, 2, -12 }, // 0x46 'F'
|
||||
{ 469, 11, 13, 14, 1, -12 }, // 0x47 'G'
|
||||
{ 487, 11, 13, 15, 2, -12 }, // 0x48 'H'
|
||||
{ 505, 1, 13, 5, 2, -12 }, // 0x49 'I'
|
||||
{ 507, 7, 13, 9, 0, -12 }, // 0x4A 'J'
|
||||
{ 519, 11, 13, 13, 2, -12 }, // 0x4B 'K'
|
||||
{ 537, 8, 13, 11, 2, -12 }, // 0x4C 'L'
|
||||
{ 550, 13, 13, 17, 2, -12 }, // 0x4D 'M'
|
||||
{ 572, 11, 13, 15, 2, -12 }, // 0x4E 'N'
|
||||
{ 590, 13, 13, 15, 1, -12 }, // 0x4F 'O'
|
||||
{ 612, 10, 13, 13, 2, -12 }, // 0x50 'P'
|
||||
{ 629, 14, 16, 15, 1, -12 }, // 0x51 'Q'
|
||||
{ 657, 10, 13, 13, 2, -12 }, // 0x52 'R'
|
||||
{ 674, 9, 13, 11, 1, -12 }, // 0x53 'S'
|
||||
{ 689, 10, 13, 10, 0, -12 }, // 0x54 'T'
|
||||
{ 706, 10, 13, 14, 2, -12 }, // 0x55 'U'
|
||||
{ 723, 13, 13, 13, 0, -12 }, // 0x56 'V'
|
||||
{ 745, 18, 13, 20, 1, -12 }, // 0x57 'W'
|
||||
{ 775, 12, 13, 12, 0, -12 }, // 0x58 'X'
|
||||
{ 795, 11, 13, 11, 0, -12 }, // 0x59 'Y'
|
||||
{ 813, 10, 13, 12, 1, -12 }, // 0x5A 'Z'
|
||||
{ 830, 3, 16, 6, 2, -12 }, // 0x5B '['
|
||||
{ 836, 7, 17, 6, -1, -14 }, // 0x5C '\'
|
||||
{ 851, 4, 16, 6, 0, -12 }, // 0x5D ']'
|
||||
{ 859, 8, 7, 10, 1, -9 }, // 0x5E '^'
|
||||
{ 866, 9, 1, 9, 0, 1 }, // 0x5F '_'
|
||||
{ 868, 5, 2, 11, 2, -12 }, // 0x60 '`'
|
||||
{ 870, 8, 10, 11, 1, -9 }, // 0x61 'a'
|
||||
{ 880, 9, 13, 12, 2, -12 }, // 0x62 'b'
|
||||
{ 895, 8, 10, 10, 1, -9 }, // 0x63 'c'
|
||||
{ 905, 9, 13, 12, 1, -12 }, // 0x64 'd'
|
||||
{ 920, 9, 10, 11, 1, -9 }, // 0x65 'e'
|
||||
{ 932, 7, 13, 6, 0, -12 }, // 0x66 'f'
|
||||
{ 944, 10, 14, 12, 1, -9 }, // 0x67 'g'
|
||||
{ 962, 9, 13, 12, 2, -12 }, // 0x68 'h'
|
||||
{ 977, 2, 13, 5, 1, -12 }, // 0x69 'i'
|
||||
{ 981, 5, 17, 5, -2, -12 }, // 0x6A 'j'
|
||||
{ 992, 9, 13, 11, 2, -12 }, // 0x6B 'k'
|
||||
{ 1007, 1, 13, 5, 2, -12 }, // 0x6C 'l'
|
||||
{ 1009, 15, 10, 19, 2, -9 }, // 0x6D 'm'
|
||||
{ 1028, 9, 10, 12, 2, -9 }, // 0x6E 'n'
|
||||
{ 1040, 9, 10, 11, 1, -9 }, // 0x6F 'o'
|
||||
{ 1052, 9, 13, 12, 2, -9 }, // 0x70 'p'
|
||||
{ 1067, 9, 13, 12, 1, -9 }, // 0x71 'q'
|
||||
{ 1082, 5, 10, 7, 2, -9 }, // 0x72 'r'
|
||||
{ 1089, 8, 10, 9, 0, -9 }, // 0x73 's'
|
||||
{ 1099, 7, 12, 7, 0, -11 }, // 0x74 't'
|
||||
{ 1110, 8, 9, 12, 2, -8 }, // 0x75 'u'
|
||||
{ 1119, 10, 9, 10, 0, -8 }, // 0x76 'v'
|
||||
{ 1131, 16, 9, 16, 0, -8 }, // 0x77 'w'
|
||||
{ 1149, 9, 9, 10, 0, -8 }, // 0x78 'x'
|
||||
{ 1160, 10, 13, 10, 0, -8 }, // 0x79 'y'
|
||||
{ 1177, 7, 9, 9, 1, -8 }, // 0x7A 'z'
|
||||
{ 1185, 5, 16, 6, 1, -12 }, // 0x7B '{'
|
||||
{ 1195, 1, 16, 5, 2, -12 }, // 0x7C '|'
|
||||
{ 1197, 5, 16, 6, 0, -12 }, // 0x7D '}'
|
||||
{ 1207, 8, 3, 10, 1, -7 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Regular9pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Regular9pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Regular9pt7bGlyphs,
|
||||
0x20, 0x7E, 21 };
|
||||
|
||||
// Approx. 1882 bytes
|
||||
|
||||
#endif // MONTSERRAT9PT7B_H
|
||||
@@ -0,0 +1,310 @@
|
||||
#ifndef MONTSERRATBOLD12PT7B_H
|
||||
#define MONTSERRATBOLD12PT7B_H
|
||||
const uint8_t Montserrat_Bold12pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xF7, 0x39, 0xCE, 0x73, 0x9C, 0x00, 0x3B, 0xFF, 0x70,
|
||||
0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x07, 0x1C, 0x03, 0x8E, 0x01,
|
||||
0xC7, 0x00, 0xE3, 0x87, 0xFF, 0xFB, 0xFF, 0xFD, 0xFF, 0xFE, 0x1C, 0x30,
|
||||
0x0E, 0x38, 0x07, 0x1C, 0x03, 0x8E, 0x1F, 0xFF, 0xEF, 0xFF, 0xF0, 0x61,
|
||||
0xC0, 0x70, 0xC0, 0x38, 0x60, 0x1C, 0x70, 0x00, 0x03, 0x00, 0x0C, 0x00,
|
||||
0x30, 0x07, 0xF8, 0x3F, 0xF9, 0xFF, 0xCF, 0xB3, 0x3C, 0xC0, 0xF3, 0x03,
|
||||
0xEC, 0x07, 0xF8, 0x0F, 0xFC, 0x1F, 0xF8, 0x0F, 0xE0, 0x37, 0xC0, 0xCF,
|
||||
0xE3, 0x7B, 0xFF, 0xEF, 0xFF, 0x0F, 0xF8, 0x03, 0x00, 0x0C, 0x00, 0x30,
|
||||
0x00, 0x3C, 0x03, 0x0F, 0xC0, 0xE3, 0x9C, 0x38, 0x63, 0x86, 0x0C, 0x31,
|
||||
0xC1, 0x8E, 0x70, 0x31, 0xCC, 0x07, 0xF3, 0x80, 0x7C, 0xE7, 0x80, 0x39,
|
||||
0xF8, 0x07, 0x73, 0x81, 0xCE, 0x30, 0x71, 0x86, 0x0E, 0x38, 0xC3, 0x87,
|
||||
0x38, 0xE0, 0x7F, 0x1C, 0x07, 0xC0, 0x0F, 0xC0, 0x1F, 0xE0, 0x3F, 0xF0,
|
||||
0x38, 0x70, 0x38, 0x70, 0x3C, 0xF0, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F, 0x88,
|
||||
0x7F, 0xCE, 0xF1, 0xEE, 0xF0, 0xFE, 0xF0, 0x7C, 0xF0, 0x7C, 0xFF, 0xFE,
|
||||
0x7F, 0xFE, 0x1F, 0xC6, 0xFF, 0xFF, 0xF8, 0x1C, 0xF7, 0x9E, 0x73, 0xCF,
|
||||
0x3C, 0xF3, 0x8E, 0x38, 0xE3, 0x8F, 0x3C, 0xF3, 0xC7, 0x1E, 0x38, 0xF1,
|
||||
0xC0, 0xF0, 0xF1, 0xE1, 0xE3, 0xC7, 0x87, 0x0F, 0x1E, 0x3C, 0x78, 0xF1,
|
||||
0xE3, 0xC7, 0x8F, 0x1C, 0x78, 0xF1, 0xC7, 0x8F, 0x3C, 0x00, 0x0C, 0x03,
|
||||
0x06, 0xDF, 0xFF, 0x3F, 0x0F, 0xEF, 0xFD, 0xB2, 0x0C, 0x03, 0x00, 0x07,
|
||||
0x00, 0x70, 0x07, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x07,
|
||||
0x00, 0x70, 0x07, 0x00, 0xFF, 0xFF, 0x76, 0xEE, 0xFF, 0xFF, 0xF8, 0xFF,
|
||||
0xFF, 0x00, 0xE0, 0x1C, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C,
|
||||
0x07, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C,
|
||||
0x07, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x00, 0x0F, 0xC0, 0x7F, 0xC3,
|
||||
0xFF, 0x9F, 0x3E, 0x78, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F,
|
||||
0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0x78, 0x3D, 0xF1, 0xE3, 0xFF, 0x8F, 0xFC,
|
||||
0x0F, 0xC0, 0xFF, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38,
|
||||
0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1F, 0xC3, 0xFF, 0x3F, 0xFC, 0xF1, 0xF2,
|
||||
0x07, 0x80, 0x3C, 0x01, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F,
|
||||
0x01, 0xF0, 0x1F, 0x01, 0xFF, 0xEF, 0xFF, 0x7F, 0xF8, 0x7F, 0xFB, 0xFF,
|
||||
0xDF, 0xFE, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF8, 0x07, 0xF0,
|
||||
0x3F, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0xB0, 0x7F, 0xFF, 0xFF, 0xFE, 0x3F,
|
||||
0xC0, 0x01, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0,
|
||||
0x07, 0x80, 0x1E, 0x3C, 0x7C, 0x78, 0xF0, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xE0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x3F, 0xF8, 0xFF,
|
||||
0xE3, 0xFF, 0x8F, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0xF8, 0x3F,
|
||||
0xF9, 0xFF, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3D, 0xC1, 0xE7, 0xFF, 0xBF,
|
||||
0xFC, 0x3F, 0xE0, 0x07, 0xF0, 0x7F, 0xE3, 0xFF, 0x1F, 0x04, 0x78, 0x03,
|
||||
0xC0, 0x0F, 0x10, 0x3F, 0xFC, 0xFF, 0xFB, 0xFB, 0xEF, 0x83, 0xFC, 0x0F,
|
||||
0xF0, 0x3D, 0xE1, 0xF7, 0xFF, 0x8F, 0xFC, 0x0F, 0xE0, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xFE, 0x0F, 0x70, 0x78, 0x07, 0x80, 0x3C, 0x03, 0xE0,
|
||||
0x1E, 0x01, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x3C, 0x03, 0xE0, 0x1E,
|
||||
0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x7B, 0xC1, 0xE7,
|
||||
0x87, 0x8F, 0xFC, 0x3F, 0xF1, 0xFF, 0xEF, 0x07, 0xFC, 0x0F, 0xF0, 0x3F,
|
||||
0xC1, 0xFF, 0xFF, 0x9F, 0xFC, 0x1F, 0xE0, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF,
|
||||
0x9E, 0x1E, 0x70, 0x3F, 0xC0, 0xF7, 0x83, 0xDF, 0x1F, 0x7F, 0xFC, 0xFF,
|
||||
0xF0, 0xF3, 0xC0, 0x0F, 0x00, 0x7C, 0x83, 0xE3, 0xFF, 0x1F, 0xF8, 0x3F,
|
||||
0xC0, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x0F, 0xFF, 0xF7, 0x6E, 0xE0, 0x00, 0x30, 0x1F, 0x07, 0xF3, 0xFC, 0xFE,
|
||||
0x0F, 0x00, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0x00, 0x70, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xE0, 0x0F, 0x80, 0xFF, 0x01, 0xFE, 0x07, 0xF0, 0x0F, 0x03, 0xF1,
|
||||
0xFE, 0xFF, 0x0F, 0xC0, 0xE0, 0x00, 0x00, 0x1F, 0xC3, 0xFF, 0xBF, 0xFC,
|
||||
0xE1, 0xF2, 0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0xE0, 0x1E, 0x01,
|
||||
0xE0, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x00,
|
||||
0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x3E, 0x0F, 0x80, 0xF0, 0x03, 0x83, 0x80,
|
||||
0x03, 0x8E, 0x1F, 0x7B, 0x9C, 0x7F, 0xF3, 0x71, 0xFF, 0xE6, 0xE7, 0x87,
|
||||
0xCF, 0xCF, 0x07, 0x9F, 0x9C, 0x0F, 0x3F, 0x38, 0x1E, 0x7E, 0x78, 0x3C,
|
||||
0xFC, 0xF0, 0xF9, 0xB8, 0xFF, 0xFF, 0x38, 0xFE, 0xFC, 0x70, 0xF8, 0xF0,
|
||||
0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7E, 0x3C, 0x00, 0x7F, 0xF8, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xFC,
|
||||
0x00, 0x7F, 0x80, 0x0F, 0x70, 0x03, 0xCF, 0x00, 0x78, 0xE0, 0x0E, 0x1E,
|
||||
0x03, 0xC3, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0x83, 0xFF, 0xF8, 0xF0, 0x0F,
|
||||
0x1E, 0x00, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xC0, 0xFF, 0xE1, 0xFF, 0xF3,
|
||||
0xFF, 0xF7, 0x81, 0xEF, 0x01, 0xFE, 0x03, 0xBC, 0x0F, 0x7F, 0xFC, 0xFF,
|
||||
0xF9, 0xFF, 0xFB, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xFE, 0xFF, 0xF0, 0x03, 0xF8, 0x0F, 0xFC, 0x3F, 0xFF, 0x3F, 0x1E,
|
||||
0x7C, 0x04, 0xF8, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00,
|
||||
0xF0, 0x00, 0xF8, 0x00, 0x78, 0x04, 0x7E, 0x1E, 0x3F, 0xFF, 0x1F, 0xFE,
|
||||
0x07, 0xF8, 0xFF, 0xC0, 0x7F, 0xFC, 0x3F, 0xFF, 0x1E, 0x1F, 0xCF, 0x01,
|
||||
0xF7, 0x80, 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC,
|
||||
0x01, 0xFE, 0x01, 0xEF, 0x01, 0xF7, 0x83, 0xF3, 0xFF, 0xF9, 0xFF, 0xF0,
|
||||
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x78,
|
||||
0x03, 0xC0, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0xBC, 0x01, 0xE0, 0x0F, 0x00,
|
||||
0x78, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0xF7, 0xFF, 0xBF,
|
||||
0xFD, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x00, 0x03,
|
||||
0xF8, 0x0F, 0xFE, 0x3F, 0xFF, 0x3F, 0x1E, 0x7C, 0x04, 0xF8, 0x00, 0xF0,
|
||||
0x00, 0xF0, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0x78,
|
||||
0x0F, 0x7E, 0x0F, 0x3F, 0xFF, 0x1F, 0xFE, 0x07, 0xF8, 0xF0, 0x0F, 0xE0,
|
||||
0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC,
|
||||
0x03, 0xF8, 0x07, 0xF0, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x7F, 0xEF, 0xFD, 0xFF, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78,
|
||||
0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0xC3, 0xFF, 0xF7, 0xFE,
|
||||
0x3F, 0x80, 0xF0, 0x1E, 0xF0, 0x3C, 0xF0, 0x78, 0xF0, 0xF8, 0xF1, 0xF0,
|
||||
0xF3, 0xE0, 0xF7, 0xC0, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0,
|
||||
0xF9, 0xF0, 0xF0, 0xF0, 0xF0, 0x78, 0xF0, 0x7C, 0xF0, 0x3E, 0xF0, 0x1F,
|
||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
|
||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0xE0, 0x01, 0xFE, 0x00, 0x3F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF,
|
||||
0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x83, 0xFF, 0xF8, 0xFF, 0xFF, 0x1D, 0xFE,
|
||||
0xF7, 0xBF, 0xCE, 0xE7, 0xF9, 0xFC, 0xFF, 0x1F, 0x1F, 0xE1, 0xC3, 0xFC,
|
||||
0x38, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xE0, 0xE0, 0x0F, 0xE0, 0x1F, 0xE0,
|
||||
0x3F, 0xE0, 0x7F, 0xE0, 0xFF, 0xE1, 0xFF, 0xC3, 0xFF, 0xC7, 0xF7, 0xCF,
|
||||
0xE7, 0xDF, 0xC7, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x0F, 0xFC, 0x0F, 0xF8,
|
||||
0x0F, 0xF0, 0x0E, 0x03, 0xF8, 0x03, 0xFF, 0x83, 0xFF, 0xF0, 0xFC, 0x7E,
|
||||
0x7C, 0x07, 0xBE, 0x01, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC,
|
||||
0x00, 0xFF, 0x00, 0x3F, 0xE0, 0x0F, 0x78, 0x07, 0x9F, 0x87, 0xE3, 0xFF,
|
||||
0xF0, 0x7F, 0xF8, 0x07, 0xF8, 0x00, 0xFF, 0xC1, 0xFF, 0xE3, 0xFF, 0xE7,
|
||||
0x87, 0xEF, 0x03, 0xDE, 0x03, 0xFC, 0x07, 0xF8, 0x1E, 0xF0, 0x3D, 0xFF,
|
||||
0xFB, 0xFF, 0xE7, 0xFF, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00,
|
||||
0xF0, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0xFF, 0xFC, 0x1F, 0x8F, 0xC7,
|
||||
0xC0, 0x79, 0xF0, 0x0F, 0xBC, 0x00, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xDE,
|
||||
0x00, 0x7B, 0xC0, 0x0F, 0x7C, 0x01, 0xE7, 0x80, 0x78, 0xFC, 0x3F, 0x0F,
|
||||
0xFF, 0xC0, 0xFF, 0xF0, 0x07, 0xF8, 0x00, 0x1F, 0x18, 0x01, 0xFF, 0x80,
|
||||
0x1F, 0xE0, 0x00, 0xF8, 0xFF, 0x81, 0xFF, 0xE3, 0xFF, 0xE7, 0x87, 0xEF,
|
||||
0x03, 0xDE, 0x03, 0xFC, 0x07, 0xF8, 0x1E, 0xF0, 0x3D, 0xFF, 0xFB, 0xFF,
|
||||
0xE7, 0xFF, 0x0F, 0x0F, 0x1E, 0x1E, 0x3C, 0x1E, 0x78, 0x1E, 0xF0, 0x3E,
|
||||
0x1F, 0xE0, 0xFF, 0xE7, 0xFF, 0x3E, 0x0C, 0xF0, 0x03, 0xC0, 0x0F, 0x80,
|
||||
0x1F, 0xE0, 0x3F, 0xF0, 0x7F, 0xE0, 0x1F, 0x80, 0x1F, 0x00, 0x3F, 0x81,
|
||||
0xEF, 0xFF, 0xBF, 0xFC, 0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||
0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F,
|
||||
0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0,
|
||||
0x07, 0x80, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE,
|
||||
0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80,
|
||||
0xFF, 0x01, 0xEF, 0x0F, 0x9F, 0xFF, 0x1F, 0xFC, 0x0F, 0xE0, 0xF0, 0x03,
|
||||
0xFE, 0x00, 0xF7, 0x80, 0x79, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x03, 0xC3,
|
||||
0xE0, 0xE0, 0x78, 0x78, 0x1F, 0x1E, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x1F,
|
||||
0xE0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x01, 0xE0,
|
||||
0x00, 0xF0, 0x1E, 0x01, 0xFC, 0x07, 0x80, 0xFF, 0x01, 0xF0, 0x3D, 0xE0,
|
||||
0xFC, 0x0E, 0x78, 0x3F, 0x07, 0x9E, 0x0F, 0xE1, 0xE3, 0xC7, 0xF8, 0x70,
|
||||
0xF1, 0xCE, 0x3C, 0x3C, 0x73, 0xCF, 0x07, 0xBC, 0xF3, 0x81, 0xEE, 0x1D,
|
||||
0xE0, 0x7F, 0x87, 0xF8, 0x0F, 0xE1, 0xFC, 0x03, 0xF0, 0x3F, 0x00, 0xFC,
|
||||
0x0F, 0xC0, 0x1F, 0x03, 0xE0, 0x07, 0x80, 0x78, 0x00, 0x78, 0x0F, 0x3E,
|
||||
0x07, 0x8F, 0x07, 0x83, 0xC7, 0x81, 0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xC0,
|
||||
0x07, 0xC0, 0x03, 0xE0, 0x03, 0xF8, 0x01, 0xFC, 0x01, 0xEF, 0x01, 0xF7,
|
||||
0xC0, 0xF1, 0xF0, 0xF0, 0x78, 0xF8, 0x1E, 0xF8, 0x0F, 0x80, 0xF0, 0x07,
|
||||
0x7C, 0x07, 0x9E, 0x07, 0x87, 0x83, 0xC3, 0xC3, 0xC0, 0xF1, 0xC0, 0x7D,
|
||||
0xE0, 0x1F, 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00,
|
||||
0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0xFF,
|
||||
0xFD, 0xFF, 0xFB, 0xFF, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x78,
|
||||
0x01, 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xC0, 0x0F,
|
||||
0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x8F, 0x1E,
|
||||
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7,
|
||||
0x8F, 0xFF, 0xFF, 0x80, 0xF0, 0x0E, 0x01, 0xC0, 0x3C, 0x03, 0x80, 0x70,
|
||||
0x0F, 0x00, 0xE0, 0x1C, 0x03, 0xC0, 0x38, 0x07, 0x00, 0xF0, 0x0E, 0x01,
|
||||
0xC0, 0x3C, 0x03, 0x80, 0x78, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0xFF,
|
||||
0xFF, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7,
|
||||
0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0x00, 0xF8, 0x1F,
|
||||
0x81, 0xD8, 0x19, 0xC3, 0x9C, 0x38, 0xE7, 0x0E, 0x70, 0x7E, 0x07, 0xFF,
|
||||
0xFF, 0xFF, 0x78, 0x78, 0x78, 0x3F, 0x8F, 0xFE, 0x7F, 0xE6, 0x0F, 0x00,
|
||||
0xF0, 0xFF, 0x7F, 0xFF, 0xFF, 0xF0, 0xFF, 0x0F, 0xFB, 0xF7, 0xFF, 0x3F,
|
||||
0x70, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x9F, 0x0F,
|
||||
0xFF, 0x3F, 0xFE, 0xF8, 0xFB, 0xC1, 0xFF, 0x03, 0xF8, 0x0F, 0xF0, 0x3F,
|
||||
0xC0, 0xFF, 0x87, 0xBF, 0xFE, 0xFF, 0xF3, 0xBF, 0x00, 0x0F, 0xC1, 0xFF,
|
||||
0x9F, 0xFD, 0xF0, 0xEF, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
|
||||
0xC3, 0x9F, 0xFC, 0x7F, 0xE0, 0xFC, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x03,
|
||||
0xC0, 0x0F, 0x00, 0x3C, 0x7E, 0xF3, 0xFF, 0xDF, 0xFF, 0xF8, 0x7F, 0xC0,
|
||||
0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x87, 0xDF, 0xFF, 0x3F,
|
||||
0xFC, 0x7E, 0xF0, 0x0F, 0xC1, 0xFF, 0x1F, 0xFD, 0xF0, 0xFF, 0x03, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0xC1, 0x1F, 0xFC, 0x7F, 0xE0, 0xFE,
|
||||
0x00, 0x07, 0xC7, 0xF1, 0xF8, 0xF0, 0x3C, 0x3F, 0xEF, 0xFB, 0xFE, 0x3C,
|
||||
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x00,
|
||||
0x1F, 0xBC, 0xFF, 0xF7, 0xFF, 0xFE, 0x1F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03,
|
||||
0xFC, 0x0F, 0xF8, 0x7D, 0xFF, 0xF7, 0xFF, 0xC7, 0xEF, 0x00, 0x3C, 0x00,
|
||||
0xF7, 0x07, 0x9F, 0xFE, 0x7F, 0xF0, 0x3E, 0x00, 0xE0, 0x07, 0x00, 0x38,
|
||||
0x01, 0xC0, 0x0E, 0x00, 0x73, 0xE3, 0xFF, 0xDF, 0xFE, 0xF8, 0xFF, 0x83,
|
||||
0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F,
|
||||
0x03, 0xC0, 0x77, 0xBF, 0xE0, 0x01, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE,
|
||||
0x73, 0x9C, 0x07, 0x07, 0x83, 0xE1, 0xE0, 0x00, 0x00, 0x3C, 0x1E, 0x0F,
|
||||
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1,
|
||||
0xE1, 0xE7, 0xF3, 0xF0, 0xF0, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00,
|
||||
0xE0, 0x03, 0x83, 0xEE, 0x1F, 0x38, 0xF8, 0xE7, 0xC3, 0xBE, 0x0F, 0xF0,
|
||||
0x3F, 0xE0, 0xFF, 0xC3, 0xEF, 0x0F, 0x1E, 0x38, 0x7C, 0xE0, 0xFB, 0x81,
|
||||
0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE7, 0xC3, 0xE3, 0xFF,
|
||||
0xBF, 0xCF, 0xFF, 0xFF, 0xBE, 0x3F, 0x1E, 0xF0, 0xF8, 0x7B, 0xC1, 0xE0,
|
||||
0xFE, 0x07, 0x83, 0xF8, 0x1E, 0x0F, 0xE0, 0x78, 0x3F, 0x81, 0xE0, 0xFE,
|
||||
0x07, 0x83, 0xF8, 0x1E, 0x0F, 0xE0, 0x78, 0x3C, 0xE7, 0xC7, 0xFF, 0xBF,
|
||||
0xFD, 0xF1, 0xFF, 0x07, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03,
|
||||
0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0x80, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0xBE,
|
||||
0x1E, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xE1, 0xE7,
|
||||
0xFF, 0x8F, 0xFC, 0x0F, 0xC0, 0xE7, 0xC3, 0xFF, 0xCF, 0xFF, 0xBE, 0x3E,
|
||||
0xF0, 0x7F, 0xC0, 0xFE, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xE1, 0xEF, 0xFF,
|
||||
0xBF, 0xFC, 0xE7, 0xC3, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80,
|
||||
0x00, 0x1F, 0xBC, 0xFF, 0xF7, 0xFF, 0xFE, 0x1F, 0xF0, 0x3F, 0xC0, 0xFF,
|
||||
0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xE1, 0xF7, 0xFF, 0xCF, 0xFF, 0x1F, 0xBC,
|
||||
0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0xE7, 0xEF, 0xFF,
|
||||
0xFC, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x1F, 0xE3,
|
||||
0xFF, 0x7F, 0xE7, 0x82, 0x78, 0x07, 0xF8, 0x3F, 0xE1, 0xFF, 0x00, 0xF0,
|
||||
0x07, 0x7F, 0xF7, 0xFE, 0x3F, 0xC0, 0x3C, 0x0F, 0x03, 0xC3, 0xFE, 0xFF,
|
||||
0xBF, 0xE3, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0xE1,
|
||||
0xFC, 0x3F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F,
|
||||
0x81, 0xFC, 0x0F, 0xF0, 0x7F, 0x87, 0xFF, 0xFE, 0xFF, 0xF3, 0xF7, 0x80,
|
||||
0xF0, 0x1D, 0xE0, 0x79, 0xE0, 0xF3, 0xC3, 0xC3, 0x87, 0x87, 0x8E, 0x0F,
|
||||
0x3C, 0x0F, 0x70, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F, 0x00, 0x3E, 0x00, 0x78,
|
||||
0x00, 0xF0, 0x38, 0x1D, 0xC1, 0xE0, 0x77, 0x07, 0xC3, 0xDE, 0x1F, 0x0E,
|
||||
0x38, 0xFC, 0x38, 0xE3, 0xF9, 0xE3, 0xDE, 0xE7, 0x07, 0x73, 0xFC, 0x1D,
|
||||
0xC7, 0xE0, 0x7F, 0x1F, 0x80, 0xF8, 0x7E, 0x03, 0xE0, 0xF0, 0x0F, 0x03,
|
||||
0xC0, 0x78, 0x3D, 0xE1, 0xE3, 0xCF, 0x07, 0xF8, 0x0F, 0xE0, 0x3F, 0x00,
|
||||
0x78, 0x03, 0xF0, 0x0F, 0xE0, 0x7F, 0xC3, 0xCF, 0x1E, 0x1E, 0xF8, 0x3C,
|
||||
0xF0, 0x1D, 0xE0, 0x79, 0xE0, 0xF3, 0xC1, 0xC3, 0xC7, 0x87, 0x8E, 0x07,
|
||||
0x3C, 0x0F, 0x70, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F, 0x00, 0x3E, 0x00, 0x78,
|
||||
0x00, 0xF0, 0x13, 0xC0, 0x7F, 0x80, 0xFE, 0x00, 0xF0, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x1F, 0x3F, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||
0x3C, 0x3C, 0xF8, 0xF0, 0xFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3E,
|
||||
0x3F, 0x1F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||
0xF0, 0xF8, 0xFC, 0x3C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x0F,
|
||||
0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0x7C, 0xFC, 0xF8, 0xE0, 0x38,
|
||||
0x37, 0xE3, 0x7F, 0xFE, 0x7E, 0xE1, 0xC0 };
|
||||
|
||||
const GFXglyph Montserrat_Bold12pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 5, 17, 7, 1, -16 }, // 0x21 '!'
|
||||
{ 12, 8, 7, 10, 1, -16 }, // 0x22 '"'
|
||||
{ 19, 17, 17, 17, 0, -16 }, // 0x23 '#'
|
||||
{ 56, 14, 23, 15, 1, -19 }, // 0x24 '$'
|
||||
{ 97, 19, 17, 21, 1, -16 }, // 0x25 '%'
|
||||
{ 138, 16, 17, 17, 1, -16 }, // 0x26 '&'
|
||||
{ 172, 3, 7, 6, 1, -16 }, // 0x27 '''
|
||||
{ 175, 6, 23, 9, 2, -17 }, // 0x28 '('
|
||||
{ 193, 7, 23, 9, 0, -17 }, // 0x29 ')'
|
||||
{ 214, 10, 10, 10, 0, -17 }, // 0x2A '*'
|
||||
{ 227, 12, 11, 14, 1, -13 }, // 0x2B '+'
|
||||
{ 244, 4, 8, 6, 1, -3 }, // 0x2C ','
|
||||
{ 248, 7, 3, 9, 1, -7 }, // 0x2D '-'
|
||||
{ 251, 4, 4, 6, 1, -3 }, // 0x2E '.'
|
||||
{ 253, 11, 22, 9, -1, -19 }, // 0x2F '/'
|
||||
{ 284, 14, 17, 16, 1, -16 }, // 0x30 '0'
|
||||
{ 314, 7, 17, 9, 0, -16 }, // 0x31 '1'
|
||||
{ 329, 13, 17, 14, 0, -16 }, // 0x32 '2'
|
||||
{ 357, 13, 17, 14, 0, -16 }, // 0x33 '3'
|
||||
{ 385, 15, 17, 17, 1, -16 }, // 0x34 '4'
|
||||
{ 417, 14, 17, 14, 0, -16 }, // 0x35 '5'
|
||||
{ 447, 14, 17, 15, 1, -16 }, // 0x36 '6'
|
||||
{ 477, 13, 17, 15, 1, -16 }, // 0x37 '7'
|
||||
{ 505, 14, 17, 16, 1, -16 }, // 0x38 '8'
|
||||
{ 535, 14, 17, 15, 0, -16 }, // 0x39 '9'
|
||||
{ 565, 4, 13, 6, 1, -12 }, // 0x3A ':'
|
||||
{ 572, 4, 17, 6, 1, -12 }, // 0x3B ';'
|
||||
{ 581, 12, 12, 14, 1, -13 }, // 0x3C '<'
|
||||
{ 599, 12, 9, 14, 1, -12 }, // 0x3D '='
|
||||
{ 613, 12, 12, 14, 1, -13 }, // 0x3E '>'
|
||||
{ 631, 13, 17, 14, 0, -16 }, // 0x3F '?'
|
||||
{ 659, 23, 22, 25, 1, -16 }, // 0x40 '@'
|
||||
{ 723, 19, 17, 18, 0, -16 }, // 0x41 'A'
|
||||
{ 764, 15, 17, 18, 2, -16 }, // 0x42 'B'
|
||||
{ 796, 16, 17, 17, 1, -16 }, // 0x43 'C'
|
||||
{ 830, 17, 17, 20, 2, -16 }, // 0x44 'D'
|
||||
{ 867, 13, 17, 16, 2, -16 }, // 0x45 'E'
|
||||
{ 895, 13, 17, 15, 2, -16 }, // 0x46 'F'
|
||||
{ 923, 16, 17, 19, 1, -16 }, // 0x47 'G'
|
||||
{ 957, 15, 17, 19, 2, -16 }, // 0x48 'H'
|
||||
{ 989, 4, 17, 8, 2, -16 }, // 0x49 'I'
|
||||
{ 998, 11, 17, 13, 0, -16 }, // 0x4A 'J'
|
||||
{ 1022, 16, 17, 18, 2, -16 }, // 0x4B 'K'
|
||||
{ 1056, 12, 17, 15, 2, -16 }, // 0x4C 'L'
|
||||
{ 1082, 19, 17, 23, 2, -16 }, // 0x4D 'M'
|
||||
{ 1123, 15, 17, 19, 2, -16 }, // 0x4E 'N'
|
||||
{ 1155, 18, 17, 20, 1, -16 }, // 0x4F 'O'
|
||||
{ 1194, 15, 17, 18, 2, -16 }, // 0x50 'P'
|
||||
{ 1226, 19, 21, 20, 1, -16 }, // 0x51 'Q'
|
||||
{ 1276, 15, 17, 18, 2, -16 }, // 0x52 'R'
|
||||
{ 1308, 14, 17, 15, 1, -16 }, // 0x53 'S'
|
||||
{ 1338, 15, 17, 15, 0, -16 }, // 0x54 'T'
|
||||
{ 1370, 15, 17, 19, 2, -16 }, // 0x55 'U'
|
||||
{ 1402, 18, 17, 18, 0, -16 }, // 0x56 'V'
|
||||
{ 1441, 26, 17, 28, 1, -16 }, // 0x57 'W'
|
||||
{ 1497, 17, 17, 17, 0, -16 }, // 0x58 'X'
|
||||
{ 1534, 17, 17, 16, 0, -16 }, // 0x59 'Y'
|
||||
{ 1571, 15, 17, 16, 1, -16 }, // 0x5A 'Z'
|
||||
{ 1603, 7, 23, 9, 2, -17 }, // 0x5B '['
|
||||
{ 1624, 11, 22, 9, -1, -19 }, // 0x5C '\'
|
||||
{ 1655, 7, 23, 9, 0, -17 }, // 0x5D ']'
|
||||
{ 1676, 12, 10, 14, 1, -12 }, // 0x5E '^'
|
||||
{ 1691, 12, 2, 12, 0, 1 }, // 0x5F '_'
|
||||
{ 1694, 7, 3, 14, 2, -17 }, // 0x60 '`'
|
||||
{ 1697, 12, 13, 15, 1, -12 }, // 0x61 'a'
|
||||
{ 1717, 14, 18, 17, 2, -17 }, // 0x62 'b'
|
||||
{ 1749, 13, 13, 14, 1, -12 }, // 0x63 'c'
|
||||
{ 1771, 14, 18, 17, 1, -17 }, // 0x64 'd'
|
||||
{ 1803, 13, 13, 15, 1, -12 }, // 0x65 'e'
|
||||
{ 1825, 10, 18, 9, 0, -17 }, // 0x66 'f'
|
||||
{ 1848, 14, 18, 17, 1, -12 }, // 0x67 'g'
|
||||
{ 1880, 13, 18, 17, 2, -17 }, // 0x68 'h'
|
||||
{ 1910, 5, 19, 7, 1, -18 }, // 0x69 'i'
|
||||
{ 1922, 9, 24, 7, -2, -18 }, // 0x6A 'j'
|
||||
{ 1949, 14, 18, 16, 2, -17 }, // 0x6B 'k'
|
||||
{ 1981, 3, 18, 7, 2, -17 }, // 0x6C 'l'
|
||||
{ 1988, 22, 13, 25, 2, -12 }, // 0x6D 'm'
|
||||
{ 2024, 13, 13, 17, 2, -12 }, // 0x6E 'n'
|
||||
{ 2046, 14, 13, 16, 1, -12 }, // 0x6F 'o'
|
||||
{ 2069, 14, 18, 17, 2, -12 }, // 0x70 'p'
|
||||
{ 2101, 14, 18, 17, 1, -12 }, // 0x71 'q'
|
||||
{ 2133, 8, 13, 10, 2, -12 }, // 0x72 'r'
|
||||
{ 2146, 12, 13, 13, 0, -12 }, // 0x73 's'
|
||||
{ 2166, 10, 16, 10, 0, -15 }, // 0x74 't'
|
||||
{ 2186, 13, 13, 16, 2, -12 }, // 0x75 'u'
|
||||
{ 2208, 15, 13, 14, 0, -12 }, // 0x76 'v'
|
||||
{ 2233, 22, 13, 22, 0, -12 }, // 0x77 'w'
|
||||
{ 2269, 14, 13, 14, 0, -12 }, // 0x78 'x'
|
||||
{ 2292, 15, 18, 14, 0, -12 }, // 0x79 'y'
|
||||
{ 2326, 11, 13, 13, 1, -12 }, // 0x7A 'z'
|
||||
{ 2344, 8, 23, 9, 1, -17 }, // 0x7B '{'
|
||||
{ 2367, 3, 23, 7, 2, -17 }, // 0x7C '|'
|
||||
{ 2376, 8, 23, 9, 0, -17 }, // 0x7D '}'
|
||||
{ 2399, 12, 5, 14, 1, -10 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold12pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold12pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold12pt7bGlyphs,
|
||||
0x20, 0x7E, 29 };
|
||||
|
||||
// Approx. 3079 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD12PT7B_H
|
||||
@@ -0,0 +1,536 @@
|
||||
#ifndef MONTSERRATBOLD18PT7B_H
|
||||
#define MONTSERRATBOLD18PT7B_H
|
||||
const uint8_t Montserrat_Bold18pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7D, 0xE7,
|
||||
0x9E, 0x78, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78, 0xF1, 0xFE, 0x3F, 0xC7,
|
||||
0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3C, 0x01, 0xE0,
|
||||
0xF0, 0x03, 0xC0, 0xF0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC1,
|
||||
0xE0, 0x03, 0xC1, 0xE0, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF,
|
||||
0xFE, 0x7F, 0xFF, 0xFE, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83,
|
||||
0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0xFF, 0xFF,
|
||||
0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x0F, 0x07, 0x80, 0x0F, 0x07,
|
||||
0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07,
|
||||
0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x01,
|
||||
0xFE, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7,
|
||||
0xE7, 0x1C, 0x7C, 0x70, 0x4F, 0xC7, 0x00, 0xFC, 0x70, 0x07, 0xF7, 0x00,
|
||||
0x7F, 0xF0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF,
|
||||
0xE0, 0x07, 0xFF, 0x00, 0x73, 0xF0, 0x07, 0x1F, 0x00, 0x71, 0xF7, 0x07,
|
||||
0x3F, 0x7E, 0x77, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, 0xF8, 0x0F,
|
||||
0xFF, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00,
|
||||
0x0F, 0x00, 0x07, 0x81, 0xFE, 0x00, 0x78, 0x1F, 0xF8, 0x07, 0x80, 0xF3,
|
||||
0xC0, 0x3C, 0x0F, 0x0F, 0x03, 0xC0, 0x78, 0x78, 0x3C, 0x03, 0x81, 0xC1,
|
||||
0xE0, 0x1C, 0x0E, 0x1E, 0x00, 0xF0, 0xF1, 0xE0, 0x07, 0x87, 0x9F, 0x00,
|
||||
0x1E, 0x78, 0xF0, 0x00, 0xFF, 0xCF, 0x00, 0x03, 0xFC, 0xF8, 0xFC, 0x07,
|
||||
0x87, 0x9F, 0xF0, 0x00, 0x78, 0xFF, 0xC0, 0x07, 0xCF, 0x1E, 0x00, 0x3C,
|
||||
0x70, 0x78, 0x03, 0xC3, 0x83, 0xC0, 0x3E, 0x1C, 0x1E, 0x01, 0xE0, 0xE0,
|
||||
0xF0, 0x1E, 0x07, 0x07, 0x81, 0xE0, 0x3C, 0x78, 0x0F, 0x00, 0xFF, 0xC0,
|
||||
0xF0, 0x07, 0xFC, 0x0F, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x03, 0xFF,
|
||||
0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x1F, 0x87, 0xC0, 0x1F, 0x07,
|
||||
0xC0, 0x1F, 0x07, 0xC0, 0x1F, 0x0F, 0xC0, 0x0F, 0x9F, 0x80, 0x0F, 0xFF,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xFE,
|
||||
0x3C, 0x3F, 0x7F, 0x3E, 0x7E, 0x3F, 0xBE, 0x7C, 0x1F, 0xFC, 0xFC, 0x0F,
|
||||
0xFC, 0xFC, 0x07, 0xF8, 0xFC, 0x03, 0xF8, 0x7E, 0x07, 0xFC, 0x7F, 0xFF,
|
||||
0xFE, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0x9C, 0x07, 0xFE, 0x0C, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x0F, 0x8F, 0x8F, 0xC7, 0xC3, 0xE3, 0xF1, 0xF0, 0xF8,
|
||||
0xFC, 0x7E, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E,
|
||||
0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF8, 0xFC, 0x3E, 0x1F, 0x0F, 0xC3, 0xE1,
|
||||
0xF8, 0x7C, 0x3E, 0x0F, 0x80, 0x7C, 0x1F, 0x03, 0xE0, 0xFC, 0x3F, 0x07,
|
||||
0xC1, 0xF8, 0x7E, 0x0F, 0x83, 0xE0, 0xFC, 0x3F, 0x0F, 0xC1, 0xF0, 0x7C,
|
||||
0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x3F, 0x0F, 0xC3, 0xF0, 0xF8, 0x3E, 0x0F,
|
||||
0x87, 0xE1, 0xF8, 0x7C, 0x3F, 0x0F, 0x83, 0xE1, 0xF0, 0xFC, 0x00, 0x03,
|
||||
0x80, 0x07, 0x00, 0x8E, 0x23, 0xDC, 0xE7, 0xFF, 0xE7, 0xFF, 0x87, 0xFC,
|
||||
0x0F, 0xF8, 0x7F, 0xFC, 0xFF, 0xF9, 0xCE, 0x71, 0x1C, 0x40, 0x38, 0x00,
|
||||
0x70, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
|
||||
0x00, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
|
||||
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||
0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x1E, 0x3C, 0xF1, 0xE3, 0x80, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00,
|
||||
0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7C, 0x00,
|
||||
0x7C, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF0, 0x01, 0xF0, 0x01,
|
||||
0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x07,
|
||||
0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
|
||||
0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x78,
|
||||
0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xF8, 0x03, 0xFF,
|
||||
0xE0, 0x3F, 0xFF, 0x81, 0xFF, 0xFE, 0x1F, 0xC3, 0xF9, 0xFC, 0x0F, 0xCF,
|
||||
0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xE0, 0x0F, 0xFF, 0x00, 0x3F, 0xF8, 0x01,
|
||||
0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xEF, 0x80, 0x3F, 0x7C,
|
||||
0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0xFC, 0x7E, 0x07, 0xE3, 0xFC, 0xFF,
|
||||
0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
|
||||
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
|
||||
0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0x03, 0xF8,
|
||||
0x00, 0xFF, 0xF0, 0x3F, 0xFF, 0x87, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xC0,
|
||||
0xFE, 0x18, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00,
|
||||
0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00,
|
||||
0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xF0, 0x7F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xFF,
|
||||
0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F,
|
||||
0x80, 0x07, 0xE0, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F,
|
||||
0xF8, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x98, 0x03,
|
||||
0xF7, 0xE1, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xF3, 0xFF, 0xF8, 0x1F, 0xFE,
|
||||
0x00, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00,
|
||||
0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x01,
|
||||
0xF8, 0x7E, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00,
|
||||
0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07,
|
||||
0xE0, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F,
|
||||
0xFF, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01,
|
||||
0xF0, 0x00, 0x1F, 0xFE, 0x03, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE,
|
||||
0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03,
|
||||
0xF3, 0x00, 0x7F, 0x3F, 0x1F, 0xE7, 0xFF, 0xFE, 0xFF, 0xFF, 0xC7, 0xFF,
|
||||
0xF8, 0x0F, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8,
|
||||
0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F, 0xE0, 0x20, 0xFC, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x3F, 0xC1, 0xFF, 0xFF, 0x8F,
|
||||
0xFF, 0xFE, 0x7F, 0xFF, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0x7E, 0x7E, 0x01,
|
||||
0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xE3, 0xF0, 0x3F, 0x0F,
|
||||
0xFF, 0xF0, 0x7F, 0xFF, 0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x80,
|
||||
0x7E, 0xF8, 0x0F, 0xEF, 0x80, 0xFC, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x00,
|
||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80,
|
||||
0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC3,
|
||||
0xF8, 0xFE, 0x3F, 0x01, 0xF9, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0x7E, 0x03,
|
||||
0xF1, 0xF8, 0x3F, 0x8F, 0xFF, 0xF8, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x1F,
|
||||
0xFF, 0xF1, 0xFE, 0x1F, 0xCF, 0xC0, 0x7E, 0xFC, 0x01, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xF7, 0xE0, 0x3F, 0x3F, 0xFF, 0xF8, 0xFF,
|
||||
0xFF, 0x83, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x03, 0xF0, 0x01, 0xFF, 0xE0,
|
||||
0x3F, 0xFF, 0x07, 0xFF, 0xF8, 0x7F, 0x3F, 0xCF, 0xC0, 0x7E, 0xFC, 0x07,
|
||||
0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xFB,
|
||||
0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFB, 0xF0, 0x7E, 0x3F, 0x00,
|
||||
0x03, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x38, 0x7F, 0xC3,
|
||||
0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0, 0x3F, 0xF8, 0x00, 0x10, 0xFB,
|
||||
0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F,
|
||||
0xFF, 0xFD, 0xFB, 0xE0, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F, 0xFF, 0xFD, 0xFB, 0xE3, 0xC7, 0x9E,
|
||||
0x3C, 0x70, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0, 0x1F, 0xF0, 0x7F,
|
||||
0xF8, 0xFF, 0xE3, 0xFF, 0x81, 0xFF, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x3F,
|
||||
0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x0F, 0xFC, 0x01, 0xFE, 0x00, 0x1F,
|
||||
0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x78, 0x00, 0x3F,
|
||||
0x00, 0x1F, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x0F, 0xFE, 0x01, 0xFF,
|
||||
0x00, 0x1F, 0x80, 0x1F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xFF, 0x87, 0xFE,
|
||||
0x03, 0xFC, 0x01, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF,
|
||||
0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xEF, 0xFF, 0xFC, 0xF8, 0x1F, 0xC6, 0x01,
|
||||
0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, 0xF8,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x80, 0x03, 0xF8,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00,
|
||||
0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFE, 0xFF,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x03, 0xF0, 0x00, 0x1F, 0x01, 0xF0, 0x00,
|
||||
0x03, 0xE0, 0x78, 0x00, 0x00, 0x7C, 0x3E, 0x0F, 0xF7, 0xCF, 0x0F, 0x07,
|
||||
0xFF, 0xF1, 0xE7, 0x83, 0xFF, 0xFC, 0x79, 0xE1, 0xFF, 0xFF, 0x0E, 0x78,
|
||||
0x7C, 0x0F, 0xC3, 0xDE, 0x3E, 0x01, 0xF0, 0xFF, 0x0F, 0x80, 0x7C, 0x3F,
|
||||
0xC3, 0xE0, 0x1F, 0x0F, 0xF0, 0xF8, 0x07, 0xC3, 0xFC, 0x3E, 0x01, 0xF0,
|
||||
0xFF, 0x0F, 0x80, 0x7C, 0x3D, 0xE3, 0xF0, 0x3F, 0x0E, 0x78, 0x7E, 0x1F,
|
||||
0xC7, 0x9E, 0x1F, 0xFF, 0xFF, 0xE3, 0xC3, 0xFF, 0xFF, 0xF0, 0xF0, 0x7F,
|
||||
0xE7, 0xF8, 0x1E, 0x0F, 0xE0, 0xFC, 0x07, 0xC0, 0x00, 0x00, 0x00, 0xF8,
|
||||
0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x03, 0xFC, 0x0F, 0x00, 0x00,
|
||||
0x7F, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xF8, 0x00,
|
||||
0x00, 0x1F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F,
|
||||
0xE0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3E, 0xF8, 0x00,
|
||||
0x0F, 0xDF, 0x00, 0x01, 0xF3, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x0F, 0xC7,
|
||||
0xE0, 0x01, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0x81, 0xF8, 0x03,
|
||||
0xF0, 0x1F, 0x00, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
|
||||
0xE0, 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xC3, 0xE0, 0x01, 0xF8, 0xFC,
|
||||
0x00, 0x1F, 0x9F, 0x80, 0x03, 0xF7, 0xE0, 0x00, 0x3E, 0xFC, 0x00, 0x07,
|
||||
0xE0, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC,
|
||||
0xFF, 0xFF, 0xFB, 0xF0, 0x0F, 0xEF, 0xC0, 0x1F, 0xBF, 0x00, 0x7E, 0xFC,
|
||||
0x01, 0xFB, 0xF0, 0x07, 0xEF, 0xC0, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF,
|
||||
0xE3, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xBF, 0x00, 0x3F, 0xFC, 0x00, 0xFF,
|
||||
0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8, 0xFF, 0xFF, 0x80, 0x00, 0x3F,
|
||||
0x80, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF,
|
||||
0xFF, 0x1F, 0xE0, 0x7E, 0x3F, 0x80, 0x1C, 0x7F, 0x00, 0x00, 0x7E, 0x00,
|
||||
0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00,
|
||||
0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x18, 0x3F, 0xC0, 0x3C, 0x1F, 0xF9,
|
||||
0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x00, 0xFF,
|
||||
0xE0, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x1F, 0xFF,
|
||||
0xFE, 0x0F, 0xFF, 0xFF, 0x87, 0xE0, 0x3F, 0xE3, 0xF0, 0x03, 0xF9, 0xF8,
|
||||
0x00, 0xFC, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x1F, 0xBF, 0x00, 0x07, 0xDF,
|
||||
0x80, 0x03, 0xEF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7D,
|
||||
0xF8, 0x00, 0x7E, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0xBF, 0x00, 0x3F,
|
||||
0x9F, 0x80, 0x3F, 0xCF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF,
|
||||
0xC1, 0xFF, 0xFF, 0x80, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xDF, 0xFF,
|
||||
0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xF8, 0x00, 0x3F, 0x00,
|
||||
0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFE, 0x7F, 0xFF,
|
||||
0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xE0, 0x00, 0xFC, 0x00,
|
||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03,
|
||||
0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFF,
|
||||
0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFC, 0x00, 0x3F, 0x00,
|
||||
0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03,
|
||||
0xF0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x01, 0xFF, 0xF0, 0x03,
|
||||
0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x1F, 0xE0, 0x7E, 0x3F,
|
||||
0x80, 0x1C, 0x7F, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C,
|
||||
0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7F, 0x00, 0x3F, 0x3F,
|
||||
0x00, 0x3F, 0x3F, 0xC0, 0x3F, 0x1F, 0xF9, 0xFF, 0x0F, 0xFF, 0xFF, 0x07,
|
||||
0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xE0, 0xFC, 0x00, 0x7F, 0xF0,
|
||||
0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01,
|
||||
0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07,
|
||||
0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0x00, 0x1F, 0xFC, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0x1F, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE3, 0xFF, 0xF1, 0xFF, 0xF8, 0x00,
|
||||
0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0,
|
||||
0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F,
|
||||
0x80, 0x07, 0xC4, 0x07, 0xE7, 0x03, 0xF3, 0xE3, 0xFB, 0xFF, 0xF9, 0xFF,
|
||||
0xFC, 0x7F, 0xFC, 0x0F, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFB,
|
||||
0xF0, 0x0F, 0xE7, 0xE0, 0x1F, 0x8F, 0xC0, 0x7E, 0x1F, 0x81, 0xF8, 0x3F,
|
||||
0x07, 0xE0, 0x7E, 0x1F, 0x80, 0xFC, 0x7E, 0x01, 0xF9, 0xF8, 0x03, 0xF7,
|
||||
0xE0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x80, 0x3F, 0xFF,
|
||||
0x80, 0x7F, 0xFF, 0x80, 0xFF, 0x3F, 0x81, 0xFC, 0x3F, 0x03, 0xF0, 0x7F,
|
||||
0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x7F, 0x1F, 0x80, 0x7F, 0x3F, 0x00, 0x7E,
|
||||
0x7E, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
|
||||
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
|
||||
0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
|
||||
0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
|
||||
0x03, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xF8, 0x00, 0x01, 0xEF, 0x80, 0x00, 0x3E, 0xFC, 0x00,
|
||||
0x03, 0xEF, 0xC0, 0x00, 0x7E, 0xFE, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0xFE,
|
||||
0xFF, 0x00, 0x1F, 0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0x80, 0x3F, 0xEF, 0xFC,
|
||||
0x07, 0xFE, 0xFF, 0xE0, 0x7F, 0xEF, 0xBE, 0x0F, 0xBE, 0xFB, 0xF0, 0xFB,
|
||||
0xEF, 0x9F, 0x1F, 0x3E, 0xF8, 0xFB, 0xF3, 0xEF, 0x8F, 0xFE, 0x3E, 0xF8,
|
||||
0x7F, 0xC3, 0xEF, 0x87, 0xFC, 0x3E, 0xF8, 0x3F, 0x83, 0xEF, 0x81, 0xF8,
|
||||
0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x80, 0xF0, 0x3F, 0xF8, 0x00, 0x03, 0xFF,
|
||||
0x80, 0x00, 0x3F, 0xF8, 0x00, 0x03, 0xF0, 0xF8, 0x00, 0x7F, 0xE0, 0x01,
|
||||
0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x7F, 0xFE, 0x01, 0xFF,
|
||||
0xFC, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF,
|
||||
0x87, 0xFF, 0x7F, 0x1F, 0xFD, 0xFC, 0x7F, 0xF3, 0xF9, 0xFF, 0xC7, 0xF7,
|
||||
0xFF, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF,
|
||||
0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x00,
|
||||
0x3F, 0xFC, 0x00, 0x7C, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x0F,
|
||||
0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xFF,
|
||||
0x0F, 0xE0, 0x07, 0xF3, 0xF8, 0x00, 0x7E, 0x7E, 0x00, 0x0F, 0xCF, 0xC0,
|
||||
0x00, 0xFD, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F,
|
||||
0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x3F, 0x7E, 0x00,
|
||||
0x07, 0xEF, 0xE0, 0x01, 0xF8, 0xFC, 0x00, 0x7F, 0x1F, 0xE0, 0x1F, 0xC1,
|
||||
0xFF, 0x9F, 0xF8, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x80, 0x1F, 0xFF,
|
||||
0xC0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x3F, 0xFF,
|
||||
0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x0F, 0xFF,
|
||||
0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03,
|
||||
0xFF, 0xC0, 0x3F, 0xFE, 0x0F, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF,
|
||||
0xFF, 0x87, 0xFF, 0xF0, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x00, 0x00,
|
||||
0x3F, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF,
|
||||
0xE0, 0x1F, 0xFF, 0xFF, 0x01, 0xFE, 0x07, 0xF8, 0x3F, 0x80, 0x1F, 0xC7,
|
||||
0xF0, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xC7, 0xE0, 0x00, 0x7E, 0x7C, 0x00,
|
||||
0x07, 0xEF, 0xC0, 0x00, 0x7E, 0xFC, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7E,
|
||||
0xFC, 0x00, 0x07, 0xE7, 0xE0, 0x00, 0x7E, 0x7E, 0x00, 0x07, 0xE7, 0xF0,
|
||||
0x00, 0xFC, 0x3F, 0x00, 0x1F, 0xC3, 0xFC, 0x03, 0xF8, 0x1F, 0xF9, 0xFF,
|
||||
0x80, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0xFE, 0x06, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F,
|
||||
0xFF, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0x00,
|
||||
0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0xFF,
|
||||
0xFF, 0xF3, 0xF0, 0x1F, 0xCF, 0xC0, 0x3F, 0xBF, 0x00, 0x7E, 0xFC, 0x01,
|
||||
0xFB, 0xF0, 0x07, 0xEF, 0xC0, 0x1F, 0xBF, 0x00, 0x7E, 0xFC, 0x03, 0xFB,
|
||||
0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x83, 0xFF,
|
||||
0xFC, 0x0F, 0xC1, 0xF8, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, 0xC3, 0xF0, 0x1F,
|
||||
0x8F, 0xC0, 0x3F, 0x3F, 0x00, 0xFE, 0xFC, 0x01, 0xF8, 0x01, 0xFE, 0x00,
|
||||
0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xE0, 0x1C,
|
||||
0x7C, 0x00, 0x4F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xE0,
|
||||
0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xE0, 0x01,
|
||||
0xFF, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF7, 0x00, 0x3F, 0x7E,
|
||||
0x07, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, 0xF8, 0x0F, 0xFF, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x80, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E,
|
||||
0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF,
|
||||
0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80,
|
||||
0x0F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F,
|
||||
0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F, 0xFE,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x1F, 0x9F, 0x80,
|
||||
0xFE, 0x7F, 0xDF, 0xF8, 0xFF, 0xFF, 0xC1, 0xFF, 0xFE, 0x03, 0xFF, 0xF0,
|
||||
0x03, 0xFF, 0x00, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xF7, 0xE0, 0x00,
|
||||
0xFD, 0xF8, 0x00, 0x3E, 0x7F, 0x00, 0x1F, 0x8F, 0xC0, 0x07, 0xC3, 0xF0,
|
||||
0x03, 0xF0, 0x7E, 0x00, 0xF8, 0x1F, 0x80, 0x7E, 0x03, 0xF0, 0x1F, 0x80,
|
||||
0xFC, 0x0F, 0xC0, 0x3F, 0x83, 0xF0, 0x07, 0xE0, 0xF8, 0x01, 0xF8, 0x7E,
|
||||
0x00, 0x3F, 0x1F, 0x00, 0x0F, 0xCF, 0xC0, 0x01, 0xFB, 0xF0, 0x00, 0x7F,
|
||||
0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x00,
|
||||
0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3F, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0xF0,
|
||||
0x03, 0xF8, 0x01, 0xF3, 0xF0, 0x07, 0xF0, 0x03, 0xE7, 0xE0, 0x0F, 0xE0,
|
||||
0x0F, 0xCF, 0xC0, 0x3F, 0xE0, 0x1F, 0x0F, 0xC0, 0x7F, 0xC0, 0x3E, 0x1F,
|
||||
0x80, 0xFF, 0x80, 0xFC, 0x3F, 0x03, 0xFF, 0x81, 0xF0, 0x3F, 0x07, 0xDF,
|
||||
0x03, 0xE0, 0x7E, 0x0F, 0xBE, 0x0F, 0xC0, 0xFC, 0x3E, 0x7E, 0x1F, 0x00,
|
||||
0xFC, 0x7C, 0x7C, 0x3E, 0x01, 0xF8, 0xF8, 0xF8, 0xFC, 0x03, 0xF3, 0xE1,
|
||||
0xF9, 0xF0, 0x03, 0xE7, 0xC1, 0xF3, 0xE0, 0x07, 0xEF, 0x83, 0xEF, 0xC0,
|
||||
0x0F, 0xFE, 0x07, 0xFF, 0x00, 0x0F, 0xFC, 0x07, 0xFE, 0x00, 0x1F, 0xF8,
|
||||
0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x1F, 0xE0,
|
||||
0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0xFC,
|
||||
0x00, 0x7E, 0x00, 0x7E, 0x00, 0x3F, 0x3F, 0x80, 0x3F, 0x8F, 0xC0, 0x1F,
|
||||
0x83, 0xF0, 0x1F, 0x81, 0xFC, 0x1F, 0x80, 0x7F, 0x0F, 0xC0, 0x1F, 0x8F,
|
||||
0xC0, 0x07, 0xEF, 0xC0, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0x3F,
|
||||
0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x03,
|
||||
0xFE, 0x00, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x01, 0xFB, 0xF0, 0x01,
|
||||
0xF8, 0xFC, 0x01, 0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC0, 0xFC, 0x07, 0xE0,
|
||||
0xFC, 0x01, 0xF8, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0x80, 0xFC, 0x00,
|
||||
0x1F, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7C, 0x3F, 0x00,
|
||||
0xFC, 0x1F, 0x80, 0xF8, 0x1F, 0x81, 0xF8, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3,
|
||||
0xE0, 0x07, 0xE7, 0xE0, 0x03, 0xF7, 0xC0, 0x03, 0xFF, 0xC0, 0x01, 0xFF,
|
||||
0x80, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x7F, 0xFF, 0xF9, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x9F, 0xFF, 0xFE,
|
||||
0x7F, 0xFF, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFC,
|
||||
0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x7F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
|
||||
0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1,
|
||||
0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
|
||||
0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0,
|
||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00,
|
||||
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0,
|
||||
0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x01,
|
||||
0xE0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||
0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1,
|
||||
0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||
0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00,
|
||||
0x7B, 0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x1F, 0x1F, 0x0F, 0x07,
|
||||
0x87, 0x83, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, 0xC0, 0x1E, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x07, 0xE0, 0x3E, 0x03, 0xE0, 0x3C, 0x07,
|
||||
0xF8, 0x0F, 0xFF, 0x87, 0xFF, 0xF0, 0xFF, 0xFE, 0x3E, 0x3F, 0xC4, 0x03,
|
||||
0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x0F, 0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFD,
|
||||
0xF8, 0x1F, 0xFC, 0x07, 0xFF, 0x03, 0xFF, 0xC0, 0xFD, 0xFC, 0xFF, 0x7F,
|
||||
0xFF, 0xCF, 0xFD, 0xF1, 0xFE, 0x7C, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8,
|
||||
0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F,
|
||||
0x9F, 0xC0, 0xFB, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF, 0xF9, 0xFE,
|
||||
0xFE, 0x07, 0xEF, 0xC0, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x3F, 0xF8, 0x03,
|
||||
0xFF, 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xEF, 0xF1,
|
||||
0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0x9F, 0xE0, 0x01,
|
||||
0xFC, 0x00, 0xFF, 0xE0, 0x7F, 0xFF, 0x1F, 0xFF, 0xE7, 0xFC, 0xFE, 0xFC,
|
||||
0x07, 0x9F, 0x00, 0x47, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
|
||||
0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x07, 0x1F, 0xE3, 0xF9, 0xFF,
|
||||
0xFF, 0x1F, 0xFF, 0xC1, 0xFF, 0xF0, 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00,
|
||||
0xFC, 0x00, 0x07, 0xE0, 0x7F, 0x3F, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF,
|
||||
0xFF, 0xFE, 0xFF, 0x9F, 0xF7, 0xE0, 0x3F, 0xBF, 0x01, 0xFF, 0xF0, 0x07,
|
||||
0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7E, 0xF8,
|
||||
0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xC7, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF,
|
||||
0x0F, 0xFF, 0xF8, 0x1F, 0xCF, 0xC0, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F,
|
||||
0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xE0, 0x3E, 0x7C, 0x03, 0xFF,
|
||||
0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
|
||||
0x7C, 0x00, 0x07, 0xE0, 0x10, 0x7F, 0x87, 0x83, 0xFF, 0xFC, 0x1F, 0xFF,
|
||||
0xC0, 0xFF, 0xF8, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x0F, 0xF8, 0x3F, 0xF0,
|
||||
0x7F, 0xE1, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0xFF, 0xF9, 0xFF,
|
||||
0xF3, 0xFF, 0xE7, 0xFF, 0xC1, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0,
|
||||
0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07,
|
||||
0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x03, 0xF8, 0xF8, 0x7F, 0xF7,
|
||||
0xC7, 0xFF, 0xFE, 0x7F, 0xFF, 0xF7, 0xF8, 0xFF, 0xBF, 0x01, 0xFF, 0xF0,
|
||||
0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x7F,
|
||||
0xF8, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xE7, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF,
|
||||
0xFF, 0x0F, 0xFF, 0xF8, 0x1F, 0xCF, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF1,
|
||||
0x80, 0x3F, 0x1F, 0x8F, 0xF8, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x1F, 0xFF,
|
||||
0x80, 0x3F, 0xF0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C,
|
||||
0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0xFB,
|
||||
0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xE0, 0xFD, 0xF8,
|
||||
0x0F, 0xFE, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0,
|
||||
0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xFF, 0xC0,
|
||||
0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFC, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0x84,
|
||||
0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7,
|
||||
0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE0, 0x00, 0x80, 0x3E, 0x07, 0xF0,
|
||||
0x7F, 0x07, 0xF0, 0x3E, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x03, 0xE0,
|
||||
0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0,
|
||||
0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0,
|
||||
0x3E, 0x03, 0xE0, 0x7E, 0x47, 0xE7, 0xFC, 0xFF, 0xCF, 0xF8, 0x7E, 0x00,
|
||||
0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
|
||||
0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x7E, 0xF8, 0x0F, 0xCF, 0x83,
|
||||
0xF8, 0xF8, 0x7F, 0x0F, 0x8F, 0xE0, 0xF9, 0xFC, 0x0F, 0xBF, 0x80, 0xFF,
|
||||
0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xFC, 0x0F,
|
||||
0xEF, 0xE0, 0xFC, 0x7F, 0x0F, 0x83, 0xF8, 0xF8, 0x1F, 0x8F, 0x80, 0xFC,
|
||||
0xF8, 0x0F, 0xEF, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF9, 0xFC,
|
||||
0x0F, 0xE1, 0xF7, 0xFE, 0x7F, 0xF3, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF,
|
||||
0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFE, 0x0F, 0xFF, 0x03, 0xF8,
|
||||
0x1F, 0xFC, 0x07, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x3F, 0xF0, 0x0F, 0x80,
|
||||
0x7F, 0xE0, 0x1F, 0x00, 0xFF, 0xC0, 0x3E, 0x01, 0xFF, 0x80, 0x7C, 0x03,
|
||||
0xFF, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xF0, 0x0F, 0xFC, 0x03, 0xE0, 0x1F,
|
||||
0xF8, 0x07, 0xC0, 0x3F, 0xF0, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0x00, 0xF8,
|
||||
0xF8, 0xFC, 0x1F, 0x7F, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD,
|
||||
0xFC, 0x1F, 0xBF, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF,
|
||||
0xE0, 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xFF,
|
||||
0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0x80, 0x01, 0xFC,
|
||||
0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xF8, 0xFE, 0x3F,
|
||||
0x01, 0xF9, 0xF0, 0x0F, 0xDF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xF7, 0xC0, 0x1F, 0x3F, 0x01, 0xF9, 0xFE,
|
||||
0x3F, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x80,
|
||||
0xF9, 0xFC, 0x0F, 0xBF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF, 0x9F,
|
||||
0xEF, 0xE0, 0x7E, 0xFC, 0x03, 0xFF, 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0x80,
|
||||
0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7E, 0xFF,
|
||||
0x1F, 0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xF9, 0xFE, 0x0F,
|
||||
0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00,
|
||||
0xF8, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF9, 0xF8, 0x7F, 0xFF, 0xC7, 0xFF,
|
||||
0xFE, 0x7F, 0xFF, 0xF7, 0xF9, 0xFF, 0xBF, 0x01, 0xFF, 0xF0, 0x0F, 0xFF,
|
||||
0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03,
|
||||
0xFF, 0xC0, 0x1F, 0xBF, 0x01, 0xFD, 0xFE, 0x3F, 0xE7, 0xFF, 0xFF, 0x1F,
|
||||
0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0xFE, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F,
|
||||
0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00,
|
||||
0x0F, 0xC0, 0xF8, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0x07,
|
||||
0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0,
|
||||
0xF8, 0x1F, 0x03, 0xE0, 0x00, 0x07, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xCF,
|
||||
0xFF, 0xCF, 0xC0, 0xE7, 0xC0, 0x03, 0xF0, 0x01, 0xFE, 0x00, 0x7F, 0xF8,
|
||||
0x3F, 0xFF, 0x07, 0xFF, 0xC0, 0x3F, 0xE0, 0x01, 0xFA, 0x00, 0x7D, 0xC0,
|
||||
0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0x0F, 0xFE, 0x00, 0x1F, 0x80,
|
||||
0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0x3F, 0xFE, 0x7F,
|
||||
0xFC, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0,
|
||||
0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7F, 0x00, 0x7F, 0xE0,
|
||||
0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0,
|
||||
0x0F, 0xFE, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0,
|
||||
0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xF7, 0xC0,
|
||||
0x7E, 0xFC, 0x0F, 0xDF, 0xEF, 0xFB, 0xFF, 0xFF, 0x3F, 0xFF, 0xE3, 0xFF,
|
||||
0xFC, 0x1F, 0xCF, 0x80, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0x7C,
|
||||
0xFC, 0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x81, 0xF0, 0xFC, 0x1F, 0x83, 0xE0,
|
||||
0xF8, 0x1F, 0x8F, 0xC0, 0x7C, 0x7C, 0x03, 0xF3, 0xE0, 0x1F, 0xBE, 0x00,
|
||||
0x7D, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x01, 0xFC,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xBE, 0x01,
|
||||
0xF0, 0x0F, 0x9F, 0x01, 0xFC, 0x07, 0xCF, 0x80, 0xFE, 0x03, 0xE3, 0xE0,
|
||||
0x7F, 0x03, 0xE1, 0xF0, 0x7F, 0xC1, 0xF0, 0xF8, 0x3F, 0xE0, 0xF0, 0x3E,
|
||||
0x1F, 0xF0, 0xF8, 0x1F, 0x1F, 0x7C, 0x7C, 0x0F, 0x8F, 0xBE, 0x3C, 0x03,
|
||||
0xEF, 0x8F, 0xBE, 0x01, 0xF7, 0xC7, 0xDF, 0x00, 0xFB, 0xE3, 0xFF, 0x00,
|
||||
0x3F, 0xE0, 0xFF, 0x80, 0x1F, 0xF0, 0x7F, 0xC0, 0x07, 0xF0, 0x3F, 0xC0,
|
||||
0x03, 0xF8, 0x0F, 0xE0, 0x01, 0xFC, 0x07, 0xE0, 0x00, 0x7C, 0x03, 0xF0,
|
||||
0x00, 0x7E, 0x03, 0xF3, 0xF0, 0x1F, 0x0F, 0xC1, 0xF8, 0x3F, 0x1F, 0x80,
|
||||
0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC0, 0x01, 0xFC,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xF0, 0x07,
|
||||
0xEF, 0xC0, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x07, 0xE3, 0xF0, 0x3F,
|
||||
0x9F, 0x00, 0xFC, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0x7C, 0xFC,
|
||||
0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x81, 0xF0, 0xFC, 0x1F, 0x83, 0xE0, 0xF8,
|
||||
0x1F, 0x8F, 0xC0, 0x7C, 0x7C, 0x03, 0xF3, 0xE0, 0x0F, 0xBE, 0x00, 0x7D,
|
||||
0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x01, 0xFC, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x39, 0xF8,
|
||||
0x01, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF0, 0x03,
|
||||
0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01,
|
||||
0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xE1, 0xFC, 0x7F, 0x8F, 0xF1, 0xF8,
|
||||
0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x7E,
|
||||
0x3F, 0xC7, 0xF0, 0xFC, 0x1F, 0xC3, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x07,
|
||||
0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xFC, 0x3F, 0xC3, 0xF8,
|
||||
0x3F, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||
0xF8, 0x1F, 0x83, 0xF8, 0x7F, 0x87, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x1F,
|
||||
0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xF8, 0x7F, 0x07, 0xE3,
|
||||
0xFC, 0x7F, 0x8F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0,
|
||||
0x7C, 0x1F, 0x8F, 0xF1, 0xFE, 0x3F, 0x87, 0xE0, 0xF0, 0x00, 0x0C, 0x00,
|
||||
0x1F, 0xC1, 0xDF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF7, 0x07, 0xFB, 0x81,
|
||||
0xF8 };
|
||||
|
||||
const GFXglyph Montserrat_Bold18pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 10, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 6, 25, 10, 2, -24 }, // 0x21 '!'
|
||||
{ 20, 11, 10, 15, 2, -24 }, // 0x22 '"'
|
||||
{ 34, 24, 25, 25, 1, -24 }, // 0x23 '#'
|
||||
{ 109, 20, 33, 22, 1, -28 }, // 0x24 '$'
|
||||
{ 192, 29, 25, 31, 1, -24 }, // 0x25 '%'
|
||||
{ 283, 24, 25, 25, 1, -24 }, // 0x26 '&'
|
||||
{ 358, 4, 10, 8, 2, -24 }, // 0x27 '''
|
||||
{ 363, 9, 33, 13, 3, -25 }, // 0x28 '('
|
||||
{ 401, 10, 33, 13, 0, -25 }, // 0x29 ')'
|
||||
{ 443, 15, 14, 15, 0, -25 }, // 0x2A '*'
|
||||
{ 470, 17, 16, 21, 2, -19 }, // 0x2B '+'
|
||||
{ 504, 7, 12, 9, 1, -6 }, // 0x2C ','
|
||||
{ 515, 10, 4, 14, 2, -11 }, // 0x2D '-'
|
||||
{ 520, 7, 7, 9, 1, -6 }, // 0x2E '.'
|
||||
{ 527, 16, 33, 14, -1, -28 }, // 0x2F '/'
|
||||
{ 593, 21, 25, 24, 1, -24 }, // 0x30 '0'
|
||||
{ 659, 11, 25, 14, 0, -24 }, // 0x31 '1'
|
||||
{ 694, 20, 25, 21, 0, -24 }, // 0x32 '2'
|
||||
{ 757, 19, 25, 21, 0, -24 }, // 0x33 '3'
|
||||
{ 817, 23, 25, 24, 1, -24 }, // 0x34 '4'
|
||||
{ 889, 20, 25, 21, 0, -24 }, // 0x35 '5'
|
||||
{ 952, 21, 25, 22, 1, -24 }, // 0x36 '6'
|
||||
{ 1018, 20, 25, 22, 1, -24 }, // 0x37 '7'
|
||||
{ 1081, 21, 25, 23, 1, -24 }, // 0x38 '8'
|
||||
{ 1147, 20, 25, 22, 1, -24 }, // 0x39 '9'
|
||||
{ 1210, 7, 20, 9, 1, -19 }, // 0x3A ':'
|
||||
{ 1228, 7, 25, 9, 1, -19 }, // 0x3B ';'
|
||||
{ 1250, 17, 17, 21, 2, -20 }, // 0x3C '<'
|
||||
{ 1287, 17, 13, 21, 2, -18 }, // 0x3D '='
|
||||
{ 1315, 17, 17, 21, 2, -20 }, // 0x3E '>'
|
||||
{ 1352, 19, 25, 21, 0, -24 }, // 0x3F '?'
|
||||
{ 1412, 34, 32, 36, 1, -24 }, // 0x40 '@'
|
||||
{ 1548, 27, 25, 27, 0, -24 }, // 0x41 'A'
|
||||
{ 1633, 22, 25, 27, 3, -24 }, // 0x42 'B'
|
||||
{ 1702, 24, 25, 25, 1, -24 }, // 0x43 'C'
|
||||
{ 1777, 25, 25, 29, 3, -24 }, // 0x44 'D'
|
||||
{ 1856, 19, 25, 23, 3, -24 }, // 0x45 'E'
|
||||
{ 1916, 18, 25, 22, 3, -24 }, // 0x46 'F'
|
||||
{ 1973, 24, 25, 27, 1, -24 }, // 0x47 'G'
|
||||
{ 2048, 22, 25, 28, 3, -24 }, // 0x48 'H'
|
||||
{ 2117, 6, 25, 11, 3, -24 }, // 0x49 'I'
|
||||
{ 2136, 17, 25, 19, -1, -24 }, // 0x4A 'J'
|
||||
{ 2190, 23, 25, 26, 3, -24 }, // 0x4B 'K'
|
||||
{ 2262, 18, 25, 21, 3, -24 }, // 0x4C 'L'
|
||||
{ 2319, 28, 25, 33, 3, -24 }, // 0x4D 'M'
|
||||
{ 2407, 22, 25, 28, 3, -24 }, // 0x4E 'N'
|
||||
{ 2476, 27, 25, 30, 1, -24 }, // 0x4F 'O'
|
||||
{ 2561, 21, 25, 26, 3, -24 }, // 0x50 'P'
|
||||
{ 2627, 28, 31, 30, 1, -24 }, // 0x51 'Q'
|
||||
{ 2736, 22, 25, 26, 3, -24 }, // 0x52 'R'
|
||||
{ 2805, 20, 25, 22, 1, -24 }, // 0x53 'S'
|
||||
{ 2868, 21, 25, 22, 0, -24 }, // 0x54 'T'
|
||||
{ 2934, 22, 25, 28, 3, -24 }, // 0x55 'U'
|
||||
{ 3003, 26, 25, 26, 0, -24 }, // 0x56 'V'
|
||||
{ 3085, 39, 25, 41, 1, -24 }, // 0x57 'W'
|
||||
{ 3207, 25, 25, 25, 0, -24 }, // 0x58 'X'
|
||||
{ 3286, 24, 25, 24, 0, -24 }, // 0x59 'Y'
|
||||
{ 3361, 22, 25, 23, 1, -24 }, // 0x5A 'Z'
|
||||
{ 3430, 9, 33, 13, 3, -25 }, // 0x5B '['
|
||||
{ 3468, 17, 33, 14, -2, -28 }, // 0x5C '\'
|
||||
{ 3539, 9, 33, 13, 1, -25 }, // 0x5D ']'
|
||||
{ 3577, 17, 15, 21, 2, -19 }, // 0x5E '^'
|
||||
{ 3609, 18, 3, 18, 0, 1 }, // 0x5F '_'
|
||||
{ 3616, 11, 5, 21, 3, -25 }, // 0x60 '`'
|
||||
{ 3623, 18, 19, 22, 1, -18 }, // 0x61 'a'
|
||||
{ 3666, 20, 26, 24, 3, -25 }, // 0x62 'b'
|
||||
{ 3731, 19, 19, 21, 1, -18 }, // 0x63 'c'
|
||||
{ 3777, 21, 26, 24, 1, -25 }, // 0x64 'd'
|
||||
{ 3846, 20, 19, 22, 1, -18 }, // 0x65 'e'
|
||||
{ 3894, 15, 26, 14, 0, -25 }, // 0x66 'f'
|
||||
{ 3943, 21, 26, 25, 1, -18 }, // 0x67 'g'
|
||||
{ 4012, 19, 26, 24, 3, -25 }, // 0x68 'h'
|
||||
{ 4074, 7, 28, 11, 2, -27 }, // 0x69 'i'
|
||||
{ 4099, 12, 35, 11, -3, -27 }, // 0x6A 'j'
|
||||
{ 4152, 20, 26, 23, 3, -25 }, // 0x6B 'k'
|
||||
{ 4217, 5, 26, 11, 3, -25 }, // 0x6C 'l'
|
||||
{ 4234, 31, 19, 37, 3, -18 }, // 0x6D 'm'
|
||||
{ 4308, 19, 19, 24, 3, -18 }, // 0x6E 'n'
|
||||
{ 4354, 21, 19, 23, 1, -18 }, // 0x6F 'o'
|
||||
{ 4404, 20, 26, 24, 3, -18 }, // 0x70 'p'
|
||||
{ 4469, 21, 26, 24, 1, -18 }, // 0x71 'q'
|
||||
{ 4538, 11, 19, 15, 3, -18 }, // 0x72 'r'
|
||||
{ 4565, 17, 19, 19, 1, -18 }, // 0x73 's'
|
||||
{ 4606, 15, 23, 15, 0, -22 }, // 0x74 't'
|
||||
{ 4650, 19, 19, 24, 2, -18 }, // 0x75 'u'
|
||||
{ 4696, 21, 19, 21, 0, -18 }, // 0x76 'v'
|
||||
{ 4746, 33, 19, 33, 0, -18 }, // 0x77 'w'
|
||||
{ 4825, 21, 19, 21, 0, -18 }, // 0x78 'x'
|
||||
{ 4875, 21, 26, 21, 0, -18 }, // 0x79 'y'
|
||||
{ 4944, 17, 19, 19, 1, -18 }, // 0x7A 'z'
|
||||
{ 4985, 11, 33, 14, 2, -25 }, // 0x7B '{'
|
||||
{ 5031, 5, 33, 11, 3, -25 }, // 0x7C '|'
|
||||
{ 5052, 11, 33, 14, 1, -25 }, // 0x7D '}'
|
||||
{ 5098, 17, 7, 21, 2, -15 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold18pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold18pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold18pt7bGlyphs,
|
||||
0x20, 0x7E, 43 };
|
||||
|
||||
// Approx. 5785 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD18PT7B_H
|
||||
@@ -0,0 +1,745 @@
|
||||
#ifndef MONTSERRATBOLD22PT7B_H
|
||||
#define MONTSERRATBOLD22PT7B_H
|
||||
const uint8_t Montserrat_Bold22pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
|
||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x3E, 0x00, 0x00, 0x00,
|
||||
0x7E, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0x3E, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1,
|
||||
0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFC, 0x7F,
|
||||
0xF0, 0xFB, 0xE1, 0xF3, 0xC1, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x07, 0xC0,
|
||||
0xF8, 0x00, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x81, 0xF0,
|
||||
0x00, 0x7C, 0x0F, 0x80, 0x03, 0xC0, 0x7C, 0x0F, 0xFF, 0xFF, 0xFF, 0x7F,
|
||||
0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFE, 0x03, 0xE0,
|
||||
0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x07, 0x80, 0xF8,
|
||||
0x00, 0x7C, 0x07, 0x80, 0x03, 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x3F,
|
||||
0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x0F, 0x00, 0x07, 0xC0, 0xF8,
|
||||
0x00, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x81, 0xF0, 0x00,
|
||||
0x7C, 0x0F, 0x80, 0x03, 0xE0, 0x7C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F,
|
||||
0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x0F,
|
||||
0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x1F,
|
||||
0xFF, 0xFF, 0x1F, 0xF7, 0x9F, 0x8F, 0xE3, 0xC1, 0x87, 0xF1, 0xE0, 0x03,
|
||||
0xF8, 0xF0, 0x01, 0xFC, 0x78, 0x00, 0xFF, 0x3C, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF,
|
||||
0xE0, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x1E,
|
||||
0x7F, 0x80, 0x0F, 0x1F, 0xC0, 0x07, 0x8F, 0xE6, 0x03, 0xC7, 0xF3, 0xC1,
|
||||
0xE3, 0xFB, 0xFC, 0xF7, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0x7F,
|
||||
0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xC0, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0x7C, 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x3F, 0xFC, 0x00,
|
||||
0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x00, 0x78, 0x3E, 0x03, 0xF0, 0x0F, 0x83,
|
||||
0xE0, 0x3E, 0x00, 0xF8, 0x1E, 0x07, 0xC0, 0x0F, 0x81, 0xE0, 0xFC, 0x00,
|
||||
0xF8, 0x1E, 0x0F, 0x80, 0x0F, 0x81, 0xE1, 0xF0, 0x00, 0xF8, 0x3E, 0x3E,
|
||||
0x00, 0x07, 0x83, 0xC3, 0xE0, 0x00, 0x7E, 0xFC, 0x7C, 0x00, 0x03, 0xFF,
|
||||
0x8F, 0x80, 0x00, 0x1F, 0xF0, 0xF8, 0x7E, 0x00, 0xFE, 0x1F, 0x1F, 0xF8,
|
||||
0x00, 0x03, 0xE3, 0xFF, 0xC0, 0x00, 0x3E, 0x3E, 0x7E, 0x00, 0x07, 0xC7,
|
||||
0xC3, 0xE0, 0x00, 0xF8, 0x78, 0x1E, 0x00, 0x1F, 0x87, 0x81, 0xE0, 0x01,
|
||||
0xF0, 0x78, 0x1F, 0x00, 0x3E, 0x07, 0x81, 0xF0, 0x07, 0xE0, 0x78, 0x1E,
|
||||
0x00, 0x7C, 0x07, 0x81, 0xE0, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF8, 0x03,
|
||||
0xE7, 0xE0, 0x1F, 0x00, 0x3F, 0xFC, 0x03, 0xE0, 0x01, 0xFF, 0x80, 0x7C,
|
||||
0x00, 0x0F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x07, 0xFF,
|
||||
0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xE3, 0xF8, 0x01, 0xFC, 0x1F, 0x80,
|
||||
0x1F, 0x81, 0xF8, 0x01, 0xF8, 0x1F, 0x80, 0x1F, 0xC1, 0xF8, 0x00, 0xFC,
|
||||
0x7F, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xC0,
|
||||
0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x3C, 0x3F,
|
||||
0xFF, 0xC3, 0xE7, 0xF9, 0xFE, 0x7E, 0xFE, 0x0F, 0xF7, 0xEF, 0xE0, 0x7F,
|
||||
0xFE, 0xFC, 0x03, 0xFF, 0xCF, 0xC0, 0x1F, 0xFC, 0xFC, 0x00, 0xFF, 0x8F,
|
||||
0xE0, 0x07, 0xF8, 0xFF, 0x01, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xFF, 0xF3, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xC0, 0x7F, 0xF8, 0x0C,
|
||||
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF,
|
||||
0x9E, 0x07, 0xF0, 0x7E, 0x0F, 0xE0, 0xFC, 0x1F, 0xC1, 0xF8, 0x3F, 0x83,
|
||||
0xF8, 0x3F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x07, 0xE0, 0xFE, 0x0F,
|
||||
0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F,
|
||||
0xE0, 0xFE, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x03,
|
||||
0xF0, 0x3F, 0x83, 0xF8, 0x1F, 0x81, 0xFC, 0x1F, 0xC0, 0xFC, 0x0F, 0xE0,
|
||||
0x7E, 0x7E, 0x07, 0xF0, 0x3F, 0x03, 0xF8, 0x1F, 0x81, 0xFC, 0x1F, 0xC0,
|
||||
0xFC, 0x0F, 0xE0, 0xFE, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0xF0,
|
||||
0x7F, 0x07, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0,
|
||||
0x3F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x0F, 0xE0,
|
||||
0xFE, 0x0F, 0xE0, 0xFC, 0x1F, 0xC1, 0xF8, 0x3F, 0x83, 0xF8, 0x7F, 0x07,
|
||||
0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x0C, 0x78, 0xEF, 0xBC, 0xF7,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xF8, 0x0F, 0xF8, 0x0F, 0xFE, 0x1F, 0xFF,
|
||||
0xDF, 0xFF, 0xFF, 0xBD, 0xF3, 0x9E, 0x38, 0x0F, 0x00, 0x07, 0x80, 0x03,
|
||||
0xC0, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80,
|
||||
0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F,
|
||||
0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01,
|
||||
0xF8, 0x00, 0x1F, 0x80, 0x1E, 0x3F, 0x9F, 0xEF, 0xF7, 0xFB, 0xFD, 0xFC,
|
||||
0x7E, 0x1F, 0x1F, 0x0F, 0x87, 0x83, 0xC3, 0xE1, 0xE0, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x3F, 0x9F, 0xFF, 0xFF, 0xFB,
|
||||
0xFD, 0xFC, 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00,
|
||||
0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00,
|
||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
||||
0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC,
|
||||
0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F,
|
||||
0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07,
|
||||
0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF,
|
||||
0xE0, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xC0, 0xFF,
|
||||
0xFF, 0xF0, 0xFF, 0x8F, 0xF8, 0xFF, 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x3F,
|
||||
0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF,
|
||||
0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F,
|
||||
0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03,
|
||||
0xFF, 0xF0, 0x01, 0xFD, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0x80,
|
||||
0xFF, 0x1F, 0xFB, 0xFF, 0x07, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, 0xFF,
|
||||
0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x38, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFC, 0x0F, 0xE0, 0x7F,
|
||||
0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0,
|
||||
0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F,
|
||||
0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC,
|
||||
0x00, 0x18, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8,
|
||||
0x7F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x7F, 0x87, 0xFE, 0x3E, 0x01, 0xFE,
|
||||
0x0C, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x01, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80,
|
||||
0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF,
|
||||
0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE,
|
||||
0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC,
|
||||
0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xC0,
|
||||
0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x7F, 0x30, 0x00, 0xFF, 0x38, 0x00, 0xFE, 0x7F, 0x87, 0xFE,
|
||||
0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0,
|
||||
0x0F, 0xFF, 0xC0, 0x00, 0x18, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F,
|
||||
0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0x03, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00,
|
||||
0x07, 0xF8, 0x7E, 0x00, 0xFF, 0x07, 0xE0, 0x0F, 0xE0, 0x7E, 0x01, 0xFC,
|
||||
0x07, 0xE0, 0x3F, 0xC0, 0x7E, 0x07, 0xF8, 0x07, 0xE0, 0x7F, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00,
|
||||
0x00, 0x07, 0xE0, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE,
|
||||
0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0xC0, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC,
|
||||
0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x10, 0x00, 0x7F,
|
||||
0x3C, 0x00, 0xFF, 0x3F, 0xC7, 0xFF, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC,
|
||||
0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF,
|
||||
0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xC0, 0x60, 0x7F, 0x80,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xC0,
|
||||
0x00, 0x0F, 0xE1, 0xF8, 0x07, 0xF7, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFF,
|
||||
0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x7F, 0xF1, 0xFF, 0xBF, 0xE0, 0x3F, 0xDF,
|
||||
0xE0, 0x0F, 0xEF, 0xF0, 0x03, 0xF7, 0xF8, 0x01, 0xFF, 0xF8, 0x00, 0xFC,
|
||||
0xFE, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0x1F, 0xE0, 0x7F, 0x8F, 0xFF, 0xFF,
|
||||
0x83, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x07, 0xFF,
|
||||
0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
|
||||
0xFE, 0xFC, 0x01, 0xFE, 0xFC, 0x01, 0xFC, 0xFC, 0x01, 0xFC, 0x00, 0x03,
|
||||
0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x7F,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0E,
|
||||
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F,
|
||||
0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC3, 0xFC, 0x07, 0xF0, 0xFE, 0x01, 0xFE,
|
||||
0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xE3, 0xF8, 0x03, 0xF8, 0xFE, 0x01,
|
||||
0xFC, 0x3F, 0xE0, 0xFF, 0x07, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F,
|
||||
0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC7, 0xFC, 0x07, 0xF9,
|
||||
0xFC, 0x00, 0xFE, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xFF, 0xF0, 0x01,
|
||||
0xFD, 0xFC, 0x00, 0x7F, 0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x1F, 0xE3, 0xFF,
|
||||
0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x00,
|
||||
0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x01, 0xFF, 0xC0,
|
||||
0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
|
||||
0xE1, 0xFC, 0x07, 0xF9, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0x7F, 0x7F, 0x00,
|
||||
0x3F, 0xBF, 0x80, 0x1F, 0xDF, 0xC0, 0x0F, 0xEF, 0xE0, 0x0F, 0xFF, 0xF8,
|
||||
0x0F, 0xFD, 0xFF, 0x9F, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x8F,
|
||||
0xFF, 0xDF, 0xC1, 0xFF, 0xCF, 0xE0, 0x3F, 0x0F, 0xE0, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFC, 0x10, 0x03, 0xFE,
|
||||
0x0E, 0x07, 0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE,
|
||||
0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x1E, 0x3F,
|
||||
0x9F, 0xFF, 0xFF, 0xFB, 0xFD, 0xFC, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x3C, 0x7F, 0x3F, 0xFF, 0xFF, 0xF7, 0xFB, 0xF8, 0xF8,
|
||||
0x1E, 0x3F, 0x9F, 0xFF, 0xFF, 0xFB, 0xFD, 0xFC, 0x7C, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7F, 0x3F, 0xDF, 0xEF, 0xF7, 0xFB,
|
||||
0xF8, 0xFC, 0x3E, 0x3E, 0x1F, 0x0F, 0x07, 0x87, 0xC3, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x07, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x00, 0x7F, 0xF0, 0x1F,
|
||||
0xFF, 0x0F, 0xFF, 0xC7, 0xFF, 0xE0, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x00,
|
||||
0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x1F,
|
||||
0x00, 0x00, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0E,
|
||||
0x00, 0x00, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x80,
|
||||
0x3F, 0xFF, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x07,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x0F, 0xFF, 0xC7, 0xFF,
|
||||
0xF0, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFF, 0x00, 0x0F, 0x80, 0x00, 0xC0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x07, 0xFF, 0x80, 0x3F, 0xFF,
|
||||
0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xE0, 0xFF,
|
||||
0x9F, 0x00, 0xFF, 0x0C, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x3E, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00,
|
||||
0x1C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xFF, 0xFC, 0x00,
|
||||
0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x1F, 0xC0,
|
||||
0x00, 0x03, 0xF0, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x00,
|
||||
0x3E, 0x0F, 0xC0, 0x7F, 0x9F, 0x8F, 0x8F, 0xC0, 0xFF, 0xEF, 0xC7, 0xC7,
|
||||
0xC0, 0xFF, 0xFF, 0xE1, 0xF3, 0xE0, 0xFF, 0xFF, 0xF0, 0xFB, 0xE0, 0xFF,
|
||||
0xFF, 0xF8, 0x3D, 0xF0, 0x7F, 0x03, 0xFC, 0x1E, 0xF8, 0x7F, 0x00, 0xFE,
|
||||
0x0F, 0xFC, 0x3F, 0x00, 0x3F, 0x07, 0xFE, 0x1F, 0x80, 0x1F, 0x83, 0xFF,
|
||||
0x0F, 0xC0, 0x0F, 0xC1, 0xFF, 0x87, 0xE0, 0x07, 0xE0, 0xFF, 0xC3, 0xF0,
|
||||
0x03, 0xF0, 0x7F, 0xE1, 0xF8, 0x01, 0xF8, 0x3F, 0xF0, 0xFC, 0x00, 0xFC,
|
||||
0x1E, 0xF8, 0x7F, 0x00, 0xFE, 0x0F, 0x7C, 0x1F, 0xC0, 0xFF, 0x8F, 0x9F,
|
||||
0x0F, 0xFF, 0xFF, 0xEF, 0x8F, 0x83, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xFF,
|
||||
0xF9, 0xFF, 0xC1, 0xF0, 0x3F, 0xF8, 0xFF, 0xC0, 0xFC, 0x07, 0xF8, 0x1F,
|
||||
0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x3F, 0xF8,
|
||||
0x7F, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xE0,
|
||||
0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00,
|
||||
0x03, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0xE0, 0x00,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7E, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00,
|
||||
0x00, 0x3F, 0x1F, 0x80, 0x00, 0x3F, 0x8F, 0xE0, 0x00, 0x1F, 0x87, 0xF0,
|
||||
0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x07, 0xE0, 0x3F,
|
||||
0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x03, 0xF0, 0x0F, 0xE0, 0x03, 0xF8, 0x03,
|
||||
0xF8, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF,
|
||||
0xFF, 0xF8, 0x3F, 0x80, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xC0,
|
||||
0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x07, 0xFF, 0xF0,
|
||||
0x00, 0x01, 0xFC, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
|
||||
0xF8, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF9, 0xF8, 0x01, 0xFF, 0x3F,
|
||||
0x00, 0x0F, 0xF7, 0xE0, 0x01, 0xFE, 0xFC, 0x00, 0x1F, 0xDF, 0x80, 0x03,
|
||||
0xF3, 0xF0, 0x00, 0xFE, 0x7E, 0x00, 0x3F, 0xCF, 0xFF, 0xFF, 0xF1, 0xFF,
|
||||
0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF,
|
||||
0x9F, 0x80, 0x0F, 0xFB, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xC0,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0xFF,
|
||||
0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xFF, 0xCF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, 0x80,
|
||||
0x00, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFC, 0x07,
|
||||
0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x3F, 0xF3, 0xFE, 0x00,
|
||||
0x7C, 0x7F, 0xC0, 0x01, 0x87, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x00, 0x7F, 0x80, 0x01, 0x03, 0xFC, 0x00, 0x3C, 0x3F, 0xF0, 0x07,
|
||||
0xE1, 0xFF, 0xE7, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFE, 0x03,
|
||||
0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x08,
|
||||
0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0,
|
||||
0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0x8F,
|
||||
0xE0, 0x07, 0xFE, 0x3F, 0x80, 0x07, 0xFC, 0xFE, 0x00, 0x0F, 0xFB, 0xF8,
|
||||
0x00, 0x1F, 0xEF, 0xE0, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0xFE, 0xFE, 0x00,
|
||||
0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0x80, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F,
|
||||
0xBF, 0x80, 0x00, 0xFE, 0xFE, 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x3F, 0xCF,
|
||||
0xE0, 0x01, 0xFF, 0x3F, 0x80, 0x1F, 0xF8, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF,
|
||||
0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF,
|
||||
0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB,
|
||||
0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0x80, 0x00, 0x3F,
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3F, 0xFF,
|
||||
0xFC, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xF8, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00,
|
||||
0x7E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xFF, 0xCF,
|
||||
0xFF, 0xFF, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF,
|
||||
0xFF, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
|
||||
0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x01, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, 0x7F,
|
||||
0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFC, 0x7F, 0xF0, 0xFF, 0xC7, 0xFE, 0x00,
|
||||
0xFC, 0x7F, 0xC0, 0x01, 0xC3, 0xFC, 0x00, 0x04, 0x1F, 0xC0, 0x00, 0x01,
|
||||
0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0xFE, 0x00, 0x03, 0xF7, 0xF0, 0x00,
|
||||
0x1F, 0xBF, 0x80, 0x00, 0xFD, 0xFC, 0x00, 0x07, 0xEF, 0xF0, 0x00, 0x3F,
|
||||
0x3F, 0x80, 0x01, 0xF9, 0xFE, 0x00, 0x0F, 0xC7, 0xF8, 0x00, 0x7E, 0x3F,
|
||||
0xF0, 0x03, 0xF0, 0xFF, 0xFB, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||
0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8,
|
||||
0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F,
|
||||
0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0,
|
||||
0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF,
|
||||
0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF1,
|
||||
0xFF, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80,
|
||||
0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x60,
|
||||
0x0F, 0xE7, 0x80, 0xFF, 0x3F, 0x0F, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8,
|
||||
0x7F, 0xFF, 0x81, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFC,
|
||||
0x00, 0x1F, 0xEF, 0xC0, 0x03, 0xFC, 0xFC, 0x00, 0x7F, 0x8F, 0xC0, 0x0F,
|
||||
0xF0, 0xFC, 0x01, 0xFE, 0x0F, 0xC0, 0x3F, 0xC0, 0xFC, 0x03, 0xF8, 0x0F,
|
||||
0xC0, 0x7F, 0x80, 0xFC, 0x0F, 0xF0, 0x0F, 0xC1, 0xFE, 0x00, 0xFC, 0x3F,
|
||||
0xC0, 0x0F, 0xC7, 0xF8, 0x00, 0xFC, 0xFF, 0x00, 0x0F, 0xDF, 0xE0, 0x00,
|
||||
0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF,
|
||||
0xFC, 0x00, 0xFF, 0xDF, 0xE0, 0x0F, 0xF8, 0xFF, 0x00, 0xFF, 0x0F, 0xF8,
|
||||
0x0F, 0xE0, 0x7F, 0xC0, 0xFC, 0x03, 0xFC, 0x0F, 0xC0, 0x1F, 0xE0, 0xFC,
|
||||
0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xF8, 0xFC, 0x00, 0x7F, 0xCF, 0xC0, 0x03,
|
||||
0xFC, 0xFC, 0x00, 0x1F, 0xEF, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
|
||||
0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x00, 0x00, 0x1F, 0xBF,
|
||||
0x00, 0x00, 0x07, 0xEF, 0xE0, 0x00, 0x03, 0xFB, 0xFC, 0x00, 0x00, 0xFE,
|
||||
0xFF, 0x00, 0x00, 0x7F, 0xBF, 0xE0, 0x00, 0x3F, 0xEF, 0xF8, 0x00, 0x0F,
|
||||
0xFB, 0xFF, 0x00, 0x07, 0xFE, 0xFF, 0xE0, 0x01, 0xFF, 0xBF, 0xF8, 0x00,
|
||||
0xFF, 0xEF, 0xFF, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x1F, 0xFE, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0xBF, 0x7F, 0x03, 0xF7, 0xEF, 0xDF, 0xC1, 0xF9, 0xFB, 0xF3,
|
||||
0xF8, 0xFE, 0x7E, 0xFC, 0x7E, 0x3F, 0x1F, 0xBF, 0x1F, 0xDF, 0xC7, 0xEF,
|
||||
0xC3, 0xFF, 0xE1, 0xFB, 0xF0, 0xFF, 0xF0, 0x7E, 0xFC, 0x1F, 0xFC, 0x1F,
|
||||
0xBF, 0x03, 0xFE, 0x07, 0xEF, 0xC0, 0xFF, 0x81, 0xFB, 0xF0, 0x1F, 0xC0,
|
||||
0x7E, 0xFC, 0x03, 0xE0, 0x1F, 0xBF, 0x00, 0xF8, 0x07, 0xEF, 0xC0, 0x1C,
|
||||
0x01, 0xFB, 0xF0, 0x00, 0x00, 0x7E, 0xFC, 0x00, 0x00, 0x1F, 0xBF, 0x00,
|
||||
0x00, 0x07, 0xE0, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00,
|
||||
0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF,
|
||||
0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x01,
|
||||
0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xDF, 0xF0, 0xFF, 0xF9,
|
||||
0xFE, 0x1F, 0xFF, 0x1F, 0xE3, 0xFF, 0xE1, 0xFE, 0x7F, 0xFC, 0x3F, 0xEF,
|
||||
0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0,
|
||||
0x3F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF,
|
||||
0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0x80,
|
||||
0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF,
|
||||
0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xF0,
|
||||
0xFF, 0xE0, 0x7F, 0xC0, 0x0F, 0xF8, 0x7F, 0xC0, 0x03, 0xFE, 0x3F, 0xC0,
|
||||
0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x0F, 0xEF, 0xE0,
|
||||
0x00, 0x07, 0xF7, 0xF0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x01, 0xFF, 0xFC,
|
||||
0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x3F, 0xFF,
|
||||
0x80, 0x00, 0x1F, 0xDF, 0xC0, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x07, 0xF3,
|
||||
0xF8, 0x00, 0x07, 0xF9, 0xFE, 0x00, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xFC,
|
||||
0x3F, 0xF0, 0x07, 0xFC, 0x0F, 0xFF, 0x3F, 0xFC, 0x03, 0xFF, 0xFF, 0xFE,
|
||||
0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFC,
|
||||
0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80,
|
||||
0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
|
||||
0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFE, 0xFE,
|
||||
0x00, 0x3F, 0xBF, 0x80, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xEF, 0xE0, 0x07, 0xFB, 0xF8, 0x03,
|
||||
0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE3, 0xFF,
|
||||
0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00,
|
||||
0x01, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xF8, 0x00,
|
||||
0x0F, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFE,
|
||||
0x01, 0xFF, 0xC3, 0xFF, 0x80, 0xFF, 0x80, 0x1F, 0xF0, 0x7F, 0xC0, 0x03,
|
||||
0xFE, 0x1F, 0xE0, 0x00, 0x7F, 0x87, 0xF0, 0x00, 0x0F, 0xF3, 0xFC, 0x00,
|
||||
0x01, 0xFC, 0xFE, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x1F, 0xCF, 0xE0,
|
||||
0x00, 0x07, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x3F, 0xBF,
|
||||
0x80, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x01, 0xFC,
|
||||
0xFF, 0x00, 0x00, 0x7F, 0x1F, 0xC0, 0x00, 0x3F, 0xC7, 0xF8, 0x00, 0x1F,
|
||||
0xE0, 0xFF, 0x00, 0x0F, 0xF8, 0x3F, 0xF0, 0x07, 0xFC, 0x07, 0xFF, 0x9F,
|
||||
0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0x80, 0x03, 0xFF,
|
||||
0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00,
|
||||
0x0F, 0xF8, 0x0C, 0x00, 0x01, 0xFF, 0x8F, 0x80, 0x00, 0x3F, 0xFF, 0xF0,
|
||||
0x00, 0x07, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x00, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFC, 0x0F,
|
||||
0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF,
|
||||
0xCF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0xBF, 0x80,
|
||||
0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF,
|
||||
0x80, 0x0F, 0xEF, 0xE0, 0x07, 0xFB, 0xF8, 0x03, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
0x3F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
|
||||
0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xE0, 0x3F, 0x83, 0xF8, 0x0F, 0xF0, 0xFE,
|
||||
0x01, 0xFC, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xF3, 0xF8, 0x01, 0xFE,
|
||||
0xFE, 0x00, 0x3F, 0xBF, 0x80, 0x0F, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0xFF,
|
||||
0xFC, 0x01, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xE1, 0xFF,
|
||||
0xFF, 0xF1, 0xFF, 0x01, 0xF8, 0xFE, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x3F,
|
||||
0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x01,
|
||||
0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xFE,
|
||||
0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x07,
|
||||
0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x60, 0x00, 0x7F, 0x3C, 0x00,
|
||||
0x3F, 0xBF, 0xC0, 0x7F, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xC7, 0xFF,
|
||||
0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x00, 0x18, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF8, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF,
|
||||
0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07,
|
||||
0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F,
|
||||
0x00, 0x0F, 0xE7, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03,
|
||||
0xFC, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x3F, 0x9F, 0xC0,
|
||||
0x00, 0x3F, 0x8F, 0xF0, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x0F, 0xE1, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0xFF, 0x00, 0x07, 0xF0, 0x3F, 0x80, 0x07, 0xF0, 0x1F,
|
||||
0xE0, 0x03, 0xF8, 0x07, 0xF0, 0x03, 0xF8, 0x03, 0xFC, 0x01, 0xFC, 0x00,
|
||||
0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x3F, 0xC0, 0x7F, 0x00,
|
||||
0x0F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80,
|
||||
0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x1F, 0xCF, 0xE0,
|
||||
0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x0F, 0xFC,
|
||||
0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x0F, 0xF0, 0x00, 0x7E,
|
||||
0x7F, 0x00, 0x0F, 0xF8, 0x00, 0xFE, 0x7F, 0x80, 0x1F, 0xF8, 0x00, 0xFE,
|
||||
0x3F, 0x80, 0x1F, 0xF8, 0x00, 0xFC, 0x3F, 0x80, 0x1F, 0xFC, 0x01, 0xFC,
|
||||
0x3F, 0xC0, 0x3F, 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0xFC, 0x01, 0xF8,
|
||||
0x1F, 0xC0, 0x3F, 0xFE, 0x03, 0xF8, 0x1F, 0xE0, 0x7F, 0xFE, 0x03, 0xF8,
|
||||
0x0F, 0xE0, 0x7E, 0x7E, 0x03, 0xF0, 0x0F, 0xE0, 0x7E, 0x7F, 0x07, 0xF0,
|
||||
0x0F, 0xF0, 0xFE, 0x7F, 0x07, 0xF0, 0x07, 0xF0, 0xFC, 0x3F, 0x07, 0xE0,
|
||||
0x07, 0xF0, 0xFC, 0x3F, 0x8F, 0xE0, 0x07, 0xF1, 0xFC, 0x3F, 0x8F, 0xE0,
|
||||
0x03, 0xF9, 0xF8, 0x1F, 0x8F, 0xC0, 0x03, 0xF9, 0xF8, 0x1F, 0xDF, 0xC0,
|
||||
0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0x01, 0xFF, 0xF0, 0x0F, 0xDF, 0x80,
|
||||
0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80,
|
||||
0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00,
|
||||
0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x7F, 0x80, 0x03, 0xF8, 0x7F, 0x80,
|
||||
0x0F, 0xF0, 0x7F, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x01,
|
||||
0xFE, 0x00, 0xFF, 0x07, 0xF8, 0x01, 0xFE, 0x0F, 0xE0, 0x01, 0xFE, 0x3F,
|
||||
0x80, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFD, 0xFC, 0x00, 0x03, 0xFF, 0xF0,
|
||||
0x00, 0x03, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xF8, 0x00,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF0, 0x00,
|
||||
0x1F, 0xEF, 0xF0, 0x00, 0x7F, 0x8F, 0xE0, 0x00, 0xFE, 0x1F, 0xE0, 0x03,
|
||||
0xFC, 0x1F, 0xE0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x7F,
|
||||
0x80, 0x3F, 0xC1, 0xFE, 0x00, 0x3F, 0xC7, 0xF8, 0x00, 0x7F, 0xDF, 0xE0,
|
||||
0x00, 0x7F, 0x80, 0x7F, 0x00, 0x01, 0xFC, 0xFF, 0x00, 0x03, 0xF8, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x7F, 0x01, 0xFC,
|
||||
0x01, 0xFC, 0x03, 0xFC, 0x03, 0xF8, 0x03, 0xF8, 0x0F, 0xE0, 0x03, 0xF8,
|
||||
0x1F, 0xC0, 0x07, 0xF8, 0x7F, 0x00, 0x07, 0xF1, 0xFC, 0x00, 0x0F, 0xF3,
|
||||
0xF8, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF,
|
||||
0xFE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xF0, 0x00,
|
||||
0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8,
|
||||
0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F,
|
||||
0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03,
|
||||
0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07,
|
||||
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
|
||||
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
|
||||
0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
|
||||
0x83, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F,
|
||||
0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01,
|
||||
0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F,
|
||||
0xC0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||
0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
|
||||
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
|
||||
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
|
||||
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80,
|
||||
0x1F, 0x7C, 0x00, 0xF9, 0xF0, 0x07, 0xCF, 0x80, 0x7C, 0x3E, 0x03, 0xE1,
|
||||
0xF0, 0x3E, 0x07, 0xC1, 0xF0, 0x3E, 0x1F, 0x01, 0xF0, 0xF8, 0x07, 0xCF,
|
||||
0xC0, 0x3E, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0x07, 0xF0,
|
||||
0x0F, 0xC0, 0x3F, 0x00, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xFF, 0x07, 0xFF,
|
||||
0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0xF0, 0x1F, 0xE1, 0x00, 0x3F,
|
||||
0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF,
|
||||
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x00,
|
||||
0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x7F, 0xFF, 0xFC, 0xFF, 0xF7, 0xF0, 0xFF, 0x9F, 0xC0, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0x3F, 0xF0, 0x3F, 0xBF, 0xFC, 0x1F, 0xFF, 0xFF, 0x8F, 0xFF,
|
||||
0xFF, 0xE7, 0xFF, 0xFF, 0xF3, 0xFF, 0x07, 0xFD, 0xFF, 0x01, 0xFE, 0xFF,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0xBF, 0xF8, 0x7F, 0xDF, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xC3, 0xFB, 0xFF, 0xC1, 0xFC, 0xFF,
|
||||
0x80, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF,
|
||||
0xFC, 0x1F, 0xFF, 0xFE, 0x3F, 0xE1, 0xFE, 0x7F, 0x80, 0x7C, 0x7F, 0x00,
|
||||
0x30, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x30, 0x7F, 0x80, 0x7C, 0x3F, 0xE1, 0xFF, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF,
|
||||
0xFC, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xC0, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x1F, 0xC0, 0x7F, 0xE7, 0xF0, 0x7F, 0xFD, 0xFC, 0x3F, 0xFF,
|
||||
0xFF, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFE, 0x1F, 0xFD, 0xFE,
|
||||
0x01, 0xFF, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xF7, 0xE0, 0x01, 0xFF,
|
||||
0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xF7, 0xF0, 0x01,
|
||||
0xFD, 0xFC, 0x00, 0xFF, 0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x1F, 0xF3, 0xFE,
|
||||
0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF0,
|
||||
0x3F, 0xFD, 0xFC, 0x07, 0xFC, 0x7F, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0xF8,
|
||||
0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFE, 0x07,
|
||||
0xF1, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xF0,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x10, 0x1F,
|
||||
0xF0, 0x3C, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xC0,
|
||||
0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x3F,
|
||||
0xF8, 0x1F, 0xFE, 0x07, 0xFF, 0x83, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80,
|
||||
0x0F, 0xC0, 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xCF, 0xFF, 0xF0, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE,
|
||||
0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80,
|
||||
0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03,
|
||||
0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x01, 0xFF, 0x8F, 0xC1, 0xFF, 0xF3,
|
||||
0xF0, 0xFF, 0xFE, 0xFC, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xF8,
|
||||
0x3F, 0xF7, 0xF8, 0x03, 0xFD, 0xFC, 0x00, 0xFF, 0x7F, 0x00, 0x1F, 0xFF,
|
||||
0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F,
|
||||
0xDF, 0xC0, 0x07, 0xF7, 0xF8, 0x03, 0xFD, 0xFF, 0x01, 0xFF, 0x3F, 0xFF,
|
||||
0xFF, 0xC7, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x03,
|
||||
0xFF, 0x9F, 0xC0, 0x1F, 0x87, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7E,
|
||||
0x08, 0x00, 0x3F, 0x87, 0xC0, 0x1F, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
|
||||
0xFC, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x00,
|
||||
0xFC, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0xE0, 0xFE, 0xFF, 0xF0, 0xFF,
|
||||
0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xE7, 0xFE, 0xFF,
|
||||
0x80, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x7F, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x18, 0x00, 0x00,
|
||||
0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0x00, 0x78, 0x01, 0xF8, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0,
|
||||
0x3F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x1F,
|
||||
0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0,
|
||||
0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03,
|
||||
0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE,
|
||||
0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xCF, 0xFF, 0x9F,
|
||||
0xFE, 0x3F, 0xF8, 0xFF, 0xF1, 0xFF, 0x80, 0x38, 0x00, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x7F, 0xBF, 0x80, 0x7F, 0x9F, 0xC0, 0x7F, 0x8F, 0xE0,
|
||||
0x7F, 0x87, 0xF0, 0x7F, 0x83, 0xF8, 0x7F, 0x81, 0xFC, 0x7F, 0x80, 0xFE,
|
||||
0x7F, 0x80, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0x7F, 0xC0,
|
||||
0xFF, 0x1F, 0xF0, 0x7F, 0x07, 0xF8, 0x3F, 0x81, 0xFE, 0x1F, 0xC0, 0x7F,
|
||||
0x8F, 0xE0, 0x1F, 0xE7, 0xF0, 0x0F, 0xF3, 0xF8, 0x03, 0xFD, 0xFC, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xC0, 0x7F, 0xC1, 0xFD, 0xFF,
|
||||
0xE3, 0xFF, 0xE3, 0xFF, 0xFF, 0xEF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFF, 0xE0,
|
||||
0x7F, 0xE0, 0x7F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFF, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xF8, 0x03, 0xFF, 0xF0,
|
||||
0x07, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xC0,
|
||||
0x1F, 0xFF, 0x80, 0x3F, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xF8,
|
||||
0x03, 0xFF, 0xF0, 0x07, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xE0, 0x0F, 0xFF,
|
||||
0xC0, 0x1F, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0xFE, 0x7F,
|
||||
0xE0, 0xFE, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||
0xFE, 0xFF, 0xE7, 0xFE, 0xFF, 0x80, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0xFF, 0xC0, 0x00, 0xFF,
|
||||
0xFC, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x0F,
|
||||
0xF8, 0x7F, 0xC7, 0xF8, 0x07, 0xF9, 0xFC, 0x00, 0xFE, 0x7F, 0x00, 0x3F,
|
||||
0xBF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00,
|
||||
0x1F, 0xDF, 0x80, 0x07, 0xF7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x7F,
|
||||
0x80, 0x7F, 0x8F, 0xF8, 0x7F, 0xC1, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8,
|
||||
0x07, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0xFE, 0x7F,
|
||||
0xE0, 0x7F, 0x7F, 0xF8, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF,
|
||||
0xFF, 0xE7, 0xFE, 0x0F, 0xFB, 0xFE, 0x03, 0xFD, 0xFE, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0xFF,
|
||||
0xFF, 0x80, 0xFF, 0x7F, 0xF0, 0xFF, 0xBF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFF, 0xC7, 0xF7, 0xFF, 0x83, 0xF9, 0xFF, 0x01, 0xFC, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01,
|
||||
0xFF, 0x9F, 0xC1, 0xFF, 0xF7, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF,
|
||||
0x3F, 0xFF, 0xFF, 0xCF, 0xF8, 0x7F, 0xF7, 0xF8, 0x07, 0xFD, 0xFC, 0x00,
|
||||
0xFF, 0x7F, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xF7, 0xF0, 0x03, 0xFD,
|
||||
0xFC, 0x00, 0xFF, 0x7F, 0x80, 0x7F, 0xCF, 0xF8, 0x7F, 0xF3, 0xFF, 0xFF,
|
||||
0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xF7, 0xF0, 0x1F,
|
||||
0xF1, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x01, 0xFC, 0xFE, 0x3F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x0F, 0xE0, 0x3F,
|
||||
0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F,
|
||||
0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0x07, 0xFF, 0xC0,
|
||||
0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0x00,
|
||||
0x63, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x1F,
|
||||
0xFF, 0xE0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x3F,
|
||||
0xE0, 0x00, 0x7F, 0x20, 0x03, 0xFB, 0xC0, 0x1F, 0xDF, 0xFF, 0xFD, 0xFF,
|
||||
0xFF, 0xEF, 0xFF, 0xFE, 0x3F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x0F, 0xE0,
|
||||
0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x3F, 0xFF, 0xCF,
|
||||
0xFF, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0xFE, 0x00, 0x3F,
|
||||
0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0,
|
||||
0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00,
|
||||
0xFF, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0x81, 0xFF, 0xE0, 0x3F, 0xFC, 0x03,
|
||||
0xFE, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF0, 0x03,
|
||||
0xFF, 0xE0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x3F,
|
||||
0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF0, 0x03, 0xFF,
|
||||
0xE0, 0x07, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFF,
|
||||
0x01, 0xFE, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF3, 0xFF,
|
||||
0xFF, 0xE3, 0xFF, 0xEF, 0xC1, 0xFF, 0x1F, 0x80, 0xFE, 0x00, 0x1F, 0xFF,
|
||||
0x80, 0x07, 0xE7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0x00, 0x3F,
|
||||
0x0F, 0xE0, 0x1F, 0xC3, 0xF8, 0x07, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0,
|
||||
0xFC, 0x03, 0xF0, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0x87, 0xE0, 0x07,
|
||||
0xF3, 0xF8, 0x01, 0xFC, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0x80,
|
||||
0x01, 0xFF, 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x03, 0xFF,
|
||||
0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0xFE,
|
||||
0x00, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x7F, 0x00, 0x3F, 0x7E, 0x00, 0x7F,
|
||||
0x00, 0x7E, 0x7F, 0x00, 0xFF, 0x00, 0x7E, 0x3F, 0x00, 0xFF, 0x80, 0x7E,
|
||||
0x3F, 0x01, 0xFF, 0x80, 0xFC, 0x3F, 0x81, 0xFF, 0xC0, 0xFC, 0x1F, 0x81,
|
||||
0xFF, 0xC0, 0xF8, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x0F, 0xC3, 0xF7, 0xE1,
|
||||
0xF8, 0x0F, 0xC3, 0xF7, 0xE3, 0xF0, 0x0F, 0xC7, 0xE7, 0xE3, 0xF0, 0x07,
|
||||
0xE7, 0xE3, 0xF3, 0xF0, 0x07, 0xE7, 0xC3, 0xF7, 0xE0, 0x07, 0xEF, 0xC3,
|
||||
0xF7, 0xE0, 0x03, 0xFF, 0xC1, 0xFF, 0xE0, 0x03, 0xFF, 0x81, 0xFF, 0xC0,
|
||||
0x03, 0xFF, 0x81, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF,
|
||||
0x00, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0xFE, 0x00, 0x7F,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x9F, 0xC0, 0x3F,
|
||||
0x8F, 0xF0, 0x3F, 0x83, 0xFC, 0x3F, 0x80, 0xFE, 0x3F, 0xC0, 0x3F, 0x9F,
|
||||
0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x7F,
|
||||
0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x0F,
|
||||
0xFE, 0x00, 0x07, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x07, 0xF7, 0xF8, 0x07,
|
||||
0xF9, 0xFC, 0x03, 0xF8, 0x7F, 0x03, 0xF8, 0x3F, 0xC3, 0xF8, 0x0F, 0xF3,
|
||||
0xFC, 0x03, 0xF9, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07,
|
||||
0xE7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0x80, 0x3F, 0x0F, 0xE0,
|
||||
0x1F, 0xC3, 0xF8, 0x07, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFC, 0x03,
|
||||
0xF8, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0x87, 0xE0, 0x07, 0xF3, 0xF8,
|
||||
0x01, 0xFC, 0xFC, 0x00, 0x3F, 0xBF, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0xFF,
|
||||
0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00,
|
||||
0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x08, 0x3F, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF,
|
||||
0xF7, 0xFF, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00,
|
||||
0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0xC0,
|
||||
0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC,
|
||||
0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xE0, 0x00, 0xFC, 0x0F, 0xF0, 0x7F, 0xC3, 0xFF, 0x0F, 0xFC,
|
||||
0x3F, 0xC0, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0,
|
||||
0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x0F, 0xFC,
|
||||
0x3F, 0xE0, 0xFF, 0x03, 0xFE, 0x0F, 0xFC, 0x07, 0xF0, 0x0F, 0xC0, 0x3F,
|
||||
0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
||||
0xC0, 0x3F, 0x80, 0xFE, 0x03, 0xFF, 0x0F, 0xFC, 0x1F, 0xF0, 0x3F, 0xC0,
|
||||
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFC, 0x0F, 0xF8,
|
||||
0x3F, 0xE0, 0xFF, 0xC1, 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xC0, 0x3F,
|
||||
0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
||||
0xC0, 0x3F, 0xC0, 0xFF, 0xC1, 0xFF, 0x03, 0xFC, 0x3F, 0xF0, 0xFF, 0xC3,
|
||||
0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00,
|
||||
0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x03, 0xFC, 0x3F, 0xF0, 0xFF, 0xC3,
|
||||
0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x7C, 0xFF, 0x81, 0xF7, 0xFF,
|
||||
0x87, 0x9F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFB, 0xE1, 0xFF, 0xCF, 0x81, 0xFE,
|
||||
0x3C, 0x03, 0xF0 };
|
||||
|
||||
const GFXglyph Montserrat_Bold22pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 12, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 8, 30, 12, 2, -29 }, // 0x21 '!'
|
||||
{ 31, 15, 12, 19, 2, -29 }, // 0x22 '"'
|
||||
{ 54, 29, 30, 31, 1, -29 }, // 0x23 '#'
|
||||
{ 163, 25, 40, 27, 1, -34 }, // 0x24 '$'
|
||||
{ 288, 36, 30, 38, 1, -29 }, // 0x25 '%'
|
||||
{ 423, 28, 31, 31, 2, -29 }, // 0x26 '&'
|
||||
{ 532, 6, 12, 10, 2, -29 }, // 0x27 '''
|
||||
{ 541, 12, 40, 15, 3, -31 }, // 0x28 '('
|
||||
{ 601, 12, 40, 15, 0, -31 }, // 0x29 ')'
|
||||
{ 661, 17, 17, 19, 1, -31 }, // 0x2A '*'
|
||||
{ 698, 20, 20, 26, 3, -24 }, // 0x2B '+'
|
||||
{ 748, 9, 15, 11, 1, -7 }, // 0x2C ','
|
||||
{ 765, 12, 6, 17, 2, -14 }, // 0x2D '-'
|
||||
{ 774, 9, 8, 11, 1, -7 }, // 0x2E '.'
|
||||
{ 783, 20, 40, 17, -1, -35 }, // 0x2F '/'
|
||||
{ 883, 25, 32, 29, 2, -30 }, // 0x30 '0'
|
||||
{ 983, 13, 30, 17, 0, -29 }, // 0x31 '1'
|
||||
{ 1032, 24, 31, 25, 0, -30 }, // 0x32 '2'
|
||||
{ 1125, 24, 31, 25, 0, -29 }, // 0x33 '3'
|
||||
{ 1218, 28, 30, 30, 1, -29 }, // 0x34 '4'
|
||||
{ 1323, 24, 31, 26, 0, -29 }, // 0x35 '5'
|
||||
{ 1416, 25, 32, 27, 2, -30 }, // 0x36 '6'
|
||||
{ 1516, 24, 30, 27, 1, -29 }, // 0x37 '7'
|
||||
{ 1606, 26, 32, 28, 1, -30 }, // 0x38 '8'
|
||||
{ 1710, 25, 32, 27, 1, -30 }, // 0x39 '9'
|
||||
{ 1810, 9, 23, 11, 1, -22 }, // 0x3A ':'
|
||||
{ 1836, 9, 30, 11, 1, -22 }, // 0x3B ';'
|
||||
{ 1870, 20, 22, 26, 3, -25 }, // 0x3C '<'
|
||||
{ 1925, 20, 16, 26, 3, -22 }, // 0x3D '='
|
||||
{ 1965, 20, 22, 26, 3, -25 }, // 0x3E '>'
|
||||
{ 2020, 23, 31, 25, 0, -30 }, // 0x3F '?'
|
||||
{ 2110, 41, 40, 45, 2, -30 }, // 0x40 '@'
|
||||
{ 2315, 33, 30, 33, 0, -29 }, // 0x41 'A'
|
||||
{ 2439, 27, 30, 33, 4, -29 }, // 0x42 'B'
|
||||
{ 2541, 28, 32, 31, 2, -30 }, // 0x43 'C'
|
||||
{ 2653, 30, 30, 36, 4, -29 }, // 0x44 'D'
|
||||
{ 2766, 23, 30, 29, 4, -29 }, // 0x45 'E'
|
||||
{ 2853, 22, 30, 27, 4, -29 }, // 0x46 'F'
|
||||
{ 2936, 29, 32, 33, 2, -30 }, // 0x47 'G'
|
||||
{ 3052, 27, 30, 35, 4, -29 }, // 0x48 'H'
|
||||
{ 3154, 7, 30, 14, 4, -29 }, // 0x49 'I'
|
||||
{ 3181, 21, 31, 23, -1, -29 }, // 0x4A 'J'
|
||||
{ 3263, 28, 30, 32, 4, -29 }, // 0x4B 'K'
|
||||
{ 3368, 22, 30, 26, 4, -29 }, // 0x4C 'L'
|
||||
{ 3451, 34, 30, 41, 4, -29 }, // 0x4D 'M'
|
||||
{ 3579, 27, 30, 35, 4, -29 }, // 0x4E 'N'
|
||||
{ 3681, 33, 32, 36, 2, -30 }, // 0x4F 'O'
|
||||
{ 3813, 26, 30, 31, 4, -29 }, // 0x50 'P'
|
||||
{ 3911, 34, 38, 36, 2, -30 }, // 0x51 'Q'
|
||||
{ 4073, 26, 30, 32, 4, -29 }, // 0x52 'R'
|
||||
{ 4171, 25, 32, 27, 1, -30 }, // 0x53 'S'
|
||||
{ 4271, 26, 30, 27, 0, -29 }, // 0x54 'T'
|
||||
{ 4369, 28, 31, 34, 3, -29 }, // 0x55 'U'
|
||||
{ 4478, 33, 30, 32, 0, -29 }, // 0x56 'V'
|
||||
{ 4602, 48, 30, 50, 1, -29 }, // 0x57 'W'
|
||||
{ 4782, 31, 30, 31, 0, -29 }, // 0x58 'X'
|
||||
{ 4899, 31, 30, 29, -1, -29 }, // 0x59 'Y'
|
||||
{ 5016, 26, 30, 29, 2, -29 }, // 0x5A 'Z'
|
||||
{ 5114, 11, 40, 16, 4, -31 }, // 0x5B '['
|
||||
{ 5169, 20, 40, 17, -2, -35 }, // 0x5C '\'
|
||||
{ 5269, 11, 40, 16, 1, -31 }, // 0x5D ']'
|
||||
{ 5324, 21, 18, 26, 2, -23 }, // 0x5E '^'
|
||||
{ 5372, 22, 4, 22, 0, 1 }, // 0x5F '_'
|
||||
{ 5383, 13, 6, 26, 4, -31 }, // 0x60 '`'
|
||||
{ 5393, 22, 23, 27, 2, -22 }, // 0x61 'a'
|
||||
{ 5457, 25, 32, 30, 3, -31 }, // 0x62 'b'
|
||||
{ 5557, 24, 23, 25, 1, -22 }, // 0x63 'c'
|
||||
{ 5626, 26, 32, 30, 1, -31 }, // 0x64 'd'
|
||||
{ 5730, 25, 23, 27, 1, -22 }, // 0x65 'e'
|
||||
{ 5802, 18, 32, 17, 0, -31 }, // 0x66 'f'
|
||||
{ 5874, 26, 32, 30, 1, -22 }, // 0x67 'g'
|
||||
{ 5978, 24, 32, 30, 3, -31 }, // 0x68 'h'
|
||||
{ 6074, 8, 34, 13, 3, -33 }, // 0x69 'i'
|
||||
{ 6108, 15, 43, 13, -4, -33 }, // 0x6A 'j'
|
||||
{ 6189, 25, 32, 28, 3, -31 }, // 0x6B 'k'
|
||||
{ 6289, 7, 32, 13, 3, -31 }, // 0x6C 'l'
|
||||
{ 6317, 39, 23, 45, 3, -22 }, // 0x6D 'm'
|
||||
{ 6430, 24, 23, 30, 3, -22 }, // 0x6E 'n'
|
||||
{ 6499, 26, 23, 28, 1, -22 }, // 0x6F 'o'
|
||||
{ 6574, 25, 31, 30, 3, -22 }, // 0x70 'p'
|
||||
{ 6671, 26, 31, 30, 1, -22 }, // 0x71 'q'
|
||||
{ 6772, 14, 23, 19, 3, -22 }, // 0x72 'r'
|
||||
{ 6813, 21, 23, 23, 1, -22 }, // 0x73 's'
|
||||
{ 6874, 18, 28, 19, 0, -27 }, // 0x74 't'
|
||||
{ 6937, 23, 23, 30, 3, -22 }, // 0x75 'u'
|
||||
{ 7004, 26, 23, 26, 0, -22 }, // 0x76 'v'
|
||||
{ 7079, 40, 23, 40, 0, -22 }, // 0x77 'w'
|
||||
{ 7194, 25, 23, 26, 0, -22 }, // 0x78 'x'
|
||||
{ 7266, 26, 32, 26, 0, -22 }, // 0x79 'y'
|
||||
{ 7370, 21, 23, 23, 1, -22 }, // 0x7A 'z'
|
||||
{ 7431, 14, 40, 17, 2, -31 }, // 0x7B '{'
|
||||
{ 7501, 6, 40, 13, 4, -31 }, // 0x7C '|'
|
||||
{ 7531, 14, 40, 17, 1, -31 }, // 0x7D '}'
|
||||
{ 7601, 22, 8, 26, 2, -18 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold22pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold22pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold22pt7bGlyphs,
|
||||
0x20, 0x7E, 53 };
|
||||
|
||||
// Approx. 8295 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD22PT7B_H
|
||||
@@ -0,0 +1,873 @@
|
||||
#ifndef MONTSERRATBOLD24PT7B_H
|
||||
#define MONTSERRATBOLD24PT7B_H
|
||||
const uint8_t Montserrat_Bold24pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF,
|
||||
0xDF, 0xCF, 0xE7, 0xF3, 0xF9, 0xFC, 0xFE, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3,
|
||||
0xF1, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0xCF, 0xFF, 0xFF, 0xFD, 0xFE,
|
||||
0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x0F, 0xDF, 0x87, 0xEF,
|
||||
0xC3, 0xF7, 0xE1, 0xF9, 0xF0, 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F,
|
||||
0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC1, 0xF0, 0x00, 0x7C, 0x07, 0xE0, 0x00,
|
||||
0x7C, 0x07, 0xE0, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x7C, 0x07, 0xC0, 0x00,
|
||||
0x7C, 0x07, 0xC0, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0xFC, 0x07, 0xC0, 0x00,
|
||||
0xFC, 0x0F, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0xF8, 0x0F, 0x80, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF8, 0x1F, 0x80, 0x01,
|
||||
0xF0, 0x1F, 0x80, 0x01, 0xF0, 0x1F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x01,
|
||||
0xF0, 0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0x03,
|
||||
0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x03,
|
||||
0xE0, 0x3E, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07,
|
||||
0xE0, 0x7E, 0x00, 0x07, 0xE0, 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
|
||||
0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80,
|
||||
0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xF8, 0x0F,
|
||||
0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
|
||||
0xF8, 0x3F, 0xCF, 0x8F, 0x87, 0xF8, 0xF8, 0x30, 0x7F, 0x8F, 0x80, 0x07,
|
||||
0xF8, 0xF8, 0x00, 0x7F, 0x8F, 0x80, 0x07, 0xFC, 0xF8, 0x00, 0x7F, 0xFF,
|
||||
0x80, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xC0,
|
||||
0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, 0x00,
|
||||
0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xF9, 0xFF, 0x00, 0x0F, 0x8F,
|
||||
0xF0, 0x00, 0xF8, 0xFF, 0x10, 0x0F, 0x8F, 0xF3, 0x80, 0xF8, 0xFE, 0x3F,
|
||||
0x0F, 0x9F, 0xE7, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF,
|
||||
0xF8, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xF8, 0x00,
|
||||
0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F,
|
||||
0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x0F, 0x80, 0x3F, 0xF8, 0x00, 0x3F, 0x00, 0xFF, 0xF8, 0x00, 0xFC, 0x01,
|
||||
0xFF, 0xF0, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x07, 0xE0, 0x0F, 0x83, 0xE0,
|
||||
0x1F, 0x80, 0x3E, 0x03, 0xC0, 0x3E, 0x00, 0x7C, 0x07, 0xC0, 0xFC, 0x00,
|
||||
0xF8, 0x0F, 0x83, 0xF0, 0x01, 0xF0, 0x1F, 0x07, 0xC0, 0x03, 0xE0, 0x3C,
|
||||
0x1F, 0x80, 0x03, 0xC0, 0x78, 0x7E, 0x00, 0x07, 0xC1, 0xF0, 0xF8, 0x00,
|
||||
0x0F, 0xC7, 0xE3, 0xE0, 0x00, 0x0F, 0xFF, 0x8F, 0xC0, 0x00, 0x0F, 0xFE,
|
||||
0x1F, 0x03, 0xC0, 0x0F, 0xF8, 0x7C, 0x3F, 0xE0, 0x07, 0xC1, 0xF8, 0xFF,
|
||||
0xE0, 0x00, 0x07, 0xE3, 0xFF, 0xE0, 0x00, 0x0F, 0x87, 0xC7, 0xE0, 0x00,
|
||||
0x3F, 0x1F, 0x07, 0xC0, 0x00, 0xFC, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x78,
|
||||
0x0F, 0x80, 0x07, 0xE0, 0xF0, 0x1F, 0x00, 0x1F, 0x81, 0xE0, 0x3E, 0x00,
|
||||
0x3E, 0x03, 0xC0, 0x7C, 0x00, 0xFC, 0x07, 0xC0, 0xF8, 0x03, 0xF0, 0x0F,
|
||||
0x81, 0xF0, 0x07, 0xC0, 0x1F, 0x87, 0xC0, 0x1F, 0x80, 0x1F, 0xFF, 0x80,
|
||||
0x7E, 0x00, 0x1F, 0xFE, 0x00, 0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xF0, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x0F, 0xFF,
|
||||
0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xE0, 0x01, 0xFC, 0x1F,
|
||||
0xC0, 0x03, 0xF0, 0x1F, 0x80, 0x07, 0xE0, 0x3F, 0x00, 0x0F, 0xC0, 0x7E,
|
||||
0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x7F, 0xBF, 0xE0,
|
||||
0x00, 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00,
|
||||
0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xC0, 0xC0, 0x3F, 0xFF, 0xC1, 0xF0,
|
||||
0xFF, 0xFF, 0xC3, 0xF3, 0xFC, 0x7F, 0xC7, 0xE7, 0xF0, 0x7F, 0xDF, 0xDF,
|
||||
0xC0, 0x7F, 0xFF, 0x3F, 0x80, 0x7F, 0xFE, 0x7F, 0x00, 0x7F, 0xF8, 0xFE,
|
||||
0x00, 0x7F, 0xF1, 0xFC, 0x00, 0x7F, 0xE3, 0xFC, 0x00, 0xFF, 0xE7, 0xFE,
|
||||
0x0F, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF,
|
||||
0xFF, 0x3F, 0x07, 0xFF, 0xFC, 0x3C, 0x03, 0xFF, 0xE0, 0x30, 0x00, 0x30,
|
||||
0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xEF, 0xDF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3,
|
||||
0xE7, 0xC0, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x1F, 0xE0, 0xFE, 0x0F, 0xF0,
|
||||
0x7F, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x7F, 0x07, 0xF8, 0x3F,
|
||||
0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0,
|
||||
0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07,
|
||||
0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F,
|
||||
0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x3F, 0x81, 0xFC,
|
||||
0x07, 0xF0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, 0xFC, 0x0F, 0xE0,
|
||||
0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03,
|
||||
0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F,
|
||||
0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0,
|
||||
0x3F, 0x81, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x1F,
|
||||
0xE0, 0xFE, 0x07, 0xF0, 0x7F, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x1F, 0xC0,
|
||||
0xFE, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x30, 0xF0, 0xC7,
|
||||
0x9E, 0x3D, 0xFB, 0xDF, 0xBF, 0xFF, 0xFB, 0xFF, 0xFC, 0x1F, 0xFE, 0x00,
|
||||
0xFF, 0x80, 0x7F, 0xFC, 0x3F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xDF, 0x9C,
|
||||
0x78, 0xE1, 0x0F, 0x04, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00,
|
||||
0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00,
|
||||
0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03,
|
||||
0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x1C, 0x3F,
|
||||
0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0x1F, 0x0F, 0x8F, 0xC7,
|
||||
0xC3, 0xE1, 0xE1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF0, 0x18, 0x3F, 0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE,
|
||||
0x7E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0x7E, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xFC,
|
||||
0x00, 0x07, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F,
|
||||
0x80, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x80, 0x00,
|
||||
0xFE, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x1F, 0x80, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF,
|
||||
0x80, 0x07, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x01,
|
||||
0xFF, 0xFF, 0xF8, 0x3F, 0xF0, 0xFF, 0xC3, 0xFC, 0x03, 0xFC, 0x7F, 0x80,
|
||||
0x1F, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0xFF,
|
||||
0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F,
|
||||
0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF,
|
||||
0x00, 0x0F, 0xE7, 0xF8, 0x01, 0xFE, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03,
|
||||
0xFC, 0x3F, 0xE0, 0x7F, 0xC1, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x80,
|
||||
0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF,
|
||||
0xE0, 0x00, 0x00, 0x60, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC,
|
||||
0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01,
|
||||
0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F,
|
||||
0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0,
|
||||
0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0x01, 0xFF,
|
||||
0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xFF, 0xE7, 0xF8, 0x1F, 0xF8, 0x78, 0x01, 0xFE, 0x0C, 0x00, 0x7F,
|
||||
0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xFC, 0x00,
|
||||
0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0,
|
||||
0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFC,
|
||||
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x8F, 0xFF,
|
||||
0xFF, 0xE3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0x8F,
|
||||
0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF,
|
||||
0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0x3F, 0xCE, 0x00, 0x1F, 0xF3, 0xF0, 0x0F, 0xF9, 0xFF,
|
||||
0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE0,
|
||||
0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xE0, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xF8,
|
||||
0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x01, 0xFE, 0x0F, 0xF0, 0x07, 0xFC, 0x1F, 0xE0,
|
||||
0x0F, 0xF0, 0x3F, 0xC0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x80, 0xFF, 0x01,
|
||||
0xFE, 0x01, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00,
|
||||
0x03, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
|
||||
0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x1F,
|
||||
0xFF, 0xFF, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFF,
|
||||
0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8,
|
||||
0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x3F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8,
|
||||
0x00, 0x00, 0xFF, 0x10, 0x00, 0x1F, 0xE3, 0x80, 0x07, 0xF8, 0xFC, 0x01,
|
||||
0xFF, 0x1F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x1F,
|
||||
0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0x80,
|
||||
0x00, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFE, 0x03,
|
||||
0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFE, 0x01,
|
||||
0x81, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE,
|
||||
0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xF0, 0x3C, 0x01, 0xFE, 0x7F, 0xF0,
|
||||
0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
|
||||
0xFF, 0xFB, 0xFF, 0xC1, 0xFF, 0x7F, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, 0xFF,
|
||||
0xFF, 0x00, 0x3F, 0xFF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, 0x7F, 0x80,
|
||||
0x1F, 0xEF, 0xF0, 0x03, 0xFC, 0xFF, 0x00, 0xFF, 0x1F, 0xF8, 0x7F, 0xE1,
|
||||
0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF,
|
||||
0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xF7, 0xF0, 0x03, 0xFE, 0xFE,
|
||||
0x00, 0x7F, 0x9F, 0xC0, 0x1F, 0xF3, 0xF8, 0x03, 0xFC, 0x7F, 0x00, 0x7F,
|
||||
0x80, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07,
|
||||
0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF8, 0x00,
|
||||
0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE,
|
||||
0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00,
|
||||
0x01, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xFF,
|
||||
0xFF, 0x83, 0xFF, 0xFF, 0xF8, 0xFF, 0xC1, 0xFF, 0x9F, 0xF0, 0x0F, 0xF3,
|
||||
0xFC, 0x01, 0xFE, 0x7F, 0x00, 0x1F, 0xCF, 0xE0, 0x03, 0xF9, 0xFE, 0x00,
|
||||
0xFF, 0x3F, 0xC0, 0x1F, 0xE3, 0xFC, 0x07, 0xF8, 0x7F, 0xFF, 0xFF, 0x07,
|
||||
0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF,
|
||||
0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xC0, 0x1F, 0xEF, 0xF0, 0x01, 0xFF, 0xFE,
|
||||
0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x1F,
|
||||
0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0xFF, 0xBF, 0xF0, 0x7F, 0xE7, 0xFF,
|
||||
0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0,
|
||||
0x01, 0xFF, 0xF0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFF,
|
||||
0xFE, 0x00, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xF0,
|
||||
0xFF, 0xC3, 0xFF, 0x1F, 0xE0, 0x1F, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0x00,
|
||||
0x3F, 0xDF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x1F, 0xFF,
|
||||
0xF0, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xDF, 0xF0, 0x3F, 0xFB, 0xFF, 0xFF,
|
||||
0xFF, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x81,
|
||||
0xFF, 0xCF, 0xF0, 0x07, 0xC1, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xF0, 0x20,
|
||||
0x0F, 0xFC, 0x0F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x0C,
|
||||
0x00, 0x00, 0x18, 0x3F, 0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0x7E,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1F, 0x9F,
|
||||
0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x3F, 0x00, 0x18, 0x3F, 0x3F, 0xDF,
|
||||
0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x0E, 0x1F, 0x9F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x1F, 0x8F, 0x87, 0xC7, 0xE3, 0xE1, 0xF0, 0xF0, 0xF8, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0x00, 0x3F, 0xFC,
|
||||
0x03, 0xFF, 0xF0, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0xFF, 0xFE, 0x03, 0xFF,
|
||||
0xC0, 0x0F, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0xC0,
|
||||
0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xF0,
|
||||
0x03, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFC, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xE0, 0x00,
|
||||
0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x01,
|
||||
0xFF, 0xFC, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x00, 0x07,
|
||||
0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0x83,
|
||||
0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0xE0, 0x00, 0xFE, 0x00, 0x03, 0xC0,
|
||||
0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x07,
|
||||
0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD,
|
||||
0xFE, 0x03, 0xFE, 0x3C, 0x00, 0xFF, 0x0C, 0x00, 0x7F, 0x80, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFC, 0x00,
|
||||
0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF8, 0x00,
|
||||
0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
||||
0x1F, 0xFC, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x1F,
|
||||
0xE0, 0x00, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x0F, 0xC0,
|
||||
0x00, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x0F, 0xC0, 0x3F,
|
||||
0xE3, 0xF1, 0xF0, 0x7E, 0x03, 0xFF, 0xDF, 0x87, 0xC7, 0xE0, 0x7F, 0xFF,
|
||||
0xFC, 0x3E, 0x3F, 0x07, 0xFF, 0xFF, 0xE0, 0xF9, 0xF0, 0x3F, 0xFF, 0xFF,
|
||||
0x07, 0xDF, 0x83, 0xFE, 0x0F, 0xF8, 0x3E, 0xFC, 0x1F, 0xC0, 0x3F, 0xC0,
|
||||
0xFF, 0xC1, 0xFC, 0x00, 0xFE, 0x07, 0xFE, 0x0F, 0xE0, 0x03, 0xF0, 0x3F,
|
||||
0xF0, 0x7F, 0x00, 0x1F, 0x81, 0xFF, 0x83, 0xF0, 0x00, 0xFC, 0x0F, 0xFC,
|
||||
0x1F, 0x80, 0x07, 0xE0, 0x7F, 0xE0, 0xFC, 0x00, 0x3F, 0x03, 0xFF, 0x07,
|
||||
0xF0, 0x01, 0xF8, 0x1F, 0xF8, 0x3F, 0x80, 0x1F, 0xC0, 0xF7, 0xE1, 0xFC,
|
||||
0x00, 0xFE, 0x0F, 0xBF, 0x07, 0xF0, 0x0F, 0xF0, 0x7C, 0xF8, 0x3F, 0xE1,
|
||||
0xFF, 0xC7, 0xE7, 0xE0, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0x07, 0xFF, 0xFF,
|
||||
0xFF, 0xE0, 0xFC, 0x1F, 0xFF, 0xDF, 0xFF, 0x07, 0xE0, 0x3F, 0xFC, 0x7F,
|
||||
0xF0, 0x1F, 0x80, 0xFF, 0x81, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xC0, 0x07, 0x80, 0x00, 0x03,
|
||||
0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F,
|
||||
0xFF, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03,
|
||||
0xE0, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00,
|
||||
0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01,
|
||||
0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x03, 0xF9, 0xFC, 0x00,
|
||||
0x00, 0x3F, 0x9F, 0xC0, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x00, 0x7F, 0x0F,
|
||||
0xE0, 0x00, 0x0F, 0xE0, 0xFF, 0x00, 0x00, 0xFE, 0x07, 0xF0, 0x00, 0x1F,
|
||||
0xE0, 0x7F, 0x80, 0x01, 0xFC, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x3F, 0xC0,
|
||||
0x03, 0xF8, 0x03, 0xFC, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xFF, 0xFF,
|
||||
0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||
0x3F, 0xC0, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x03, 0xFC, 0x3F, 0x80, 0x00,
|
||||
0x1F, 0xC7, 0xF8, 0x00, 0x01, 0xFE, 0x7F, 0x00, 0x00, 0x1F, 0xEF, 0xF0,
|
||||
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0xFF, 0xFF, 0xF8, 0x03,
|
||||
0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF0, 0xFF,
|
||||
0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xCF, 0xE0, 0x01, 0xFF, 0x3F, 0x80,
|
||||
0x03, 0xFC, 0xFE, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x00,
|
||||
0x7F, 0x3F, 0x80, 0x03, 0xFC, 0xFE, 0x00, 0x1F, 0xF3, 0xF8, 0x03, 0xFF,
|
||||
0x8F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC3,
|
||||
0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x3F, 0x80, 0x07, 0xFE, 0xFE,
|
||||
0x00, 0x07, 0xFB, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x00,
|
||||
0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xC0,
|
||||
0x1F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xC7,
|
||||
0xFF, 0x81, 0xFF, 0x1F, 0xF8, 0x00, 0x7C, 0x3F, 0xE0, 0x00, 0x70, 0xFF,
|
||||
0x80, 0x00, 0x41, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x80,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00,
|
||||
0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x10, 0x3F, 0xE0, 0x00,
|
||||
0x70, 0x7F, 0xE0, 0x01, 0xF0, 0x7F, 0xF0, 0x0F, 0xF0, 0x7F, 0xFF, 0xFF,
|
||||
0xF0, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFC,
|
||||
0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0xA0, 0x00,
|
||||
0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xE0,
|
||||
0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF,
|
||||
0xC3, 0xFC, 0x03, 0xFF, 0xF1, 0xFE, 0x00, 0x1F, 0xF8, 0xFF, 0x00, 0x03,
|
||||
0xFE, 0x7F, 0x80, 0x00, 0xFF, 0xBF, 0xC0, 0x00, 0x3F, 0xDF, 0xE0, 0x00,
|
||||
0x1F, 0xEF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00,
|
||||
0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80,
|
||||
0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0,
|
||||
0x00, 0x07, 0xFF, 0xF8, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x03, 0xFD, 0xFE,
|
||||
0x00, 0x03, 0xFE, 0xFF, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x07, 0xFF, 0x3F,
|
||||
0xC0, 0x1F, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x07,
|
||||
0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFC, 0x00,
|
||||
0xFF, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xFF, 0xFF,
|
||||
0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF,
|
||||
0xFF, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFE,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F,
|
||||
0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01,
|
||||
0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF,
|
||||
0x9F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xE7, 0xF8, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0,
|
||||
0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF,
|
||||
0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF,
|
||||
0xFC, 0x07, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFE, 0x03,
|
||||
0xFC, 0x3F, 0xF0, 0x00, 0xF8, 0x3F, 0xE0, 0x00, 0x70, 0x7F, 0xC0, 0x00,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00,
|
||||
0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x80, 0x00,
|
||||
0xFE, 0x7F, 0x80, 0x00, 0xFE, 0x7F, 0xC0, 0x00, 0xFE, 0x3F, 0xE0, 0x00,
|
||||
0xFE, 0x3F, 0xF0, 0x00, 0xFE, 0x1F, 0xFC, 0x03, 0xFE, 0x0F, 0xFF, 0xFF,
|
||||
0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF,
|
||||
0xF8, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x70,
|
||||
0x00, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F,
|
||||
0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF,
|
||||
0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC,
|
||||
0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00,
|
||||
0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF,
|
||||
0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC,
|
||||
0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00,
|
||||
0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00,
|
||||
0xFF, 0xFF, 0x00, 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0x7F,
|
||||
0xFF, 0xF0, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, 0x80, 0x00,
|
||||
0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF,
|
||||
0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x08,
|
||||
0x01, 0xFE, 0x38, 0x07, 0xF8, 0xFC, 0x1F, 0xF3, 0xFF, 0xFF, 0xEF, 0xFF,
|
||||
0xFF, 0x8F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x07, 0xFF,
|
||||
0x80, 0x00, 0x70, 0x00, 0xFE, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x0F, 0xF3,
|
||||
0xF8, 0x00, 0x3F, 0xC7, 0xF0, 0x00, 0xFF, 0x0F, 0xE0, 0x03, 0xFC, 0x1F,
|
||||
0xC0, 0x0F, 0xF0, 0x3F, 0x80, 0x3F, 0xE0, 0x7F, 0x00, 0xFF, 0x80, 0xFE,
|
||||
0x03, 0xFE, 0x01, 0xFC, 0x0F, 0xF8, 0x03, 0xF8, 0x3F, 0xE0, 0x07, 0xF0,
|
||||
0xFF, 0x80, 0x0F, 0xE3, 0xFE, 0x00, 0x1F, 0xCF, 0xF8, 0x00, 0x3F, 0xBF,
|
||||
0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF,
|
||||
0xC0, 0x03, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF,
|
||||
0x80, 0x1F, 0xFC, 0xFF, 0x80, 0x3F, 0xF0, 0xFF, 0x80, 0x7F, 0xC0, 0xFF,
|
||||
0x80, 0xFF, 0x01, 0xFF, 0x81, 0xFC, 0x01, 0xFF, 0x03, 0xF8, 0x01, 0xFF,
|
||||
0x07, 0xF0, 0x01, 0xFF, 0x0F, 0xE0, 0x01, 0xFF, 0x1F, 0xC0, 0x01, 0xFF,
|
||||
0x3F, 0x80, 0x03, 0xFE, 0x7F, 0x00, 0x03, 0xFE, 0xFE, 0x00, 0x03, 0xFE,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x1F,
|
||||
0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00,
|
||||
0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF,
|
||||
0xFC, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0x80, 0x03,
|
||||
0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFB, 0xF8, 0x0F, 0xEF,
|
||||
0xFF, 0xDF, 0xC0, 0xFE, 0x7F, 0xFE, 0x7F, 0x07, 0xF3, 0xFF, 0xF3, 0xFC,
|
||||
0x7F, 0x1F, 0xFF, 0x8F, 0xE3, 0xF8, 0xFF, 0xFC, 0x3F, 0xBF, 0x87, 0xFF,
|
||||
0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0x07, 0xFF, 0xC1, 0xFF, 0xF8, 0x3F, 0xFC,
|
||||
0x0F, 0xFF, 0xC0, 0xFF, 0xE0, 0x7F, 0xFE, 0x03, 0xFE, 0x03, 0xFF, 0xF0,
|
||||
0x1F, 0xF0, 0x1F, 0xFF, 0x80, 0x7F, 0x00, 0xFF, 0xFC, 0x03, 0xF0, 0x07,
|
||||
0xFF, 0xE0, 0x0F, 0x80, 0x3F, 0xFF, 0x00, 0x38, 0x01, 0xFF, 0xF8, 0x00,
|
||||
0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x03, 0xF8,
|
||||
0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x1F, 0xFF,
|
||||
0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFE,
|
||||
0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xF0,
|
||||
0x07, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0x01,
|
||||
0xFF, 0xFB, 0xFE, 0x07, 0xFF, 0xE7, 0xFC, 0x1F, 0xFF, 0x9F, 0xF8, 0x7F,
|
||||
0xFE, 0x3F, 0xF1, 0xFF, 0xF8, 0x7F, 0xC7, 0xFF, 0xE0, 0xFF, 0x9F, 0xFF,
|
||||
0x81, 0xFF, 0x7F, 0xFE, 0x03, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xE0,
|
||||
0x1F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF8, 0x00,
|
||||
0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFE, 0x00, 0x0F,
|
||||
0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x07, 0xFF, 0xFE,
|
||||
0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xFE, 0x07, 0xFF, 0x83,
|
||||
0xFF, 0x00, 0x1F, 0xF8, 0x3F, 0xE0, 0x00, 0x7F, 0xC7, 0xFC, 0x00, 0x03,
|
||||
0xFC, 0x7F, 0x80, 0x00, 0x3F, 0xE7, 0xF8, 0x00, 0x01, 0xFE, 0xFF, 0x00,
|
||||
0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF,
|
||||
0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0x1F, 0xE7, 0xF8, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0x3F, 0xE7,
|
||||
0xFC, 0x00, 0x03, 0xFC, 0x3F, 0xE0, 0x00, 0x7F, 0xC3, 0xFF, 0x00, 0x1F,
|
||||
0xF8, 0x1F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0xFF,
|
||||
0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x00,
|
||||
0x07, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x07, 0x00,
|
||||
0x00, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x0F,
|
||||
0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF, 0x01,
|
||||
0xFF, 0xEF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF,
|
||||
0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xF0,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x1F,
|
||||
0xFF, 0xF0, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF,
|
||||
0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE,
|
||||
0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x07,
|
||||
0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0x7F, 0xF8, 0x1F, 0xFE, 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x3F, 0xE0,
|
||||
0x00, 0x7F, 0xC3, 0xFE, 0x00, 0x01, 0xFE, 0x1F, 0xE0, 0x00, 0x0F, 0xF8,
|
||||
0xFF, 0x00, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00,
|
||||
0x07, 0xFB, 0xFC, 0x00, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x01, 0xFE, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x00, 0x7F, 0xBF, 0xC0, 0x00, 0x03,
|
||||
0xFD, 0xFE, 0x00, 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x01, 0xFE, 0x3F, 0xC0,
|
||||
0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x00, 0xFF, 0x8F, 0xF8, 0x00, 0x07, 0xF8,
|
||||
0x3F, 0xE0, 0x00, 0x7F, 0xC1, 0xFF, 0x80, 0x0F, 0xFC, 0x07, 0xFF, 0x01,
|
||||
0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x01,
|
||||
0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFC,
|
||||
0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFC, 0x03, 0x00, 0x00,
|
||||
0x3F, 0xF8, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xFF,
|
||||
0x80, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00,
|
||||
0x3F, 0xF8, 0x00, 0x00, 0x00, 0x08, 0x00, 0xFF, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF,
|
||||
0xFC, 0x7F, 0xFF, 0xFF, 0xF3, 0xFC, 0x07, 0xFF, 0x9F, 0xE0, 0x03, 0xFE,
|
||||
0xFF, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x7F, 0xBF, 0xC0, 0x01, 0xFD, 0xFE,
|
||||
0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x7F, 0x7F, 0x80, 0x03, 0xFB, 0xFC, 0x00,
|
||||
0x3F, 0xDF, 0xE0, 0x01, 0xFE, 0xFF, 0x00, 0x1F, 0xF7, 0xF8, 0x07, 0xFF,
|
||||
0x3F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, 0x7F,
|
||||
0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0x01,
|
||||
0xFE, 0x07, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xE1, 0xFE, 0x00, 0xFF,
|
||||
0x0F, 0xF0, 0x03, 0xFC, 0x7F, 0x80, 0x1F, 0xF3, 0xFC, 0x00, 0x7F, 0x9F,
|
||||
0xE0, 0x01, 0xFE, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x3F,
|
||||
0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF,
|
||||
0x83, 0xFF, 0xFF, 0xF8, 0x3F, 0xC0, 0x0F, 0x87, 0xF8, 0x00, 0x30, 0x7F,
|
||||
0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xFC, 0x00,
|
||||
0x00, 0x7F, 0xF0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x01,
|
||||
0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0xFF,
|
||||
0xFF, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x01, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x0F, 0xF3, 0x80,
|
||||
0x00, 0xFE, 0x3F, 0x00, 0x1F, 0xE7, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x03,
|
||||
0xFF, 0xF8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F,
|
||||
0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0,
|
||||
0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00,
|
||||
0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00,
|
||||
0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F,
|
||||
0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00,
|
||||
0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F,
|
||||
0xFF, 0xC0, 0x00, 0x7F, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF,
|
||||
0x80, 0x00, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80,
|
||||
0x03, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0x80, 0x0F,
|
||||
0xFB, 0xFE, 0x00, 0xFF, 0x9F, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xFF, 0xC3,
|
||||
0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x00, 0x7F,
|
||||
0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x50, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0x1F, 0xE7,
|
||||
0xF8, 0x00, 0x03, 0xFC, 0x7F, 0xC0, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x03,
|
||||
0xF8, 0x3F, 0xE0, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xE0,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x0F, 0xF0, 0x01, 0xFE, 0x00,
|
||||
0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x7F, 0xC0, 0x3F,
|
||||
0xC0, 0x03, 0xFC, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x7F, 0x80, 0x01, 0xFE,
|
||||
0x07, 0xF0, 0x00, 0x1F, 0xE0, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0xF0, 0x00,
|
||||
0x0F, 0xF0, 0xFE, 0x00, 0x00, 0xFF, 0x1F, 0xE0, 0x00, 0x07, 0xF9, 0xFC,
|
||||
0x00, 0x00, 0x7F, 0xBF, 0xC0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x3F,
|
||||
0xFF, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00,
|
||||
0x01, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0xE0,
|
||||
0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x03,
|
||||
0xFC, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF7, 0xF8, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x3F, 0x9F, 0xE0, 0x00, 0xFF, 0x80, 0x01, 0xFC, 0xFF,
|
||||
0x00, 0x07, 0xFC, 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xFE,
|
||||
0x1F, 0xE0, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0xFF, 0x00, 0x1F, 0xFC, 0x00,
|
||||
0x7F, 0x87, 0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xF8, 0x1F, 0xE0, 0x0F, 0xFF,
|
||||
0x80, 0x1F, 0xC0, 0xFF, 0x00, 0x7F, 0xFC, 0x01, 0xFE, 0x07, 0xF8, 0x03,
|
||||
0xFF, 0xF0, 0x0F, 0xE0, 0x1F, 0xE0, 0x3F, 0xBF, 0x80, 0x7F, 0x00, 0xFF,
|
||||
0x01, 0xFD, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, 0x80,
|
||||
0x1F, 0xE0, 0xFE, 0x3F, 0x81, 0xFC, 0x00, 0xFF, 0x07, 0xF1, 0xFC, 0x1F,
|
||||
0xE0, 0x07, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x00, 0x1F, 0xE3, 0xF8, 0x3F,
|
||||
0x87, 0xF0, 0x00, 0xFF, 0x1F, 0xC1, 0xFC, 0x7F, 0x80, 0x07, 0xF8, 0xFE,
|
||||
0x0F, 0xE3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x3F, 0x9F, 0xC0, 0x00, 0xFF,
|
||||
0x7F, 0x01, 0xFD, 0xFE, 0x00, 0x07, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x00,
|
||||
0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x3F,
|
||||
0xFC, 0x00, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0x00,
|
||||
0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF,
|
||||
0xC0, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x1F, 0xE0,
|
||||
0x00, 0xFF, 0x8F, 0xF8, 0x00, 0x7F, 0x83, 0xFE, 0x00, 0x7F, 0x80, 0xFF,
|
||||
0x80, 0x7F, 0x80, 0x3F, 0xC0, 0x3F, 0xC0, 0x1F, 0xF0, 0x3F, 0xC0, 0x07,
|
||||
0xFC, 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xE0, 0x00, 0xFF, 0x9F, 0xE0, 0x00,
|
||||
0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00,
|
||||
0x01, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00,
|
||||
0x00, 0x0F, 0xFC, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0x80,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC,
|
||||
0x00, 0x03, 0xFD, 0xFF, 0x00, 0x03, 0xFC, 0x7F, 0xC0, 0x03, 0xFE, 0x1F,
|
||||
0xE0, 0x01, 0xFE, 0x0F, 0xF8, 0x01, 0xFE, 0x03, 0xFE, 0x01, 0xFF, 0x00,
|
||||
0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xC0, 0xFF, 0x00, 0x1F, 0xF0, 0xFF, 0x80,
|
||||
0x07, 0xFC, 0xFF, 0x80, 0x01, 0xFE, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x7F,
|
||||
0x80, 0x00, 0x3F, 0xBF, 0xC0, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x1F, 0xC7,
|
||||
0xF8, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xE0,
|
||||
0x3F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, 0xF0, 0x07, 0xF8, 0x07, 0xF0,
|
||||
0x01, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x83, 0xF8, 0x00, 0x3F, 0xC3, 0xFC,
|
||||
0x00, 0x0F, 0xF1, 0xFC, 0x00, 0x07, 0xF9, 0xFC, 0x00, 0x01, 0xFF, 0xFE,
|
||||
0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x7F,
|
||||
0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01,
|
||||
0xFE, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00,
|
||||
0x07, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xBF,
|
||||
0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0xFF, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF,
|
||||
0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00,
|
||||
0x00, 0x7F, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x07,
|
||||
0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00,
|
||||
0x3F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F,
|
||||
0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC,
|
||||
0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81,
|
||||
0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F,
|
||||
0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00,
|
||||
0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7E, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFE,
|
||||
0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F,
|
||||
0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x1F, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
|
||||
0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
|
||||
0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
|
||||
0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
|
||||
0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x00, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F,
|
||||
0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xF0, 0x01, 0xFB, 0xE0, 0x03, 0xE7,
|
||||
0xC0, 0x0F, 0xCF, 0xC0, 0x1F, 0x0F, 0x80, 0x7E, 0x1F, 0x80, 0xFC, 0x1F,
|
||||
0x01, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x7C, 0x3F, 0x00, 0xFC,
|
||||
0x7E, 0x00, 0xF9, 0xF8, 0x01, 0xFB, 0xF0, 0x01, 0xF0, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x80, 0xFF,
|
||||
0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x07,
|
||||
0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F,
|
||||
0xFF, 0xFC, 0x3F, 0x07, 0xFE, 0x18, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0x7F, 0x1F, 0xFE, 0x7F, 0x0F,
|
||||
0xFC, 0x7F, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x38,
|
||||
0x00, 0xFF, 0x3F, 0xF8, 0x0F, 0xF7, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x0F,
|
||||
0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x9F, 0xFC, 0xFF, 0xC0,
|
||||
0x3F, 0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0x80, 0x0F, 0xEF, 0xF0, 0x00, 0xFF,
|
||||
0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0,
|
||||
0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x1F,
|
||||
0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0xE0, 0x7F, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF,
|
||||
0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0x0F, 0xE7, 0xFF,
|
||||
0xC0, 0xFE, 0x1F, 0xF0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3F, 0xFE, 0x00,
|
||||
0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF,
|
||||
0xE3, 0xFF, 0x8F, 0xFC, 0xFF, 0x80, 0xFE, 0x7F, 0xC0, 0x1E, 0x1F, 0xE0,
|
||||
0x02, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00,
|
||||
0x1F, 0xE0, 0x02, 0x07, 0xFC, 0x01, 0xE0, 0xFF, 0x80, 0xFE, 0x1F, 0xFF,
|
||||
0xFF, 0xC7, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x01,
|
||||
0xFF, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F,
|
||||
0xE0, 0x03, 0x81, 0xFC, 0x07, 0xFE, 0x3F, 0x83, 0xFF, 0xF7, 0xF0, 0xFF,
|
||||
0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F, 0xFF,
|
||||
0x7F, 0xC0, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF,
|
||||
0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00,
|
||||
0x7F, 0xFF, 0xC0, 0x1F, 0xF7, 0xFC, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0xCF,
|
||||
0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFD,
|
||||
0xFC, 0x07, 0xFE, 0x3F, 0x80, 0x00, 0x06, 0x00, 0x00, 0x1F, 0xFE, 0x00,
|
||||
0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF,
|
||||
0xFF, 0x0F, 0xF8, 0x1F, 0xE1, 0xFE, 0x01, 0xFE, 0x7F, 0x80, 0x1F, 0xCF,
|
||||
0xE0, 0x01, 0xFD, 0xFC, 0x00, 0x3F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFB, 0xF8, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x1F, 0xF0, 0x0F,
|
||||
0x01, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xE0, 0x3F,
|
||||
0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0xE0,
|
||||
0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xFC,
|
||||
0x07, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF,
|
||||
0xFC, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x1F, 0xFE, 0x3F, 0x03, 0xFF, 0xF3, 0xF0,
|
||||
0xFF, 0xFF, 0xBF, 0x1F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8,
|
||||
0xFF, 0xF7, 0xFE, 0x01, 0xFF, 0x7F, 0x80, 0x0F, 0xF7, 0xF8, 0x00, 0xFF,
|
||||
0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xF7, 0xF0,
|
||||
0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x7F, 0x7F, 0x80, 0x0F,
|
||||
0xF7, 0xFC, 0x01, 0xFF, 0x3F, 0xF8, 0x7F, 0xF1, 0xFF, 0xFF, 0xFF, 0x1F,
|
||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xF7, 0xF0, 0x1F, 0xFE,
|
||||
0x7F, 0x00, 0x1F, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0,
|
||||
0xC0, 0x00, 0xFF, 0x0F, 0x00, 0x1F, 0xE1, 0xFF, 0x1F, 0xFE, 0x1F, 0xFF,
|
||||
0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0,
|
||||
0x01, 0xFF, 0xF8, 0x00, 0x00, 0x60, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x3F, 0xC0, 0xE0, 0x0F, 0xF3, 0xFF, 0x83, 0xFD, 0xFF, 0xF8, 0xFF, 0xFF,
|
||||
0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFE, 0xFF,
|
||||
0xE0, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF,
|
||||
0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01,
|
||||
0xFC, 0x3C, 0x7F, 0xBF, 0xDF, 0xFF, 0xFF, 0xFB, 0xFC, 0xFC, 0x00, 0x00,
|
||||
0x00, 0x00, 0x0F, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF,
|
||||
0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD,
|
||||
0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF0, 0x00, 0x78, 0x01, 0xFE, 0x01,
|
||||
0xFE, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFC, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0xFE, 0x01, 0xFE, 0x63, 0xFE, 0x7F, 0xFC, 0x7F, 0xFC, 0xFF, 0xF8, 0xFF,
|
||||
0xF0, 0xFF, 0xC0, 0x04, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00,
|
||||
0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0xEF, 0xF0, 0x07, 0xF8, 0xFF,
|
||||
0x01, 0xFF, 0x0F, 0xF0, 0x3F, 0xE0, 0xFF, 0x07, 0xFC, 0x0F, 0xF0, 0xFF,
|
||||
0xC0, 0xFF, 0x1F, 0xF8, 0x0F, 0xF3, 0xFF, 0x00, 0xFF, 0x7F, 0xE0, 0x0F,
|
||||
0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF,
|
||||
0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFE, 0xFF, 0x80,
|
||||
0xFF, 0xCF, 0xF8, 0x0F, 0xF8, 0x7F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0xF0,
|
||||
0x1F, 0xF0, 0xFF, 0x00, 0xFF, 0x8F, 0xF0, 0x0F, 0xF8, 0xFF, 0x00, 0x7F,
|
||||
0xCF, 0xF0, 0x03, 0xFE, 0xFF, 0x00, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x00, 0x00, 0xC0,
|
||||
0x1F, 0xC7, 0xFE, 0x03, 0xFF, 0x83, 0xF9, 0xFF, 0xF0, 0xFF, 0xFC, 0x7F,
|
||||
0x7F, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFE, 0x07, 0xFF,
|
||||
0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFF, 0xE0, 0x07, 0xF8, 0x03,
|
||||
0xFF, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xFF,
|
||||
0xF0, 0x03, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xFF, 0xC0,
|
||||
0x0F, 0xE0, 0x03, 0xFF, 0xF8, 0x01, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F,
|
||||
0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0xFE, 0x00,
|
||||
0x3F, 0xFF, 0x80, 0x1F, 0xC0, 0x07, 0xFF, 0xF0, 0x03, 0xF8, 0x00, 0xFF,
|
||||
0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xFF, 0xC0, 0x0F, 0xE0, 0x03, 0xFF, 0xF8,
|
||||
0x01, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0x80, 0x0F, 0xFF, 0xE0, 0x07,
|
||||
0xF0, 0x01, 0xFC, 0x00, 0x03, 0x80, 0x3F, 0x8F, 0xFE, 0x0F, 0xE7, 0xFF,
|
||||
0xE3, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xEF, 0xFF,
|
||||
0xFF, 0xFB, 0xFF, 0x81, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF,
|
||||
0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07,
|
||||
0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0,
|
||||
0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF,
|
||||
0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F,
|
||||
0xFF, 0xC0, 0x07, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x03,
|
||||
0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
|
||||
0xFC, 0x3F, 0xF8, 0xFF, 0xC3, 0xFE, 0x03, 0xFE, 0x7F, 0xC0, 0x1F, 0xE7,
|
||||
0xF8, 0x00, 0xFF, 0x7F, 0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x07, 0xFF, 0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F,
|
||||
0x7F, 0x80, 0x0F, 0xF7, 0xF8, 0x00, 0xFF, 0x3F, 0xC0, 0x1F, 0xE3, 0xFE,
|
||||
0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF,
|
||||
0x80, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x00,
|
||||
0x03, 0x80, 0x0F, 0xE3, 0xFF, 0x80, 0xFE, 0x7F, 0xFE, 0x0F, 0xFF, 0xFF,
|
||||
0xF0, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFC, 0xFF, 0xF9, 0xFF, 0xCF,
|
||||
0xFC, 0x03, 0xFE, 0xFF, 0x80, 0x1F, 0xEF, 0xF8, 0x00, 0xFE, 0xFF, 0x00,
|
||||
0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF,
|
||||
0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF8,
|
||||
0x01, 0xFE, 0xFF, 0x80, 0x1F, 0xEF, 0xFE, 0x07, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
0xCF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF,
|
||||
0x7F, 0xFC, 0x0F, 0xF1, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0xFC, 0x7F, 0x03, 0xFF, 0xF7,
|
||||
0xF0, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F,
|
||||
0xF8, 0xFF, 0xF3, 0xFE, 0x03, 0xFF, 0x7F, 0xC0, 0x1F, 0xF7, 0xF8, 0x00,
|
||||
0xFF, 0x7F, 0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xFF,
|
||||
0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F, 0x7F, 0x80,
|
||||
0x0F, 0xF7, 0xF8, 0x00, 0xFF, 0x7F, 0xC0, 0x1F, 0xF3, 0xFE, 0x03, 0xFF,
|
||||
0x3F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0x7F,
|
||||
0xFF, 0xFF, 0x03, 0xFF, 0xE7, 0xF0, 0x0F, 0xFC, 0x7F, 0x00, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x3F, 0xFE, 0x7F, 0xFE,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF,
|
||||
0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x3E, 0x00,
|
||||
0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x8F,
|
||||
0xFF, 0xFF, 0x1F, 0xE0, 0x1C, 0x3F, 0x80, 0x08, 0x7F, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x01, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x03, 0xFF,
|
||||
0xFF, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03,
|
||||
0xFC, 0x80, 0x03, 0xF9, 0xC0, 0x07, 0xF7, 0xF0, 0x3F, 0xCF, 0xFF, 0xFF,
|
||||
0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0, 0x1F, 0xFF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF,
|
||||
0xFC, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x7F, 0xDC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF,
|
||||
0xE0, 0x1F, 0xFF, 0x00, 0x7F, 0xC0, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07,
|
||||
0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0,
|
||||
0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF,
|
||||
0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F,
|
||||
0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00,
|
||||
0x7F, 0xDF, 0xE0, 0x1F, 0xF7, 0xFC, 0x1F, 0xFD, 0xFF, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x3F, 0xFE, 0x7F,
|
||||
0x03, 0xFE, 0x1F, 0xC0, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0x7F,
|
||||
0x00, 0x0F, 0xE7, 0xF8, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0xC3, 0xFC, 0x01,
|
||||
0xFC, 0x3F, 0xC0, 0x1F, 0xC1, 0xFC, 0x03, 0xF8, 0x1F, 0xE0, 0x3F, 0x80,
|
||||
0xFE, 0x07, 0xF0, 0x0F, 0xF0, 0x7F, 0x00, 0x7F, 0x0F, 0xF0, 0x07, 0xF0,
|
||||
0xFE, 0x00, 0x7F, 0x8F, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x3F, 0xDF, 0xC0,
|
||||
0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xF8, 0x00, 0x0F,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0,
|
||||
0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x1F, 0xC0,
|
||||
0x07, 0xF7, 0xF0, 0x03, 0xFC, 0x00, 0x7E, 0x7F, 0x00, 0x3F, 0xC0, 0x0F,
|
||||
0xE7, 0xF0, 0x03, 0xFE, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xE0, 0x0F, 0xC3,
|
||||
0xF8, 0x07, 0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0xF0, 0x1F, 0xC1, 0xFC,
|
||||
0x0F, 0xFF, 0x01, 0xF8, 0x1F, 0xC0, 0xFF, 0xF0, 0x3F, 0x80, 0xFC, 0x0F,
|
||||
0xFF, 0x83, 0xF0, 0x0F, 0xE1, 0xFD, 0xF8, 0x3F, 0x00, 0xFE, 0x1F, 0x9F,
|
||||
0x87, 0xF0, 0x07, 0xE3, 0xF9, 0xFC, 0x7E, 0x00, 0x7F, 0x3F, 0x8F, 0xC7,
|
||||
0xE0, 0x07, 0xF3, 0xF0, 0xFE, 0xFE, 0x00, 0x3F, 0x7F, 0x0F, 0xEF, 0xC0,
|
||||
0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x01,
|
||||
0xFF, 0xE0, 0x7F, 0xF8, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x00, 0xFF,
|
||||
0xC0, 0x3F, 0xF0, 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x1F, 0xF0, 0x00, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03, 0xFC, 0x1F, 0xE0, 0x3F,
|
||||
0x81, 0xFF, 0x07, 0xF8, 0x0F, 0xF0, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x03,
|
||||
0xFD, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00,
|
||||
0x07, 0xFE, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0xFF,
|
||||
0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xF9, 0xFE, 0x00, 0xFF, 0x0F, 0xF0,
|
||||
0x0F, 0xF0, 0xFF, 0x01, 0xFE, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xC7, 0xF8,
|
||||
0x03, 0xFE, 0x7F, 0x80, 0x1F, 0xE0, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00,
|
||||
0x7F, 0x7F, 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0xC3,
|
||||
0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x1F, 0xC1, 0xFC, 0x03, 0xF8, 0x1F, 0xE0,
|
||||
0x3F, 0x80, 0xFE, 0x07, 0xF0, 0x0F, 0xF0, 0x7F, 0x00, 0x7F, 0x07, 0xE0,
|
||||
0x07, 0xF0, 0xFE, 0x00, 0x3F, 0x8F, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x3F,
|
||||
0xDF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xF8,
|
||||
0x00, 0x0F, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x00, 0x3F, 0x80, 0x02, 0x07, 0xF8, 0x00, 0x7D, 0xFF, 0x00, 0x07,
|
||||
0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8,
|
||||
0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00,
|
||||
0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xFC,
|
||||
0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0x01, 0xFF, 0x03, 0xFF,
|
||||
0x07, 0xFF, 0x07, 0xFF, 0x0F, 0xFF, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xE0,
|
||||
0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0,
|
||||
0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0,
|
||||
0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0x1F, 0xE0, 0x0F, 0xE0,
|
||||
0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0,
|
||||
0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF,
|
||||
0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xFC, 0x01, 0xFE, 0x03, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xFC,
|
||||
0x07, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00,
|
||||
0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F,
|
||||
0xC0, 0x7F, 0xF0, 0x7F, 0xE0, 0x7F, 0xC0, 0xFF, 0x83, 0xFF, 0x0F, 0xFE,
|
||||
0x1F, 0xE0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07,
|
||||
0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x03, 0xFC,
|
||||
0x3F, 0xF8, 0x7F, 0xF0, 0xFF, 0xC1, 0xFF, 0x83, 0xFC, 0x07, 0xF0, 0x00,
|
||||
0x0F, 0xC0, 0x1F, 0x1F, 0xF0, 0x1F, 0x3F, 0xF8, 0x1F, 0x7F, 0xFE, 0x3E,
|
||||
0x7F, 0xFF, 0xFE, 0x7C, 0x7F, 0xFE, 0x78, 0x1F, 0xFC, 0xF8, 0x0F, 0xF8,
|
||||
0xF8, 0x03, 0xF0 };
|
||||
|
||||
const GFXglyph Montserrat_Bold24pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 13, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 9, 33, 14, 2, -32 }, // 0x21 '!'
|
||||
{ 39, 17, 13, 21, 2, -32 }, // 0x22 '"'
|
||||
{ 67, 32, 33, 34, 1, -32 }, // 0x23 '#'
|
||||
{ 199, 28, 45, 30, 1, -38 }, // 0x24 '$'
|
||||
{ 357, 39, 33, 41, 1, -32 }, // 0x25 '%'
|
||||
{ 518, 31, 34, 34, 2, -32 }, // 0x26 '&'
|
||||
{ 650, 7, 13, 11, 2, -32 }, // 0x27 '''
|
||||
{ 662, 13, 44, 17, 3, -34 }, // 0x28 '('
|
||||
{ 734, 13, 44, 17, 0, -34 }, // 0x29 ')'
|
||||
{ 806, 19, 19, 20, 1, -34 }, // 0x2A '*'
|
||||
{ 852, 22, 21, 28, 3, -26 }, // 0x2B '+'
|
||||
{ 910, 9, 16, 12, 2, -8 }, // 0x2C ','
|
||||
{ 928, 14, 6, 18, 2, -15 }, // 0x2D '-'
|
||||
{ 939, 9, 9, 12, 2, -8 }, // 0x2E '.'
|
||||
{ 950, 22, 45, 18, -2, -39 }, // 0x2F '/'
|
||||
{ 1074, 28, 34, 32, 2, -32 }, // 0x30 '0'
|
||||
{ 1193, 15, 33, 18, 0, -32 }, // 0x31 '1'
|
||||
{ 1255, 26, 33, 28, 0, -32 }, // 0x32 '2'
|
||||
{ 1363, 26, 34, 28, 0, -32 }, // 0x33 '3'
|
||||
{ 1474, 31, 33, 32, 1, -32 }, // 0x34 '4'
|
||||
{ 1602, 27, 34, 28, 0, -32 }, // 0x35 '5'
|
||||
{ 1717, 27, 34, 30, 2, -32 }, // 0x36 '6'
|
||||
{ 1832, 27, 33, 29, 1, -32 }, // 0x37 '7'
|
||||
{ 1944, 27, 34, 31, 2, -32 }, // 0x38 '8'
|
||||
{ 2059, 27, 34, 30, 1, -32 }, // 0x39 '9'
|
||||
{ 2174, 9, 26, 12, 2, -25 }, // 0x3A ':'
|
||||
{ 2204, 9, 33, 12, 2, -25 }, // 0x3B ';'
|
||||
{ 2242, 22, 23, 28, 3, -27 }, // 0x3C '<'
|
||||
{ 2306, 22, 17, 28, 3, -24 }, // 0x3D '='
|
||||
{ 2353, 22, 23, 28, 3, -27 }, // 0x3E '>'
|
||||
{ 2417, 25, 33, 28, 0, -32 }, // 0x3F '?'
|
||||
{ 2521, 45, 43, 49, 2, -32 }, // 0x40 '@'
|
||||
{ 2763, 36, 33, 36, 0, -32 }, // 0x41 'A'
|
||||
{ 2912, 30, 33, 36, 4, -32 }, // 0x42 'B'
|
||||
{ 3036, 31, 34, 34, 2, -32 }, // 0x43 'C'
|
||||
{ 3168, 33, 33, 39, 4, -32 }, // 0x44 'D'
|
||||
{ 3305, 25, 33, 32, 4, -32 }, // 0x45 'E'
|
||||
{ 3409, 25, 33, 30, 4, -32 }, // 0x46 'F'
|
||||
{ 3513, 32, 34, 36, 2, -32 }, // 0x47 'G'
|
||||
{ 3649, 30, 33, 38, 4, -32 }, // 0x48 'H'
|
||||
{ 3773, 8, 33, 15, 4, -32 }, // 0x49 'I'
|
||||
{ 3806, 23, 34, 25, -1, -32 }, // 0x4A 'J'
|
||||
{ 3904, 31, 33, 35, 4, -32 }, // 0x4B 'K'
|
||||
{ 4032, 24, 33, 28, 4, -32 }, // 0x4C 'L'
|
||||
{ 4131, 37, 33, 45, 4, -32 }, // 0x4D 'M'
|
||||
{ 4284, 30, 33, 38, 4, -32 }, // 0x4E 'N'
|
||||
{ 4408, 36, 34, 40, 2, -32 }, // 0x4F 'O'
|
||||
{ 4561, 28, 33, 34, 4, -32 }, // 0x50 'P'
|
||||
{ 4677, 37, 41, 40, 2, -32 }, // 0x51 'Q'
|
||||
{ 4867, 29, 33, 35, 4, -32 }, // 0x52 'R'
|
||||
{ 4987, 28, 34, 30, 1, -32 }, // 0x53 'S'
|
||||
{ 5106, 29, 33, 29, 0, -32 }, // 0x54 'T'
|
||||
{ 5226, 29, 34, 37, 4, -32 }, // 0x55 'U'
|
||||
{ 5350, 36, 33, 35, 0, -32 }, // 0x56 'V'
|
||||
{ 5499, 53, 33, 55, 1, -32 }, // 0x57 'W'
|
||||
{ 5718, 33, 33, 34, 0, -32 }, // 0x58 'X'
|
||||
{ 5855, 33, 33, 32, -1, -32 }, // 0x59 'Y'
|
||||
{ 5992, 29, 33, 32, 2, -32 }, // 0x5A 'Z'
|
||||
{ 6112, 13, 44, 17, 4, -34 }, // 0x5B '['
|
||||
{ 6184, 22, 45, 18, -2, -39 }, // 0x5C '\'
|
||||
{ 6308, 12, 44, 17, 1, -34 }, // 0x5D ']'
|
||||
{ 6374, 23, 19, 28, 3, -25 }, // 0x5E '^'
|
||||
{ 6429, 24, 4, 24, 0, 1 }, // 0x5F '_'
|
||||
{ 6441, 14, 6, 28, 4, -34 }, // 0x60 '`'
|
||||
{ 6452, 24, 26, 29, 2, -25 }, // 0x61 'a'
|
||||
{ 6530, 28, 35, 32, 3, -34 }, // 0x62 'b'
|
||||
{ 6653, 26, 26, 28, 1, -25 }, // 0x63 'c'
|
||||
{ 6738, 27, 35, 33, 2, -34 }, // 0x64 'd'
|
||||
{ 6857, 27, 26, 30, 1, -25 }, // 0x65 'e'
|
||||
{ 6945, 20, 35, 18, 0, -34 }, // 0x66 'f'
|
||||
{ 7033, 28, 36, 33, 1, -25 }, // 0x67 'g'
|
||||
{ 7159, 26, 35, 32, 3, -34 }, // 0x68 'h'
|
||||
{ 7273, 9, 37, 14, 3, -36 }, // 0x69 'i'
|
||||
{ 7315, 16, 47, 14, -4, -36 }, // 0x6A 'j'
|
||||
{ 7409, 28, 35, 31, 3, -34 }, // 0x6B 'k'
|
||||
{ 7532, 8, 35, 14, 3, -34 }, // 0x6C 'l'
|
||||
{ 7567, 43, 26, 49, 3, -25 }, // 0x6D 'm'
|
||||
{ 7707, 26, 26, 32, 3, -25 }, // 0x6E 'n'
|
||||
{ 7792, 28, 26, 31, 1, -25 }, // 0x6F 'o'
|
||||
{ 7883, 28, 35, 32, 3, -25 }, // 0x70 'p'
|
||||
{ 8006, 28, 35, 32, 1, -25 }, // 0x71 'q'
|
||||
{ 8129, 16, 26, 20, 3, -25 }, // 0x72 'r'
|
||||
{ 8181, 23, 26, 25, 1, -25 }, // 0x73 's'
|
||||
{ 8256, 20, 31, 20, 0, -30 }, // 0x74 't'
|
||||
{ 8334, 26, 25, 32, 3, -24 }, // 0x75 'u'
|
||||
{ 8416, 28, 25, 28, 0, -24 }, // 0x76 'v'
|
||||
{ 8504, 44, 25, 44, 0, -24 }, // 0x77 'w'
|
||||
{ 8642, 28, 25, 28, 0, -24 }, // 0x78 'x'
|
||||
{ 8730, 28, 35, 28, 0, -24 }, // 0x79 'y'
|
||||
{ 8853, 22, 25, 26, 2, -24 }, // 0x7A 'z'
|
||||
{ 8922, 16, 44, 18, 2, -34 }, // 0x7B '{'
|
||||
{ 9010, 7, 44, 15, 4, -34 }, // 0x7C '|'
|
||||
{ 9049, 15, 44, 18, 1, -34 }, // 0x7D '}'
|
||||
{ 9132, 24, 9, 28, 2, -20 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold24pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold24pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold24pt7bGlyphs,
|
||||
0x20, 0x7E, 57 };
|
||||
|
||||
// Approx. 9831 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD24PT7B_H
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,182 @@
|
||||
#ifndef MONTSERRATBOLD7PT7B_H
|
||||
#define MONTSERRATBOLD7PT7B_H
|
||||
const uint8_t Montserrat_Bold7pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFC, 0xF0, 0xDC, 0xA5, 0x20, 0x19, 0x04, 0x47, 0xFD, 0xFF,
|
||||
0x13, 0x0C, 0xCF, 0xFB, 0xFE, 0x32, 0x08, 0x80, 0x08, 0x1F, 0x1F, 0xCD,
|
||||
0x06, 0x83, 0xE0, 0xFC, 0x16, 0x0B, 0xBF, 0x9F, 0x81, 0x00, 0x80, 0x70,
|
||||
0xC5, 0x88, 0xC9, 0x8C, 0xB0, 0x7A, 0x00, 0x6E, 0x0D, 0xB0, 0x93, 0x19,
|
||||
0xB3, 0x0E, 0x1C, 0x0F, 0x83, 0x30, 0xD8, 0x1C, 0x1F, 0x36, 0x79, 0x8E,
|
||||
0x7F, 0xCF, 0xA0, 0xEA, 0x66, 0xEC, 0xCC, 0xCC, 0xCE, 0x66, 0x30, 0x66,
|
||||
0x73, 0x33, 0x33, 0x37, 0x66, 0xC0, 0x33, 0xF7, 0xBF, 0x30, 0x30, 0x63,
|
||||
0xFF, 0xF3, 0x06, 0x00, 0x4D, 0xB4, 0xFF, 0x5D, 0x80, 0x0C, 0x31, 0x86,
|
||||
0x18, 0xC3, 0x0C, 0x61, 0x86, 0x30, 0xC0, 0x3C, 0x7E, 0xE6, 0xC7, 0xC3,
|
||||
0xC3, 0xC3, 0xC7, 0xFE, 0x7C, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x3C, 0xFE,
|
||||
0x47, 0x07, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0xFF, 0xFE, 0xFE, 0x0E, 0x1C,
|
||||
0x1C, 0x1E, 0x07, 0x07, 0xFE, 0x7C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x33,
|
||||
0x1C, 0xCF, 0xFF, 0xFF, 0x03, 0x00, 0xC0, 0x7E, 0x7E, 0x60, 0x60, 0x7E,
|
||||
0x7F, 0x03, 0x03, 0xFF, 0x7E, 0x3E, 0x7E, 0xE0, 0xC0, 0xFC, 0xFE, 0xC7,
|
||||
0xC7, 0xFE, 0x7C, 0xFF, 0xFF, 0xC7, 0xC6, 0x06, 0x0E, 0x0C, 0x1C, 0x18,
|
||||
0x38, 0x3E, 0x3F, 0x98, 0xCC, 0x63, 0xF3, 0xF9, 0x8E, 0xC7, 0x7F, 0x1F,
|
||||
0x00, 0x3C, 0x7E, 0xE3, 0xE3, 0x67, 0x7F, 0x03, 0x07, 0x7E, 0x7C, 0x5D,
|
||||
0x80, 0xBB, 0x5D, 0x80, 0x9B, 0x68, 0x0E, 0x7B, 0xC7, 0x07, 0xC1, 0xC0,
|
||||
0x80, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0xC1, 0xF0, 0x78, 0xF7, 0x9C, 0x00,
|
||||
0x00, 0x3C, 0xFE, 0x46, 0x06, 0x0E, 0x1C, 0x18, 0x00, 0x18, 0x18, 0x0F,
|
||||
0x81, 0xC7, 0x18, 0x0D, 0x9D, 0xA9, 0xFD, 0xCC, 0x6E, 0x43, 0x33, 0x1B,
|
||||
0x9F, 0xD6, 0x7B, 0x98, 0x00, 0x73, 0x00, 0xF8, 0x00, 0x0E, 0x01, 0xC0,
|
||||
0x7C, 0x0D, 0x83, 0x30, 0x63, 0x1F, 0xE3, 0xFE, 0x60, 0xD8, 0x1C, 0xFE,
|
||||
0x7F, 0xB0, 0xF8, 0x7F, 0xF7, 0xFB, 0x07, 0x83, 0xFF, 0xFF, 0x80, 0x1E,
|
||||
0x3F, 0xF8, 0x58, 0x0C, 0x06, 0x03, 0x01, 0xC2, 0x7F, 0x9F, 0x80, 0xFE,
|
||||
0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x1F, 0x06, 0xFF, 0xBF, 0x80,
|
||||
0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0x1E, 0x3F, 0xF8, 0x58,
|
||||
0x0C, 0x06, 0x0F, 0x07, 0xC3, 0x7F, 0x9F, 0x80, 0xC1, 0xE0, 0xF0, 0x78,
|
||||
0x3F, 0xFF, 0xFF, 0x07, 0x83, 0xC1, 0xE0, 0xC0, 0xFF, 0xFF, 0xF0, 0x7E,
|
||||
0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x86, 0xFC, 0xF0, 0xC3, 0xB0, 0xCC, 0x63,
|
||||
0x30, 0xD8, 0x3F, 0x0E, 0xE3, 0x1C, 0xC3, 0x30, 0xE0, 0xC1, 0x83, 0x06,
|
||||
0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x7C, 0x0F, 0x83, 0xF8, 0xFF,
|
||||
0x9F, 0xB6, 0xF3, 0xDE, 0x73, 0xC4, 0x78, 0x0C, 0xC1, 0xF0, 0xFC, 0x7F,
|
||||
0x3D, 0xDE, 0x6F, 0x3F, 0x8F, 0xC3, 0xE0, 0xC0, 0x1E, 0x1F, 0xEE, 0x1F,
|
||||
0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x87, 0x7F, 0x8F, 0xC0, 0xFC, 0x7F, 0xB0,
|
||||
0xD8, 0x7C, 0x3F, 0xFB, 0xF9, 0x80, 0xC0, 0x60, 0x00, 0x1E, 0x0F, 0xF3,
|
||||
0x87, 0x60, 0x6C, 0x0D, 0x81, 0xB0, 0x37, 0x0E, 0x7F, 0x87, 0xE0, 0x3D,
|
||||
0x01, 0xE0, 0xFC, 0x7F, 0xB0, 0xD8, 0x7C, 0x3F, 0xFB, 0xF9, 0x8C, 0xC7,
|
||||
0x61, 0x80, 0x3E, 0x3F, 0x98, 0x0C, 0x07, 0xC1, 0xF8, 0x0C, 0x07, 0x7F,
|
||||
0x3F, 0x00, 0xFF, 0xFF, 0xC6, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18,
|
||||
0x0C, 0x00, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F,
|
||||
0x1F, 0x00, 0xC0, 0xDC, 0x19, 0x87, 0x38, 0xC3, 0x38, 0x76, 0x06, 0xC0,
|
||||
0xF0, 0x1E, 0x01, 0xC0, 0xE1, 0x83, 0x61, 0xC7, 0x63, 0xC6, 0x73, 0xC6,
|
||||
0x33, 0x6E, 0x36, 0x6C, 0x3E, 0x6C, 0x1E, 0x3C, 0x1C, 0x38, 0x1C, 0x38,
|
||||
0xE1, 0xDC, 0xE3, 0x30, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xCC, 0x73, 0xB8,
|
||||
0x70, 0xC1, 0x98, 0x67, 0x30, 0xDC, 0x3E, 0x07, 0x00, 0xC0, 0x30, 0x0C,
|
||||
0x03, 0x00, 0xFF, 0xFF, 0x06, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xFF, 0xFF,
|
||||
0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xF0, 0xC0, 0xC1, 0x81, 0x03, 0x06,
|
||||
0x06, 0x0C, 0x18, 0x18, 0x30, 0x60, 0x60, 0xF3, 0x33, 0x33, 0x33, 0x33,
|
||||
0x3F, 0xF0, 0x30, 0x71, 0xE3, 0x6C, 0xD8, 0x80, 0xFE, 0xE3, 0x10, 0x31,
|
||||
0xFA, 0x38, 0x7F, 0xF9, 0xF3, 0xFB, 0xC0, 0xC0, 0xDC, 0xFE, 0xE7, 0xC3,
|
||||
0xC3, 0xE3, 0xFF, 0xFE, 0x1C, 0x3F, 0x63, 0x60, 0xE0, 0x62, 0x7F, 0x3E,
|
||||
0x03, 0x81, 0xC6, 0xEF, 0xF6, 0x3B, 0x1F, 0x86, 0xC7, 0x7F, 0x9E, 0xC0,
|
||||
0x1C, 0x3E, 0x63, 0x63, 0xFF, 0x60, 0x7E, 0x3E, 0x00, 0xF7, 0x18, 0xF9,
|
||||
0x86, 0x18, 0x61, 0x86, 0x00, 0x19, 0xBF, 0xD8, 0xFC, 0x3E, 0x1B, 0x1D,
|
||||
0xFE, 0x33, 0x03, 0xBF, 0x8F, 0x80, 0xC0, 0xC0, 0xCC, 0xFE, 0xE7, 0xC7,
|
||||
0xC3, 0xC3, 0xC3, 0xC3, 0xDC, 0x6D, 0xB6, 0xDB, 0x00, 0x31, 0xC0, 0x63,
|
||||
0x18, 0xC6, 0x31, 0x8C, 0x6F, 0x70, 0xC0, 0xC0, 0xC7, 0xCE, 0xDC, 0xF8,
|
||||
0xFC, 0xEC, 0xCE, 0xC7, 0xFF, 0xFF, 0xF0, 0xD8, 0x67, 0xFF, 0xB9, 0xCF,
|
||||
0x8E, 0x3C, 0x61, 0xE3, 0x0F, 0x18, 0x78, 0xC3, 0xCC, 0xFE, 0xE7, 0xC7,
|
||||
0xC3, 0xC3, 0xC3, 0xC3, 0x1C, 0x1F, 0x98, 0xCC, 0x7E, 0x1B, 0x1D, 0xFC,
|
||||
0x7C, 0xDC, 0xFE, 0xE7, 0xC3, 0xC3, 0xE3, 0xFF, 0xDE, 0xC0, 0xC0, 0xC0,
|
||||
0x19, 0xBF, 0xD8, 0xEC, 0x7E, 0x1B, 0x1D, 0xFE, 0x7F, 0x03, 0x81, 0xC0,
|
||||
0xE0, 0xCF, 0xF9, 0x8C, 0x63, 0x18, 0x18, 0xFF, 0x83, 0x87, 0xE0, 0xDF,
|
||||
0xBE, 0x63, 0xEF, 0x98, 0x61, 0x86, 0x1E, 0x3C, 0xC7, 0xC7, 0xC7, 0xC7,
|
||||
0xC7, 0xC7, 0xFF, 0x7B, 0xC3, 0xE3, 0x63, 0x66, 0x36, 0x3C, 0x3C, 0x1C,
|
||||
0xC3, 0x1E, 0x38, 0xD9, 0xCC, 0xCF, 0x66, 0xDB, 0x1E, 0xF0, 0xE3, 0x83,
|
||||
0x1C, 0xE3, 0x66, 0x3E, 0x3C, 0x1C, 0x3C, 0x76, 0xE7, 0xC3, 0xE3, 0x63,
|
||||
0x66, 0x36, 0x3C, 0x3C, 0x18, 0x18, 0xF8, 0xE0, 0x7E, 0xFC, 0x30, 0xE3,
|
||||
0x8E, 0x1F, 0xFF, 0x76, 0x66, 0x6E, 0xE6, 0x66, 0x67, 0x30, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0xE3, 0x9C, 0xE7, 0x1C, 0xEE, 0x73, 0x9D, 0xCC, 0x00, 0xF7,
|
||||
0x38 };
|
||||
|
||||
const GFXglyph Montserrat_Bold7pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 10, 4, 1, -9 }, // 0x21 '!'
|
||||
{ 4, 5, 4, 6, 1, -9 }, // 0x22 '"'
|
||||
{ 7, 10, 10, 10, 0, -9 }, // 0x23 '#'
|
||||
{ 20, 9, 13, 9, 0, -10 }, // 0x24 '$'
|
||||
{ 35, 12, 10, 12, 0, -9 }, // 0x25 '%'
|
||||
{ 50, 10, 10, 10, 0, -9 }, // 0x26 '&'
|
||||
{ 63, 2, 4, 3, 1, -9 }, // 0x27 '''
|
||||
{ 64, 4, 13, 5, 1, -9 }, // 0x28 '('
|
||||
{ 71, 4, 13, 5, 0, -9 }, // 0x29 ')'
|
||||
{ 78, 6, 5, 6, 0, -9 }, // 0x2A '*'
|
||||
{ 82, 7, 6, 8, 1, -7 }, // 0x2B '+'
|
||||
{ 88, 3, 5, 4, 0, -2 }, // 0x2C ','
|
||||
{ 90, 4, 2, 5, 1, -4 }, // 0x2D '-'
|
||||
{ 91, 3, 3, 4, 0, -2 }, // 0x2E '.'
|
||||
{ 93, 6, 13, 5, 0, -11 }, // 0x2F '/'
|
||||
{ 103, 8, 10, 10, 1, -9 }, // 0x30 '0'
|
||||
{ 113, 4, 10, 5, 0, -9 }, // 0x31 '1'
|
||||
{ 118, 8, 10, 8, 0, -9 }, // 0x32 '2'
|
||||
{ 128, 8, 10, 8, 0, -9 }, // 0x33 '3'
|
||||
{ 138, 10, 10, 10, 0, -9 }, // 0x34 '4'
|
||||
{ 151, 8, 10, 8, 0, -9 }, // 0x35 '5'
|
||||
{ 161, 8, 10, 9, 1, -9 }, // 0x36 '6'
|
||||
{ 171, 8, 10, 9, 0, -9 }, // 0x37 '7'
|
||||
{ 181, 9, 10, 9, 0, -9 }, // 0x38 '8'
|
||||
{ 193, 8, 10, 9, 0, -9 }, // 0x39 '9'
|
||||
{ 203, 3, 8, 4, 0, -7 }, // 0x3A ':'
|
||||
{ 206, 3, 10, 4, 0, -7 }, // 0x3B ';'
|
||||
{ 210, 7, 7, 8, 1, -7 }, // 0x3C '<'
|
||||
{ 217, 7, 5, 8, 1, -6 }, // 0x3D '='
|
||||
{ 222, 7, 7, 8, 1, -7 }, // 0x3E '>'
|
||||
{ 229, 8, 10, 8, 0, -9 }, // 0x3F '?'
|
||||
{ 239, 13, 13, 14, 1, -9 }, // 0x40 '@'
|
||||
{ 261, 11, 10, 11, 0, -9 }, // 0x41 'A'
|
||||
{ 275, 9, 10, 11, 1, -9 }, // 0x42 'B'
|
||||
{ 287, 9, 10, 10, 1, -9 }, // 0x43 'C'
|
||||
{ 299, 10, 10, 12, 1, -9 }, // 0x44 'D'
|
||||
{ 312, 8, 10, 9, 1, -9 }, // 0x45 'E'
|
||||
{ 322, 8, 10, 9, 1, -9 }, // 0x46 'F'
|
||||
{ 332, 9, 10, 11, 1, -9 }, // 0x47 'G'
|
||||
{ 344, 9, 10, 11, 1, -9 }, // 0x48 'H'
|
||||
{ 356, 2, 10, 5, 1, -9 }, // 0x49 'I'
|
||||
{ 359, 7, 10, 8, 0, -9 }, // 0x4A 'J'
|
||||
{ 368, 10, 10, 10, 1, -9 }, // 0x4B 'K'
|
||||
{ 381, 7, 10, 8, 1, -9 }, // 0x4C 'L'
|
||||
{ 390, 11, 10, 13, 1, -9 }, // 0x4D 'M'
|
||||
{ 404, 9, 10, 11, 1, -9 }, // 0x4E 'N'
|
||||
{ 416, 10, 10, 12, 1, -9 }, // 0x4F 'O'
|
||||
{ 429, 9, 10, 10, 1, -9 }, // 0x50 'P'
|
||||
{ 441, 11, 12, 12, 1, -9 }, // 0x51 'Q'
|
||||
{ 458, 9, 10, 10, 1, -9 }, // 0x52 'R'
|
||||
{ 470, 9, 10, 9, 0, -9 }, // 0x53 'S'
|
||||
{ 482, 9, 10, 9, 0, -9 }, // 0x54 'T'
|
||||
{ 494, 9, 10, 11, 1, -9 }, // 0x55 'U'
|
||||
{ 506, 11, 10, 10, 0, -9 }, // 0x56 'V'
|
||||
{ 520, 16, 10, 16, 0, -9 }, // 0x57 'W'
|
||||
{ 540, 10, 10, 10, 0, -9 }, // 0x58 'X'
|
||||
{ 553, 10, 10, 9, 0, -9 }, // 0x59 'Y'
|
||||
{ 566, 8, 10, 9, 1, -9 }, // 0x5A 'Z'
|
||||
{ 576, 4, 13, 5, 1, -9 }, // 0x5B '['
|
||||
{ 583, 7, 13, 5, -1, -11 }, // 0x5C '\'
|
||||
{ 595, 4, 13, 5, 0, -9 }, // 0x5D ']'
|
||||
{ 602, 7, 6, 8, 1, -7 }, // 0x5E '^'
|
||||
{ 608, 7, 1, 7, 0, 1 }, // 0x5F '_'
|
||||
{ 609, 4, 3, 8, 1, -10 }, // 0x60 '`'
|
||||
{ 611, 7, 8, 9, 1, -7 }, // 0x61 'a'
|
||||
{ 618, 8, 10, 10, 1, -9 }, // 0x62 'b'
|
||||
{ 628, 8, 8, 8, 0, -7 }, // 0x63 'c'
|
||||
{ 636, 9, 10, 10, 0, -9 }, // 0x64 'd'
|
||||
{ 648, 8, 8, 9, 0, -7 }, // 0x65 'e'
|
||||
{ 656, 6, 11, 5, 0, -10 }, // 0x66 'f'
|
||||
{ 665, 9, 11, 10, 0, -7 }, // 0x67 'g'
|
||||
{ 678, 8, 10, 10, 1, -9 }, // 0x68 'h'
|
||||
{ 688, 3, 11, 4, 1, -10 }, // 0x69 'i'
|
||||
{ 693, 5, 14, 4, -1, -10 }, // 0x6A 'j'
|
||||
{ 702, 8, 10, 9, 1, -9 }, // 0x6B 'k'
|
||||
{ 712, 2, 10, 4, 1, -9 }, // 0x6C 'l'
|
||||
{ 715, 13, 8, 15, 1, -7 }, // 0x6D 'm'
|
||||
{ 728, 8, 8, 10, 1, -7 }, // 0x6E 'n'
|
||||
{ 736, 9, 8, 9, 0, -7 }, // 0x6F 'o'
|
||||
{ 745, 8, 11, 10, 1, -7 }, // 0x70 'p'
|
||||
{ 756, 9, 11, 10, 0, -7 }, // 0x71 'q'
|
||||
{ 769, 5, 8, 6, 1, -7 }, // 0x72 'r'
|
||||
{ 774, 7, 8, 7, 0, -7 }, // 0x73 's'
|
||||
{ 781, 6, 9, 6, 0, -8 }, // 0x74 't'
|
||||
{ 788, 8, 8, 10, 1, -7 }, // 0x75 'u'
|
||||
{ 796, 8, 8, 8, 0, -7 }, // 0x76 'v'
|
||||
{ 804, 13, 8, 13, 0, -7 }, // 0x77 'w'
|
||||
{ 817, 8, 8, 8, 0, -7 }, // 0x78 'x'
|
||||
{ 825, 8, 11, 8, 0, -7 }, // 0x79 'y'
|
||||
{ 836, 7, 8, 8, 0, -7 }, // 0x7A 'z'
|
||||
{ 843, 4, 13, 5, 1, -9 }, // 0x7B '{'
|
||||
{ 850, 2, 13, 4, 1, -9 }, // 0x7C '|'
|
||||
{ 854, 5, 13, 5, 0, -9 }, // 0x7D '}'
|
||||
{ 863, 7, 2, 8, 1, -5 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold7pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold7pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold7pt7bGlyphs,
|
||||
0x20, 0x7E, 17 };
|
||||
|
||||
// Approx. 1537 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD7PT7B_H
|
||||
@@ -0,0 +1,227 @@
|
||||
#ifndef MONTSERRATBOLD9PT7B_H
|
||||
#define MONTSERRATBOLD9PT7B_H
|
||||
const uint8_t Montserrat_Bold9pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xE3, 0xFE, 0xCF, 0x3C, 0xF3, 0xCF, 0x30, 0x0C,
|
||||
0x60, 0x66, 0x03, 0x30, 0xFF, 0xF7, 0xFF, 0x8C, 0x60, 0x63, 0x03, 0x18,
|
||||
0xFF, 0xF7, 0xFF, 0x86, 0x60, 0x33, 0x03, 0x18, 0x00, 0x06, 0x00, 0xC0,
|
||||
0x3E, 0x1F, 0xE7, 0xFC, 0xEC, 0x1D, 0x83, 0xF0, 0x3F, 0x81, 0xF8, 0x1F,
|
||||
0x83, 0x76, 0x6E, 0xFF, 0x8F, 0xE0, 0x30, 0x06, 0x00, 0x38, 0x18, 0xF8,
|
||||
0x71, 0x98, 0xC6, 0x33, 0x04, 0x6C, 0x0D, 0x98, 0x0F, 0x67, 0x01, 0x9F,
|
||||
0x03, 0x66, 0x0C, 0xCC, 0x31, 0x98, 0x63, 0xB1, 0x83, 0xC0, 0x1E, 0x03,
|
||||
0xF0, 0x73, 0x87, 0x38, 0x77, 0x03, 0xE0, 0x3C, 0x0F, 0xE6, 0xE7, 0xEC,
|
||||
0x3E, 0xE1, 0xEF, 0xFF, 0x7F, 0x60, 0xFF, 0xF0, 0x39, 0x9C, 0xE6, 0x73,
|
||||
0x9C, 0xE7, 0x38, 0xC7, 0x38, 0xC7, 0x63, 0x9C, 0x73, 0x9C, 0xE7, 0x39,
|
||||
0xCE, 0x73, 0x99, 0xCC, 0x18, 0x5E, 0x7E, 0x3C, 0xFE, 0x5A, 0x18, 0x1C,
|
||||
0x0E, 0x07, 0x1F, 0xFF, 0xF8, 0xE0, 0x70, 0x38, 0xFF, 0xFD, 0x80, 0xFF,
|
||||
0xC0, 0xFF, 0x80, 0x03, 0x81, 0x81, 0xC0, 0xE0, 0x60, 0x70, 0x38, 0x18,
|
||||
0x1C, 0x0C, 0x06, 0x07, 0x03, 0x01, 0x81, 0xC0, 0xC0, 0x60, 0x00, 0x1E,
|
||||
0x07, 0xF1, 0xFE, 0x70, 0xEE, 0x1D, 0xC3, 0xB8, 0x37, 0x06, 0xE1, 0xDC,
|
||||
0x39, 0xCF, 0x3F, 0xC3, 0xF0, 0xFF, 0xFF, 0xC7, 0x1C, 0x71, 0xC7, 0x1C,
|
||||
0x71, 0xC7, 0x1C, 0x1E, 0x1F, 0xEF, 0xF8, 0x07, 0x01, 0xC0, 0xE0, 0x78,
|
||||
0x3C, 0x1E, 0x0F, 0x07, 0x81, 0xFF, 0x7F, 0xC0, 0x7F, 0x9F, 0xE7, 0xF8,
|
||||
0x1C, 0x0E, 0x03, 0x81, 0xF8, 0x7F, 0x01, 0xC0, 0x76, 0x3F, 0xFE, 0x7F,
|
||||
0x00, 0x07, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0xC0, 0x70, 0x1C, 0xE7, 0x1C,
|
||||
0xFF, 0xFF, 0xFC, 0x0E, 0x01, 0xC0, 0x38, 0x3F, 0x8F, 0xE3, 0xF9, 0xC0,
|
||||
0x70, 0x1F, 0xC7, 0xF8, 0x1F, 0x01, 0xC0, 0x76, 0x3F, 0xFE, 0x7F, 0x00,
|
||||
0x0F, 0x0F, 0xE7, 0xFB, 0xC0, 0xE0, 0x3B, 0xCF, 0xFB, 0xCF, 0xE1, 0xF8,
|
||||
0x7F, 0x1D, 0xFE, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0xEE, 0x3C,
|
||||
0x07, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xC0, 0x1E,
|
||||
0x1F, 0xEF, 0x3F, 0x87, 0xE1, 0xDF, 0xE7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7E,
|
||||
0x1F, 0xFE, 0x3F, 0x00, 0x1E, 0x07, 0xF1, 0xCF, 0x70, 0xEE, 0x1E, 0xE3,
|
||||
0xDF, 0xF9, 0xF7, 0x00, 0xE0, 0x38, 0x0F, 0x3F, 0xC7, 0xF0, 0xFF, 0x80,
|
||||
0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xFF, 0x60, 0x00, 0x83, 0xC7, 0xFF, 0x8E,
|
||||
0x07, 0xC0, 0xFC, 0x1F, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07,
|
||||
0xFF, 0xFE, 0x80, 0x70, 0x3F, 0x03, 0xF0, 0x38, 0x7D, 0xF9, 0xE0, 0xC0,
|
||||
0x00, 0x1E, 0x1F, 0xEF, 0xF8, 0x07, 0x01, 0xC0, 0xE0, 0x70, 0x38, 0x0E,
|
||||
0x00, 0x00, 0xE0, 0x38, 0x0E, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0E, 0x07,
|
||||
0x8E, 0x00, 0xC6, 0x3F, 0xB6, 0x3F, 0xCF, 0x38, 0xE7, 0x98, 0x73, 0xCC,
|
||||
0x39, 0xE6, 0x1C, 0xF3, 0x8E, 0x79, 0xFF, 0xE6, 0x3D, 0xE3, 0x80, 0x00,
|
||||
0xF0, 0x40, 0x1F, 0xE0, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x1E, 0x00, 0x78,
|
||||
0x03, 0xF0, 0x0D, 0xC0, 0x73, 0x81, 0xCE, 0x0E, 0x1C, 0x3F, 0xF1, 0xFF,
|
||||
0xC7, 0x03, 0x98, 0x0E, 0xE0, 0x1C, 0xFF, 0x0F, 0xFC, 0xFF, 0xEE, 0x0E,
|
||||
0xE0, 0xEE, 0x1E, 0xFF, 0xCF, 0xFE, 0xE0, 0x7E, 0x07, 0xE0, 0xFF, 0xFE,
|
||||
0xFF, 0xC0, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x06, 0xE0, 0x0E, 0x00, 0xE0,
|
||||
0x0E, 0x00, 0xE0, 0x0F, 0x00, 0x78, 0xE3, 0xFE, 0x1F, 0xC0, 0xFF, 0x07,
|
||||
0xFE, 0x3F, 0xFD, 0xC0, 0xEE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0,
|
||||
0x3F, 0x03, 0xF8, 0x7D, 0xFF, 0xCF, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0xE0, 0x3F, 0xEF, 0xFB, 0xFE, 0xE0, 0x38, 0x0E, 0x03, 0xFF, 0xFF,
|
||||
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x38, 0x0F, 0xFB, 0xFE, 0xE0,
|
||||
0x38, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x06,
|
||||
0xE0, 0x0E, 0x00, 0xE0, 0x7E, 0x07, 0xE0, 0x7F, 0x07, 0x78, 0xF3, 0xFF,
|
||||
0x1F, 0xC0, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7F, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x70, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0x7F, 0x7F, 0x7F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x07, 0xC7, 0xFF, 0x7E, 0xE0, 0x77, 0x07, 0x38, 0x71, 0xC7, 0x0E, 0x70,
|
||||
0x77, 0x03, 0xF8, 0x1F, 0xE0, 0xFF, 0x87, 0x9E, 0x38, 0x79, 0xC1, 0xCE,
|
||||
0x07, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80,
|
||||
0xE0, 0x38, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0xE0, 0x0F, 0xE0, 0x1F, 0xC0,
|
||||
0x7F, 0xC1, 0xFF, 0x83, 0xFF, 0x8F, 0xFB, 0x9B, 0xF7, 0x77, 0xE7, 0xCF,
|
||||
0xC7, 0x9F, 0x8E, 0x3F, 0x08, 0x7E, 0x00, 0xE0, 0xE0, 0x7F, 0x07, 0xF8,
|
||||
0x7F, 0x87, 0xFC, 0x7F, 0xE7, 0xEF, 0x7E, 0x7F, 0xE3, 0xFE, 0x1F, 0xE0,
|
||||
0xFE, 0x0F, 0xE0, 0x70, 0x0F, 0x81, 0xFF, 0x1F, 0xFC, 0xE0, 0xFE, 0x03,
|
||||
0xF0, 0x1F, 0x80, 0x7C, 0x07, 0xE0, 0x3F, 0x81, 0xDE, 0x3C, 0x7F, 0xC1,
|
||||
0xFC, 0x00, 0xFE, 0x1F, 0xFB, 0xFF, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||
0xFF, 0xFF, 0xDF, 0xC3, 0x80, 0x70, 0x0E, 0x00, 0x0F, 0x80, 0xFF, 0x87,
|
||||
0xFF, 0x1C, 0x1E, 0xE0, 0x3B, 0x80, 0xEE, 0x01, 0xB8, 0x0E, 0xE0, 0x3B,
|
||||
0xC0, 0xE7, 0x8F, 0x0F, 0xF8, 0x1F, 0xC0, 0x0F, 0x20, 0x1F, 0xC0, 0x1E,
|
||||
0xFE, 0x0F, 0xFC, 0xFF, 0xEE, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0, 0xEF, 0xFE,
|
||||
0xFF, 0xCE, 0x38, 0xE1, 0xCE, 0x1E, 0xE0, 0xE0, 0x0F, 0x87, 0xF9, 0xFF,
|
||||
0x38, 0x07, 0x00, 0xF8, 0x0F, 0xE0, 0x7E, 0x01, 0xE0, 0x1D, 0x83, 0xBF,
|
||||
0xE3, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0xE0, 0x1C, 0x03, 0x80,
|
||||
0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0xE0, 0x7E, 0x07, 0xE0,
|
||||
0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0F, 0x79,
|
||||
0xE3, 0xFE, 0x1F, 0x80, 0xE0, 0x1F, 0x80, 0xE7, 0x03, 0x9C, 0x1C, 0x38,
|
||||
0x70, 0xE1, 0x83, 0xCE, 0x07, 0x38, 0x1D, 0xC0, 0x3F, 0x00, 0xF8, 0x01,
|
||||
0xE0, 0x07, 0x00, 0xE0, 0x70, 0x3B, 0x83, 0x83, 0x9C, 0x1E, 0x1C, 0xE1,
|
||||
0xF0, 0xE3, 0x8D, 0x8E, 0x1C, 0x6E, 0x70, 0xE7, 0x73, 0x83, 0xB3, 0xB8,
|
||||
0x1D, 0x8F, 0xC0, 0xFC, 0x7E, 0x03, 0xC3, 0xE0, 0x1E, 0x0F, 0x00, 0xF0,
|
||||
0x78, 0x00, 0xF0, 0x73, 0x83, 0x8E, 0x38, 0x7B, 0x81, 0xFC, 0x07, 0xC0,
|
||||
0x1C, 0x01, 0xF0, 0x1F, 0xC0, 0xEE, 0x0E, 0x38, 0xE1, 0xEF, 0x07, 0x00,
|
||||
0xE0, 0x3F, 0x07, 0x70, 0xE3, 0x8E, 0x39, 0xC1, 0xD8, 0x1F, 0x80, 0xF0,
|
||||
0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0xFF, 0xDF, 0xFB, 0xFF,
|
||||
0x01, 0xC0, 0x78, 0x1E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0xC0, 0x7F,
|
||||
0xFF, 0xFE, 0xFF, 0xF9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0xFF,
|
||||
0xE0, 0x30, 0x1C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x1C, 0x06, 0x03,
|
||||
0x01, 0xC0, 0x60, 0x38, 0x1C, 0x06, 0x03, 0x80, 0xFF, 0xCE, 0x73, 0x9C,
|
||||
0xE7, 0x39, 0xCE, 0x73, 0x9F, 0xFF, 0x1C, 0x0E, 0x0D, 0x86, 0xC6, 0x73,
|
||||
0x1B, 0x8C, 0xFF, 0xFF, 0xC0, 0xE3, 0x8E, 0x3C, 0x7F, 0x99, 0xE0, 0x73,
|
||||
0xFF, 0xFF, 0x8F, 0x87, 0xFF, 0xBF, 0xC0, 0xE0, 0x1C, 0x03, 0x80, 0x77,
|
||||
0x8F, 0xF9, 0xF7, 0xBC, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xC7, 0x7F, 0xEE,
|
||||
0xF8, 0x1E, 0x3F, 0xFF, 0xFC, 0x2C, 0x06, 0x03, 0x81, 0xE7, 0x7F, 0x9F,
|
||||
0x80, 0x01, 0xC0, 0x70, 0x1C, 0x77, 0x7F, 0xFF, 0xFE, 0x1F, 0x87, 0xC1,
|
||||
0xF8, 0x7F, 0x3D, 0xFF, 0x3F, 0xC0, 0x1E, 0x1F, 0xCF, 0x3B, 0x87, 0xFF,
|
||||
0xFF, 0xFE, 0x03, 0xC4, 0x7F, 0x8F, 0xC0, 0x00, 0x1E, 0x3E, 0x30, 0x30,
|
||||
0xFE, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1C, 0xDF, 0xFF,
|
||||
0xFF, 0x87, 0xC1, 0xF8, 0x7E, 0x1F, 0xFF, 0x7F, 0xC2, 0x74, 0x1D, 0xFF,
|
||||
0xFF, 0x87, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0xBC, 0xFF, 0xBF, 0xFF, 0x1F,
|
||||
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xC0, 0xFF, 0x8F, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0x1C, 0x71, 0xC0, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C,
|
||||
0x71, 0xDF, 0x79, 0xC0, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0xEE, 0x39, 0xCE,
|
||||
0x3B, 0x87, 0xF0, 0xFE, 0x1E, 0xE3, 0x9E, 0x71, 0xEE, 0x1E, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0xEF, 0x1C, 0x7F, 0xFF, 0xBF, 0xFF, 0xDC, 0x38, 0x7E,
|
||||
0x1C, 0x3F, 0x0E, 0x1F, 0x87, 0x0F, 0xC3, 0x87, 0xE1, 0xC3, 0xF0, 0xE1,
|
||||
0xC0, 0xEF, 0x3F, 0xEF, 0xFF, 0xC7, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1,
|
||||
0xF8, 0x70, 0x1E, 0x1F, 0xEF, 0xFB, 0x87, 0xC1, 0xF0, 0x7E, 0x1F, 0xCF,
|
||||
0x7F, 0x8F, 0xC0, 0xEF, 0x1F, 0xF3, 0xEF, 0x78, 0x7E, 0x0F, 0xC1, 0xF8,
|
||||
0x3F, 0x8E, 0xFF, 0xDD, 0xF3, 0x80, 0x70, 0x0E, 0x00, 0x1D, 0xDF, 0xFF,
|
||||
0xFF, 0x87, 0xC1, 0xF0, 0x7E, 0x1F, 0xCF, 0x7F, 0xCF, 0xF0, 0x1C, 0x07,
|
||||
0x01, 0xC0, 0xEF, 0xFF, 0xFC, 0xE3, 0x8E, 0x38, 0xE3, 0x80, 0x1F, 0x3F,
|
||||
0xDC, 0x4C, 0x07, 0xE1, 0xFC, 0x0E, 0x87, 0x7F, 0xBF, 0x80, 0x30, 0x30,
|
||||
0xFE, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x3E, 0x1F, 0xE1, 0xF8,
|
||||
0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0xCF, 0xF0, 0xE0,
|
||||
0xFC, 0x19, 0xC7, 0x38, 0xE3, 0x38, 0x77, 0x0E, 0xC0, 0xF8, 0x1E, 0x01,
|
||||
0xC0, 0xE1, 0xC3, 0xF0, 0xE1, 0x98, 0x70, 0xCE, 0x7C, 0xE3, 0x36, 0x61,
|
||||
0xBB, 0xB0, 0xFD, 0xF8, 0x3C, 0x78, 0x1E, 0x3C, 0x0E, 0x1E, 0x00, 0xE1,
|
||||
0xCE, 0x38, 0xEE, 0x0F, 0x81, 0xE0, 0x1C, 0x07, 0xC1, 0xDC, 0x73, 0xDC,
|
||||
0x38, 0xE0, 0xFC, 0x19, 0xC7, 0x38, 0xE3, 0x38, 0x77, 0x06, 0xC0, 0xF8,
|
||||
0x1E, 0x01, 0xC0, 0x38, 0x7E, 0x0F, 0x80, 0xE0, 0x00, 0xFF, 0xFF, 0x07,
|
||||
0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xFF, 0xFF, 0x3C, 0xF7, 0x1C, 0x71, 0xC7,
|
||||
0x3C, 0xF1, 0xC7, 0x1C, 0x71, 0xC7, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF3, 0xE3, 0x8E, 0x38, 0xE3, 0x8F, 0x3C, 0xE3, 0x8E, 0x38, 0xEF,
|
||||
0xBC, 0x71, 0xFF, 0xF3, 0xC0 };
|
||||
|
||||
const GFXglyph Montserrat_Bold9pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 3, 13, 5, 1, -12 }, // 0x21 '!'
|
||||
{ 6, 6, 6, 8, 1, -12 }, // 0x22 '"'
|
||||
{ 11, 13, 13, 13, 0, -12 }, // 0x23 '#'
|
||||
{ 33, 11, 17, 11, 0, -14 }, // 0x24 '$'
|
||||
{ 57, 15, 13, 16, 0, -12 }, // 0x25 '%'
|
||||
{ 82, 12, 13, 13, 1, -12 }, // 0x26 '&'
|
||||
{ 102, 2, 6, 4, 1, -12 }, // 0x27 '''
|
||||
{ 104, 5, 16, 6, 1, -12 }, // 0x28 '('
|
||||
{ 114, 5, 16, 6, 0, -12 }, // 0x29 ')'
|
||||
{ 124, 8, 7, 8, 0, -12 }, // 0x2A '*'
|
||||
{ 131, 9, 8, 11, 1, -9 }, // 0x2B '+'
|
||||
{ 140, 3, 6, 5, 1, -2 }, // 0x2C ','
|
||||
{ 143, 5, 2, 7, 1, -5 }, // 0x2D '-'
|
||||
{ 145, 3, 3, 5, 1, -2 }, // 0x2E '.'
|
||||
{ 147, 9, 17, 7, -1, -14 }, // 0x2F '/'
|
||||
{ 167, 11, 13, 12, 1, -12 }, // 0x30 '0'
|
||||
{ 185, 6, 13, 7, 0, -12 }, // 0x31 '1'
|
||||
{ 195, 10, 13, 11, 0, -12 }, // 0x32 '2'
|
||||
{ 212, 10, 13, 11, 0, -12 }, // 0x33 '3'
|
||||
{ 229, 11, 13, 12, 1, -12 }, // 0x34 '4'
|
||||
{ 247, 10, 13, 11, 0, -12 }, // 0x35 '5'
|
||||
{ 264, 10, 13, 11, 1, -12 }, // 0x36 '6'
|
||||
{ 281, 11, 13, 11, 0, -12 }, // 0x37 '7'
|
||||
{ 299, 10, 13, 12, 1, -12 }, // 0x38 '8'
|
||||
{ 316, 11, 13, 11, 0, -12 }, // 0x39 '9'
|
||||
{ 334, 3, 9, 5, 1, -8 }, // 0x3A ':'
|
||||
{ 338, 3, 12, 5, 1, -8 }, // 0x3B ';'
|
||||
{ 343, 9, 9, 11, 1, -10 }, // 0x3C '<'
|
||||
{ 354, 9, 7, 11, 1, -9 }, // 0x3D '='
|
||||
{ 362, 9, 9, 11, 1, -10 }, // 0x3E '>'
|
||||
{ 373, 10, 13, 11, 0, -12 }, // 0x3F '?'
|
||||
{ 390, 17, 17, 19, 1, -12 }, // 0x40 '@'
|
||||
{ 427, 14, 13, 14, 0, -12 }, // 0x41 'A'
|
||||
{ 450, 12, 13, 14, 1, -12 }, // 0x42 'B'
|
||||
{ 470, 12, 13, 13, 1, -12 }, // 0x43 'C'
|
||||
{ 490, 13, 13, 15, 1, -12 }, // 0x44 'D'
|
||||
{ 512, 10, 13, 12, 1, -12 }, // 0x45 'E'
|
||||
{ 529, 10, 13, 12, 1, -12 }, // 0x46 'F'
|
||||
{ 546, 12, 13, 14, 1, -12 }, // 0x47 'G'
|
||||
{ 566, 12, 13, 15, 1, -12 }, // 0x48 'H'
|
||||
{ 586, 3, 13, 6, 1, -12 }, // 0x49 'I'
|
||||
{ 591, 8, 13, 10, 0, -12 }, // 0x4A 'J'
|
||||
{ 604, 13, 13, 13, 1, -12 }, // 0x4B 'K'
|
||||
{ 626, 10, 13, 11, 1, -12 }, // 0x4C 'L'
|
||||
{ 643, 15, 13, 17, 1, -12 }, // 0x4D 'M'
|
||||
{ 668, 12, 13, 15, 1, -12 }, // 0x4E 'N'
|
||||
{ 688, 13, 13, 15, 1, -12 }, // 0x4F 'O'
|
||||
{ 710, 11, 13, 13, 1, -12 }, // 0x50 'P'
|
||||
{ 728, 14, 16, 15, 1, -12 }, // 0x51 'Q'
|
||||
{ 756, 12, 13, 13, 1, -12 }, // 0x52 'R'
|
||||
{ 776, 11, 13, 11, 0, -12 }, // 0x53 'S'
|
||||
{ 794, 11, 13, 11, 0, -12 }, // 0x54 'T'
|
||||
{ 812, 12, 13, 14, 1, -12 }, // 0x55 'U'
|
||||
{ 832, 14, 13, 13, 0, -12 }, // 0x56 'V'
|
||||
{ 855, 21, 13, 21, 0, -12 }, // 0x57 'W'
|
||||
{ 890, 13, 13, 13, 0, -12 }, // 0x58 'X'
|
||||
{ 912, 12, 13, 12, 0, -12 }, // 0x59 'Y'
|
||||
{ 932, 11, 13, 12, 1, -12 }, // 0x5A 'Z'
|
||||
{ 950, 5, 16, 7, 1, -12 }, // 0x5B '['
|
||||
{ 960, 9, 17, 7, -1, -14 }, // 0x5C '\'
|
||||
{ 980, 5, 16, 7, 0, -12 }, // 0x5D ']'
|
||||
{ 990, 9, 7, 11, 1, -9 }, // 0x5E '^'
|
||||
{ 998, 9, 2, 9, 0, 1 }, // 0x5F '_'
|
||||
{ 1001, 5, 3, 11, 2, -13 }, // 0x60 '`'
|
||||
{ 1003, 9, 10, 11, 1, -9 }, // 0x61 'a'
|
||||
{ 1015, 11, 13, 12, 1, -12 }, // 0x62 'b'
|
||||
{ 1033, 9, 10, 11, 1, -9 }, // 0x63 'c'
|
||||
{ 1045, 10, 13, 12, 1, -12 }, // 0x64 'd'
|
||||
{ 1062, 10, 10, 11, 1, -9 }, // 0x65 'e'
|
||||
{ 1075, 8, 14, 7, 0, -13 }, // 0x66 'f'
|
||||
{ 1089, 10, 14, 13, 1, -9 }, // 0x67 'g'
|
||||
{ 1107, 10, 13, 12, 1, -12 }, // 0x68 'h'
|
||||
{ 1124, 3, 14, 5, 1, -13 }, // 0x69 'i'
|
||||
{ 1130, 6, 18, 6, -2, -13 }, // 0x6A 'j'
|
||||
{ 1144, 11, 13, 12, 1, -12 }, // 0x6B 'k'
|
||||
{ 1162, 3, 13, 5, 1, -12 }, // 0x6C 'l'
|
||||
{ 1167, 17, 10, 19, 1, -9 }, // 0x6D 'm'
|
||||
{ 1189, 10, 10, 12, 1, -9 }, // 0x6E 'n'
|
||||
{ 1202, 10, 10, 12, 1, -9 }, // 0x6F 'o'
|
||||
{ 1215, 11, 13, 12, 1, -9 }, // 0x70 'p'
|
||||
{ 1233, 10, 13, 12, 1, -9 }, // 0x71 'q'
|
||||
{ 1250, 6, 10, 8, 1, -9 }, // 0x72 'r'
|
||||
{ 1258, 9, 10, 10, 0, -9 }, // 0x73 's'
|
||||
{ 1270, 8, 12, 8, 0, -11 }, // 0x74 't'
|
||||
{ 1282, 10, 10, 12, 1, -9 }, // 0x75 'u'
|
||||
{ 1295, 11, 10, 11, 0, -9 }, // 0x76 'v'
|
||||
{ 1309, 17, 10, 17, 0, -9 }, // 0x77 'w'
|
||||
{ 1331, 11, 10, 11, 0, -9 }, // 0x78 'x'
|
||||
{ 1345, 11, 14, 11, 0, -9 }, // 0x79 'y'
|
||||
{ 1365, 8, 10, 10, 1, -9 }, // 0x7A 'z'
|
||||
{ 1375, 6, 16, 7, 1, -12 }, // 0x7B '{'
|
||||
{ 1387, 3, 16, 6, 1, -12 }, // 0x7C '|'
|
||||
{ 1393, 6, 16, 7, 0, -12 }, // 0x7D '}'
|
||||
{ 1405, 9, 3, 11, 1, -7 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont Montserrat_Bold9pt7b PROGMEM = {
|
||||
(uint8_t *)Montserrat_Bold9pt7bBitmaps,
|
||||
(GFXglyph *)Montserrat_Bold9pt7bGlyphs,
|
||||
0x20, 0x7E, 21 };
|
||||
|
||||
// Approx. 2081 bytes
|
||||
|
||||
#endif // MONTSERRATBOLD9PT7B_H
|
||||
@@ -0,0 +1,272 @@
|
||||
#ifndef NOTOSANS12PT7B_H
|
||||
#define NOTOSANS12PT7B_H
|
||||
const uint8_t NotoSans_Regular12pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xDB, 0x6D, 0xB6, 0xDB, 0x60, 0x37, 0xC0, 0xCF, 0x3C, 0xF3, 0x8E,
|
||||
0x30, 0x06, 0x30, 0x10, 0x80, 0xC6, 0x03, 0x18, 0x0C, 0x63, 0xFF, 0xFF,
|
||||
0xFF, 0xC6, 0x30, 0x18, 0xC0, 0x63, 0x01, 0x8C, 0x3F, 0xFE, 0x31, 0x80,
|
||||
0xC6, 0x03, 0x18, 0x0C, 0x60, 0x21, 0x00, 0x04, 0x00, 0x80, 0x7E, 0x1F,
|
||||
0xF6, 0x45, 0xC8, 0x39, 0x03, 0x20, 0x7C, 0x03, 0xF0, 0x1F, 0x02, 0x70,
|
||||
0x46, 0x08, 0xF1, 0x3F, 0xFE, 0x3F, 0x00, 0x80, 0x10, 0x00, 0x38, 0x0C,
|
||||
0x36, 0x06, 0x31, 0x86, 0x18, 0xC3, 0x0C, 0x63, 0x06, 0x31, 0x03, 0x19,
|
||||
0x81, 0x8D, 0x9E, 0x66, 0xD9, 0xBE, 0xC8, 0xC4, 0x6C, 0x20, 0x66, 0x10,
|
||||
0x33, 0x08, 0x30, 0x84, 0x10, 0x46, 0x18, 0x33, 0x18, 0x0F, 0x00, 0x0F,
|
||||
0x00, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x31, 0xC0, 0x1B,
|
||||
0x80, 0x0F, 0x00, 0x1E, 0x00, 0x73, 0x06, 0x61, 0x8E, 0xE0, 0xEC, 0xC0,
|
||||
0x7C, 0xE0, 0x38, 0x60, 0x7C, 0x7F, 0xEE, 0x3F, 0x87, 0xFF, 0xA0, 0x19,
|
||||
0x8C, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x8C, 0x63, 0x0C, 0x71,
|
||||
0x80, 0xC3, 0x18, 0x63, 0x18, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x66, 0x31,
|
||||
0x98, 0xCC, 0x00, 0x0E, 0x01, 0x80, 0x10, 0x42, 0x1F, 0x5F, 0xFF, 0xC3,
|
||||
0x80, 0xD8, 0x3B, 0x8E, 0x30, 0x44, 0x00, 0x06, 0x00, 0xC0, 0x18, 0x03,
|
||||
0x00, 0x61, 0xFF, 0xFF, 0xF8, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, 0x76,
|
||||
0x66, 0xCC, 0xFF, 0xF0, 0xDF, 0x00, 0x03, 0x81, 0x80, 0xC0, 0xC0, 0x60,
|
||||
0x30, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x81, 0x80, 0xC0,
|
||||
0xC0, 0x00, 0x1F, 0x07, 0xF1, 0xC3, 0x30, 0x76, 0x07, 0x80, 0xF0, 0x1E,
|
||||
0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x06, 0xC1, 0xD8, 0x31, 0xFE,
|
||||
0x1F, 0x00, 0x0C, 0x73, 0xFB, 0x4C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
|
||||
0x30, 0xC3, 0x0C, 0x1F, 0x0F, 0xF3, 0x83, 0x00, 0x60, 0x0E, 0x01, 0x80,
|
||||
0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x07,
|
||||
0xFF, 0xFF, 0xE0, 0x3F, 0x1F, 0xF9, 0x03, 0x00, 0x70, 0x0E, 0x01, 0x80,
|
||||
0x70, 0xFC, 0x1F, 0x00, 0x38, 0x03, 0x80, 0x30, 0x06, 0x00, 0xE0, 0x3F,
|
||||
0xFE, 0x7F, 0x80, 0x00, 0xE0, 0x0F, 0x00, 0x58, 0x06, 0xC0, 0x66, 0x03,
|
||||
0x30, 0x31, 0x83, 0x0C, 0x18, 0x61, 0x83, 0x18, 0x19, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x7F, 0xCF, 0xF9, 0x80, 0x30,
|
||||
0x06, 0x00, 0xC0, 0x18, 0x03, 0xFC, 0x77, 0xC0, 0x1C, 0x01, 0x80, 0x30,
|
||||
0x06, 0x00, 0xE0, 0x37, 0xFE, 0x7F, 0x00, 0x07, 0xC3, 0xF8, 0xE0, 0x18,
|
||||
0x06, 0x00, 0xC0, 0x18, 0x86, 0xFE, 0xF0, 0xFC, 0x0F, 0x81, 0xE0, 0x36,
|
||||
0x06, 0xC0, 0xDC, 0x39, 0xFE, 0x1F, 0x80, 0xFF, 0xFF, 0xFC, 0x01, 0x80,
|
||||
0x70, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x03, 0x00,
|
||||
0xE0, 0x18, 0x07, 0x00, 0xC0, 0x38, 0x00, 0x1F, 0x07, 0xF9, 0x83, 0x30,
|
||||
0x36, 0x06, 0xC1, 0x8C, 0x70, 0xFC, 0x1F, 0x07, 0x79, 0x83, 0xE0, 0x3C,
|
||||
0x07, 0x80, 0xF8, 0x1B, 0xDE, 0x3F, 0x80, 0x1F, 0x07, 0xF1, 0x83, 0x70,
|
||||
0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x03, 0x60, 0xE7, 0xEC, 0x79, 0x80, 0x30,
|
||||
0x0C, 0x01, 0x80, 0x63, 0x7C, 0x7E, 0x00, 0xDF, 0x00, 0x00, 0x03, 0x7C,
|
||||
0x67, 0x60, 0x00, 0x00, 0x00, 0x66, 0x6C, 0xCC, 0x00, 0x20, 0x1C, 0x0E,
|
||||
0x07, 0x03, 0x81, 0xC0, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0x80,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0xC0, 0x1E, 0x00,
|
||||
0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x78, 0x3C, 0x3E, 0x1E, 0x03, 0x00,
|
||||
0x00, 0x3E, 0x3F, 0xE4, 0x18, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x1C, 0x0E,
|
||||
0x03, 0x01, 0x80, 0x60, 0x00, 0x00, 0x01, 0x80, 0x70, 0x1C, 0x00, 0x00,
|
||||
0xF8, 0x00, 0xFF, 0xC0, 0x38, 0x0C, 0x0C, 0x00, 0xC3, 0x00, 0x0C, 0xC3,
|
||||
0xF8, 0x98, 0xE3, 0x1A, 0x18, 0x63, 0xC6, 0x0C, 0x78, 0xC1, 0x0F, 0x18,
|
||||
0x21, 0xE3, 0x0C, 0x24, 0x31, 0xCC, 0xC7, 0xCF, 0x18, 0x00, 0x01, 0x80,
|
||||
0x00, 0x38, 0x00, 0x03, 0xF7, 0x80, 0x1F, 0xE0, 0x00, 0x03, 0x80, 0x07,
|
||||
0x00, 0x0A, 0x00, 0x36, 0x00, 0x6C, 0x01, 0xCC, 0x03, 0x18, 0x06, 0x30,
|
||||
0x18, 0x30, 0x30, 0x60, 0x7F, 0xC1, 0xFF, 0xC3, 0x01, 0x8E, 0x03, 0x98,
|
||||
0x03, 0x30, 0x06, 0xC0, 0x06, 0xFF, 0x0F, 0xFC, 0xC0, 0xEC, 0x06, 0xC0,
|
||||
0x6C, 0x06, 0xC0, 0x6F, 0xFC, 0xFF, 0x8C, 0x0E, 0xC0, 0x7C, 0x03, 0xC0,
|
||||
0x3C, 0x07, 0xC0, 0x6F, 0xFE, 0xFF, 0x80, 0x07, 0xF0, 0xFF, 0xCF, 0x02,
|
||||
0x60, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x18,
|
||||
0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xE0, 0x03, 0xFE, 0x0F, 0xF0, 0xFF,
|
||||
0x03, 0xFF, 0x0C, 0x0F, 0x30, 0x0C, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xF0,
|
||||
0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x06, 0xC0, 0x1B, 0x00, 0xCC,
|
||||
0x0F, 0x3F, 0xF8, 0xFF, 0x00, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30,
|
||||
0x0C, 0x03, 0xFE, 0xFF, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
|
||||
0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
|
||||
0x00, 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0,
|
||||
0x00, 0x03, 0xF8, 0x3F, 0xF1, 0xC0, 0x4C, 0x00, 0x70, 0x01, 0x80, 0x06,
|
||||
0x00, 0x38, 0x00, 0xE0, 0x7F, 0x81, 0xF6, 0x00, 0xD8, 0x03, 0x60, 0x0C,
|
||||
0xC0, 0x33, 0x80, 0xC7, 0xFF, 0x07, 0xFC, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
|
||||
0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0xF0,
|
||||
0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x18, 0xFF,
|
||||
0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x1E, 0xFC,
|
||||
0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
|
||||
0x0C, 0x30, 0xEF, 0xF8, 0xC0, 0x36, 0x03, 0x30, 0x31, 0x83, 0x0C, 0x30,
|
||||
0x63, 0x83, 0x38, 0x1B, 0x80, 0xFC, 0x07, 0xF0, 0x31, 0xC1, 0x87, 0x0C,
|
||||
0x18, 0x60, 0xE3, 0x03, 0x98, 0x0C, 0xC0, 0x38, 0xC0, 0x30, 0x0C, 0x03,
|
||||
0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0,
|
||||
0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0xF0, 0x03, 0xF8, 0x03, 0xFC, 0x01,
|
||||
0xFB, 0x00, 0xFD, 0x80, 0xDE, 0xC0, 0x6F, 0x30, 0x27, 0x98, 0x33, 0xCE,
|
||||
0x19, 0xE3, 0x18, 0xF1, 0x8C, 0x78, 0x66, 0x3C, 0x36, 0x1E, 0x1B, 0x0F,
|
||||
0x07, 0x07, 0x83, 0x83, 0xC1, 0xC1, 0x80, 0xE0, 0x0F, 0xC0, 0x3F, 0x00,
|
||||
0xFE, 0x03, 0xD8, 0x0F, 0x30, 0x3C, 0xE0, 0xF1, 0x83, 0xC3, 0x0F, 0x0E,
|
||||
0x3C, 0x18, 0xF0, 0x33, 0xC0, 0xEF, 0x01, 0xBC, 0x07, 0xF0, 0x0F, 0xC0,
|
||||
0x1C, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60,
|
||||
0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60,
|
||||
0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0xFE,
|
||||
0x1F, 0xFB, 0x07, 0x60, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xC7, 0xDF,
|
||||
0xF3, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x07,
|
||||
0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60,
|
||||
0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60,
|
||||
0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0x70, 0x00,
|
||||
0x38, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0x0F, 0xFC, 0xC1, 0xCC, 0x0E, 0xC0,
|
||||
0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8F, 0xF0, 0xC3, 0x0C, 0x18, 0xC1,
|
||||
0xCC, 0x0C, 0xC0, 0xEC, 0x06, 0xC0, 0x70, 0x1F, 0x8F, 0xF9, 0x81, 0x70,
|
||||
0x0E, 0x00, 0xC0, 0x1C, 0x01, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0x00, 0x70,
|
||||
0x06, 0x00, 0xE0, 0x37, 0xFE, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0,
|
||||
0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01,
|
||||
0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0xC0,
|
||||
0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03,
|
||||
0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xF0, 0x1D, 0xC0, 0xC7,
|
||||
0xFC, 0x1F, 0xC0, 0xC0, 0x0F, 0x80, 0x76, 0x01, 0x98, 0x06, 0x30, 0x38,
|
||||
0xC0, 0xC3, 0x03, 0x06, 0x1C, 0x18, 0x60, 0x61, 0x80, 0xCC, 0x03, 0x30,
|
||||
0x0C, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x03, 0x00, 0xE0, 0x30, 0x1D,
|
||||
0x81, 0xC0, 0x66, 0x07, 0x81, 0x98, 0x1E, 0x0E, 0x70, 0xD8, 0x30, 0xC3,
|
||||
0x30, 0xC3, 0x0C, 0xC3, 0x0C, 0x33, 0x1C, 0x39, 0x8C, 0x60, 0x66, 0x19,
|
||||
0x81, 0x98, 0x66, 0x06, 0xC1, 0xB8, 0x0F, 0x03, 0xC0, 0x3C, 0x0F, 0x00,
|
||||
0xF0, 0x3C, 0x03, 0x80, 0xE0, 0x06, 0x01, 0x80, 0xE0, 0x19, 0xC0, 0xC3,
|
||||
0x03, 0x06, 0x18, 0x18, 0xE0, 0x33, 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x00,
|
||||
0x1E, 0x00, 0xDC, 0x03, 0x30, 0x18, 0x60, 0xE1, 0x83, 0x03, 0x18, 0x0E,
|
||||
0xE0, 0x1C, 0xC0, 0x1B, 0x01, 0xDC, 0x0C, 0x60, 0xE3, 0x86, 0x0C, 0x60,
|
||||
0x73, 0x01, 0xB0, 0x0F, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01,
|
||||
0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0xFF, 0xEF, 0xFE, 0x00, 0xE0, 0x0C,
|
||||
0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80,
|
||||
0x30, 0x07, 0x00, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, 0x63,
|
||||
0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xFF, 0x80, 0xC0, 0x30,
|
||||
0x18, 0x0C, 0x03, 0x01, 0x80, 0x60, 0x30, 0x18, 0x06, 0x03, 0x01, 0x80,
|
||||
0x60, 0x30, 0x0C, 0x06, 0x03, 0x80, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18,
|
||||
0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFF, 0x80, 0x04, 0x00, 0xE0, 0x0A,
|
||||
0x01, 0xB0, 0x19, 0x03, 0x18, 0x30, 0x86, 0x0C, 0x60, 0x4C, 0x06, 0xC0,
|
||||
0x30, 0xFF, 0xFF, 0xF0, 0xE3, 0x0C, 0x30, 0x1F, 0x1F, 0xE2, 0x0C, 0x03,
|
||||
0x00, 0xC0, 0xF3, 0xFD, 0x83, 0xC0, 0xF0, 0x3C, 0x1D, 0xDF, 0x7E, 0x40,
|
||||
0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x9E, 0x37, 0xE7, 0x06, 0xE0,
|
||||
0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1F, 0x06, 0xFF, 0xDB,
|
||||
0xF0, 0x0F, 0x4F, 0xE7, 0x09, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x00, 0xE0,
|
||||
0x18, 0x07, 0x00, 0xFE, 0x1F, 0x80, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30,
|
||||
0x06, 0x1C, 0xCF, 0xFB, 0x87, 0x60, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07,
|
||||
0xC0, 0xD8, 0x1B, 0x03, 0x3F, 0xA3, 0xE4, 0x0F, 0x07, 0xF1, 0xC3, 0x30,
|
||||
0x36, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x1F, 0xE1,
|
||||
0xFC, 0x0F, 0x8F, 0xC6, 0x03, 0x01, 0x81, 0xFB, 0xFC, 0x30, 0x18, 0x0C,
|
||||
0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x0E, 0x27,
|
||||
0xF5, 0xC3, 0xB0, 0x36, 0x07, 0xC0, 0xF0, 0x1E, 0x03, 0xE0, 0x6C, 0x0D,
|
||||
0x81, 0x9F, 0xF1, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x60, 0xEF, 0xF8, 0x38,
|
||||
0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x9E, 0x37, 0xF7, 0x06,
|
||||
0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
|
||||
0x78, 0x0C, 0xF0, 0xFF, 0xFF, 0xFF, 0xC0, 0x18, 0xC0, 0x01, 0x8C, 0x63,
|
||||
0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x33, 0xFB, 0x00, 0xC0, 0x30,
|
||||
0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7C, 0x1B, 0x0C, 0xC6, 0x33, 0x0D, 0x83,
|
||||
0xE0, 0xEC, 0x33, 0x8C, 0x73, 0x0C, 0xC1, 0xB0, 0x70, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0xCF, 0x0F, 0x37, 0xEF, 0xEE, 0x1E, 0x1F, 0x83, 0x83, 0xC0,
|
||||
0xC0, 0xF0, 0x30, 0x3C, 0x0C, 0x0F, 0x03, 0x03, 0xC0, 0xC0, 0xF0, 0x30,
|
||||
0x3C, 0x0C, 0x0F, 0x03, 0x03, 0xC0, 0xC0, 0xC0, 0xCF, 0x1B, 0xFB, 0x83,
|
||||
0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
|
||||
0x3C, 0x06, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, 0x03, 0xC0,
|
||||
0x3C, 0x03, 0xE0, 0x36, 0x07, 0x70, 0x63, 0xFC, 0x1F, 0x80, 0xCF, 0x1B,
|
||||
0xF3, 0x83, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F,
|
||||
0x83, 0x7F, 0xED, 0xF9, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00,
|
||||
0x00, 0x0E, 0x27, 0xF5, 0xC3, 0xB0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x03,
|
||||
0xE0, 0x6C, 0x0D, 0x81, 0x9F, 0xF1, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x00,
|
||||
0x60, 0x0C, 0x01, 0x80, 0xCF, 0xBF, 0xC7, 0x0C, 0x18, 0x30, 0x60, 0xC1,
|
||||
0x83, 0x06, 0x0C, 0x00, 0x1E, 0x3F, 0xF8, 0x38, 0x0E, 0x03, 0xC0, 0xF8,
|
||||
0x0E, 0x01, 0x80, 0xC0, 0x7E, 0xFF, 0xE0, 0x10, 0x30, 0x7F, 0xFF, 0x30,
|
||||
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1D, 0x1F, 0xC0, 0xF8,
|
||||
0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F,
|
||||
0x03, 0xBF, 0xB7, 0xE6, 0xC0, 0x3E, 0x07, 0x60, 0x66, 0x06, 0x30, 0xC3,
|
||||
0x0C, 0x30, 0xC1, 0x98, 0x19, 0x81, 0xB0, 0x0F, 0x00, 0xF0, 0x06, 0x00,
|
||||
0xC0, 0xC0, 0xD8, 0x38, 0x36, 0x1E, 0x0D, 0x87, 0x86, 0x61, 0xB1, 0x8C,
|
||||
0x4C, 0x63, 0x33, 0x38, 0xCC, 0x6C, 0x33, 0x1B, 0x07, 0x86, 0xC1, 0xE0,
|
||||
0xA0, 0x78, 0x38, 0x0C, 0x0E, 0x00, 0x60, 0x77, 0x06, 0x30, 0xC1, 0x9C,
|
||||
0x0D, 0x80, 0xF0, 0x06, 0x00, 0xF0, 0x0D, 0x81, 0x9C, 0x30, 0xC7, 0x06,
|
||||
0xE0, 0x70, 0xC0, 0x3E, 0x07, 0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x38,
|
||||
0xC1, 0x98, 0x19, 0x80, 0xD8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x06,
|
||||
0x00, 0xC0, 0x1C, 0x0F, 0x80, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0xE0, 0x60,
|
||||
0x60, 0x60, 0x30, 0x30, 0x30, 0x38, 0x18, 0x1F, 0xFF, 0xF8, 0x02, 0x3C,
|
||||
0x60, 0xC1, 0x83, 0x06, 0x0C, 0x31, 0xE3, 0x03, 0x83, 0x03, 0x06, 0x0C,
|
||||
0x18, 0x30, 0x60, 0xF0, 0x20, 0xFF, 0xFF, 0xFF, 0x81, 0xE0, 0xC1, 0x83,
|
||||
0x06, 0x0C, 0x18, 0x38, 0x3C, 0x18, 0xE3, 0x86, 0x0C, 0x18, 0x30, 0x60,
|
||||
0xC7, 0x08, 0x00, 0x78, 0x3F, 0xEE, 0x1F, 0x80 };
|
||||
|
||||
const GFXglyph NotoSans_Regular12pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 3, 17, 6, 2, -16 }, // 0x21 '!'
|
||||
{ 8, 6, 6, 10, 2, -16 }, // 0x22 '"'
|
||||
{ 13, 14, 17, 15, 1, -16 }, // 0x23 '#'
|
||||
{ 43, 11, 19, 13, 1, -17 }, // 0x24 '$'
|
||||
{ 70, 17, 17, 20, 1, -16 }, // 0x25 '%'
|
||||
{ 107, 16, 17, 17, 1, -16 }, // 0x26 '&'
|
||||
{ 141, 2, 6, 5, 2, -16 }, // 0x27 '''
|
||||
{ 143, 5, 21, 7, 1, -16 }, // 0x28 '('
|
||||
{ 157, 5, 21, 7, 1, -16 }, // 0x29 ')'
|
||||
{ 171, 11, 11, 13, 1, -17 }, // 0x2A '*'
|
||||
{ 187, 11, 11, 13, 1, -13 }, // 0x2B '+'
|
||||
{ 203, 4, 6, 6, 1, -2 }, // 0x2C ','
|
||||
{ 206, 6, 2, 8, 1, -6 }, // 0x2D '-'
|
||||
{ 208, 3, 3, 6, 2, -2 }, // 0x2E '.'
|
||||
{ 210, 9, 17, 9, 0, -16 }, // 0x2F '/'
|
||||
{ 230, 11, 17, 13, 1, -16 }, // 0x30 '0'
|
||||
{ 254, 6, 17, 13, 2, -16 }, // 0x31 '1'
|
||||
{ 267, 11, 17, 13, 1, -16 }, // 0x32 '2'
|
||||
{ 291, 11, 17, 13, 1, -16 }, // 0x33 '3'
|
||||
{ 315, 13, 17, 13, 0, -16 }, // 0x34 '4'
|
||||
{ 343, 11, 17, 13, 1, -16 }, // 0x35 '5'
|
||||
{ 367, 11, 17, 13, 1, -16 }, // 0x36 '6'
|
||||
{ 391, 11, 17, 13, 1, -16 }, // 0x37 '7'
|
||||
{ 415, 11, 17, 13, 1, -16 }, // 0x38 '8'
|
||||
{ 439, 11, 17, 13, 1, -16 }, // 0x39 '9'
|
||||
{ 463, 3, 13, 6, 2, -12 }, // 0x3A ':'
|
||||
{ 468, 4, 16, 6, 1, -12 }, // 0x3B ';'
|
||||
{ 476, 11, 11, 13, 1, -13 }, // 0x3C '<'
|
||||
{ 492, 11, 6, 13, 1, -10 }, // 0x3D '='
|
||||
{ 501, 11, 11, 13, 1, -13 }, // 0x3E '>'
|
||||
{ 517, 10, 17, 10, 0, -16 }, // 0x3F '?'
|
||||
{ 539, 19, 19, 21, 1, -16 }, // 0x40 '@'
|
||||
{ 585, 15, 17, 15, 0, -16 }, // 0x41 'A'
|
||||
{ 617, 12, 17, 15, 2, -16 }, // 0x42 'B'
|
||||
{ 643, 13, 17, 15, 1, -16 }, // 0x43 'C'
|
||||
{ 671, 14, 17, 17, 2, -16 }, // 0x44 'D'
|
||||
{ 701, 10, 17, 13, 2, -16 }, // 0x45 'E'
|
||||
{ 723, 10, 17, 12, 2, -16 }, // 0x46 'F'
|
||||
{ 745, 14, 17, 17, 1, -16 }, // 0x47 'G'
|
||||
{ 775, 13, 17, 17, 2, -16 }, // 0x48 'H'
|
||||
{ 803, 6, 17, 8, 1, -16 }, // 0x49 'I'
|
||||
{ 816, 6, 21, 6, -2, -16 }, // 0x4A 'J'
|
||||
{ 832, 13, 17, 15, 2, -16 }, // 0x4B 'K'
|
||||
{ 860, 10, 17, 12, 2, -16 }, // 0x4C 'L'
|
||||
{ 882, 17, 17, 21, 2, -16 }, // 0x4D 'M'
|
||||
{ 919, 14, 17, 18, 2, -16 }, // 0x4E 'N'
|
||||
{ 949, 16, 17, 18, 1, -16 }, // 0x4F 'O'
|
||||
{ 983, 11, 17, 14, 2, -16 }, // 0x50 'P'
|
||||
{ 1007, 16, 21, 18, 1, -16 }, // 0x51 'Q'
|
||||
{ 1049, 12, 17, 15, 2, -16 }, // 0x52 'R'
|
||||
{ 1075, 11, 17, 13, 1, -16 }, // 0x53 'S'
|
||||
{ 1099, 13, 17, 13, 0, -16 }, // 0x54 'T'
|
||||
{ 1127, 13, 17, 17, 2, -16 }, // 0x55 'U'
|
||||
{ 1155, 14, 17, 14, 0, -16 }, // 0x56 'V'
|
||||
{ 1185, 22, 17, 22, 0, -16 }, // 0x57 'W'
|
||||
{ 1232, 14, 17, 14, 0, -16 }, // 0x58 'X'
|
||||
{ 1262, 13, 17, 13, 0, -16 }, // 0x59 'Y'
|
||||
{ 1290, 12, 17, 13, 1, -16 }, // 0x5A 'Z'
|
||||
{ 1316, 5, 21, 8, 2, -16 }, // 0x5B '['
|
||||
{ 1330, 9, 17, 9, 0, -16 }, // 0x5C '\'
|
||||
{ 1350, 5, 21, 8, 1, -16 }, // 0x5D ']'
|
||||
{ 1364, 12, 11, 13, 1, -16 }, // 0x5E '^'
|
||||
{ 1381, 10, 2, 10, 0, 3 }, // 0x5F '_'
|
||||
{ 1384, 5, 4, 7, 1, -17 }, // 0x60 '`'
|
||||
{ 1387, 10, 13, 13, 1, -12 }, // 0x61 'a'
|
||||
{ 1404, 11, 18, 14, 2, -17 }, // 0x62 'b'
|
||||
{ 1429, 10, 13, 11, 1, -12 }, // 0x63 'c'
|
||||
{ 1446, 11, 18, 14, 1, -17 }, // 0x64 'd'
|
||||
{ 1471, 11, 13, 13, 1, -12 }, // 0x65 'e'
|
||||
{ 1489, 9, 18, 8, 0, -17 }, // 0x66 'f'
|
||||
{ 1510, 11, 19, 14, 1, -12 }, // 0x67 'g'
|
||||
{ 1537, 11, 18, 15, 2, -17 }, // 0x68 'h'
|
||||
{ 1562, 2, 17, 6, 2, -16 }, // 0x69 'i'
|
||||
{ 1567, 5, 23, 6, -1, -16 }, // 0x6A 'j'
|
||||
{ 1582, 10, 18, 13, 2, -17 }, // 0x6B 'k'
|
||||
{ 1605, 2, 18, 6, 2, -17 }, // 0x6C 'l'
|
||||
{ 1610, 18, 13, 22, 2, -12 }, // 0x6D 'm'
|
||||
{ 1640, 11, 13, 15, 2, -12 }, // 0x6E 'n'
|
||||
{ 1658, 12, 13, 14, 1, -12 }, // 0x6F 'o'
|
||||
{ 1678, 11, 19, 14, 2, -12 }, // 0x70 'p'
|
||||
{ 1705, 11, 19, 14, 1, -12 }, // 0x71 'q'
|
||||
{ 1732, 7, 13, 10, 2, -12 }, // 0x72 'r'
|
||||
{ 1744, 9, 13, 11, 1, -12 }, // 0x73 's'
|
||||
{ 1759, 8, 15, 8, 0, -14 }, // 0x74 't'
|
||||
{ 1774, 11, 13, 15, 2, -12 }, // 0x75 'u'
|
||||
{ 1792, 12, 13, 12, 0, -12 }, // 0x76 'v'
|
||||
{ 1812, 18, 13, 18, 0, -12 }, // 0x77 'w'
|
||||
{ 1842, 12, 13, 12, 0, -12 }, // 0x78 'x'
|
||||
{ 1862, 12, 19, 12, 0, -12 }, // 0x79 'y'
|
||||
{ 1891, 9, 13, 11, 1, -12 }, // 0x7A 'z'
|
||||
{ 1906, 7, 21, 9, 1, -16 }, // 0x7B '{'
|
||||
{ 1925, 1, 24, 13, 6, -17 }, // 0x7C '|'
|
||||
{ 1928, 7, 21, 9, 1, -16 }, // 0x7D '}'
|
||||
{ 1947, 11, 3, 13, 1, -9 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular12pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular12pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular12pt7bGlyphs,
|
||||
0x20, 0x7E, 32 };
|
||||
|
||||
// Approx. 2624 bytes
|
||||
|
||||
#endif // NOTOSANS12PT7B_H
|
||||
@@ -0,0 +1,464 @@
|
||||
#ifndef NOTOSANS18PT7B_H
|
||||
#define NOTOSANS18PT7B_H
|
||||
const uint8_t NotoSans_Regular18pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE6, 0x66, 0x66, 0x00, 0x0E,
|
||||
0xFF, 0xF4, 0xF1, 0xFC, 0x76, 0x1D, 0x87, 0x61, 0xD8, 0x76, 0x1D, 0x87,
|
||||
0x61, 0x80, 0x00, 0xC1, 0xC0, 0x0E, 0x0C, 0x00, 0x70, 0x60, 0x03, 0x83,
|
||||
0x00, 0x18, 0x38, 0x00, 0xC1, 0xC0, 0x0E, 0x0E, 0x0F, 0xFF, 0xFF, 0x7F,
|
||||
0xFF, 0xFB, 0xFF, 0xFF, 0xC0, 0xC1, 0xC0, 0x06, 0x0E, 0x00, 0x70, 0x60,
|
||||
0x03, 0x83, 0x00, 0x18, 0x38, 0x1F, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF,
|
||||
0xFF, 0x83, 0x83, 0x00, 0x1C, 0x38, 0x00, 0xC1, 0xC0, 0x06, 0x0E, 0x00,
|
||||
0x70, 0x60, 0x03, 0x83, 0x00, 0x1C, 0x38, 0x00, 0x01, 0x80, 0x01, 0x80,
|
||||
0x01, 0x80, 0x03, 0xE0, 0x1F, 0xFE, 0x3F, 0xFE, 0x79, 0x8E, 0xF1, 0x80,
|
||||
0xE1, 0x80, 0xE1, 0x80, 0xF1, 0x80, 0x79, 0x80, 0x7F, 0x80, 0x3F, 0xE0,
|
||||
0x0F, 0xF8, 0x01, 0xFE, 0x01, 0xBE, 0x01, 0x8F, 0x01, 0x87, 0x01, 0x87,
|
||||
0x01, 0x87, 0x81, 0x8F, 0xFD, 0xFE, 0xFF, 0xFC, 0x7F, 0xF0, 0x01, 0x80,
|
||||
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xC0, 0x0E,
|
||||
0x07, 0xF8, 0x07, 0x03, 0x86, 0x01, 0xC0, 0xE1, 0xC0, 0xE0, 0x38, 0x70,
|
||||
0x30, 0x0C, 0x1C, 0x1C, 0x03, 0x03, 0x06, 0x00, 0xC0, 0xC3, 0x80, 0x30,
|
||||
0x31, 0xC0, 0x0C, 0x1C, 0x70, 0x03, 0x87, 0x39, 0xF8, 0xE1, 0xCE, 0xFF,
|
||||
0x1C, 0xE7, 0x38, 0xE7, 0xF9, 0x8C, 0x38, 0xFC, 0xE7, 0x06, 0x00, 0x31,
|
||||
0xC1, 0x80, 0x1C, 0x70, 0x70, 0x0E, 0x1C, 0x1C, 0x03, 0x87, 0x07, 0x01,
|
||||
0xC1, 0xC1, 0x80, 0x70, 0x70, 0x60, 0x38, 0x0C, 0x38, 0x0C, 0x03, 0x8E,
|
||||
0x07, 0x00, 0x7F, 0x03, 0x80, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8,
|
||||
0x00, 0x1F, 0xFC, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x1E, 0x00, 0x38, 0x0E,
|
||||
0x00, 0x38, 0x0E, 0x00, 0x3C, 0x1E, 0x00, 0x1C, 0x1C, 0x00, 0x1E, 0x3C,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xE0,
|
||||
0x1C, 0x3C, 0xF0, 0x1C, 0x78, 0x78, 0x3C, 0xF0, 0x3C, 0x38, 0xE0, 0x1E,
|
||||
0x38, 0xE0, 0x0F, 0x70, 0xE0, 0x07, 0xF0, 0xE0, 0x03, 0xE0, 0xF0, 0x03,
|
||||
0xE0, 0xF0, 0x07, 0xF0, 0x7E, 0x7F, 0x78, 0x3F, 0xFE, 0x3C, 0x1F, 0xF8,
|
||||
0x1F, 0xFF, 0x66, 0x66, 0x66, 0x60, 0x07, 0x87, 0x03, 0x83, 0x81, 0xC1,
|
||||
0xC0, 0xE0, 0xF0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x07, 0x83, 0xC1, 0xE0,
|
||||
0xF0, 0x78, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xE0, 0x70, 0x38, 0x1E, 0x07,
|
||||
0x03, 0xC0, 0xE0, 0x38, 0x0C, 0xF0, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E,
|
||||
0x0E, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x07, 0x0F, 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x3C, 0x38, 0x78, 0x70, 0xE0,
|
||||
0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x02, 0x0E,
|
||||
0x09, 0xF3, 0x7E, 0xFF, 0xFF, 0x9F, 0xFE, 0x01, 0xF0, 0x00, 0xDC, 0x00,
|
||||
0xEE, 0x00, 0xE3, 0x80, 0xF1, 0xE0, 0x78, 0x78, 0x08, 0x30, 0x01, 0x80,
|
||||
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
|
||||
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x3C, 0xE3, 0x8E, 0x71,
|
||||
0xC7, 0x18, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xEF, 0xFF, 0x40, 0x00, 0x78,
|
||||
0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03,
|
||||
0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0xC0,
|
||||
0x0E, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E,
|
||||
0x00, 0xF0, 0x00, 0x00, 0x80, 0x0F, 0xF0, 0x1F, 0xF8, 0x3C, 0x3C, 0x78,
|
||||
0x1E, 0x70, 0x0E, 0x70, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
|
||||
0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
|
||||
0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x38,
|
||||
0x1E, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x03, 0xC1, 0xF1, 0xFC, 0xF7,
|
||||
0x79, 0xFC, 0xF6, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
|
||||
0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
|
||||
0x0F, 0x03, 0xC0, 0x01, 0x00, 0x1F, 0xF0, 0x7F, 0xFC, 0xF8, 0x3C, 0x60,
|
||||
0x1E, 0x40, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||
0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xE0, 0x01,
|
||||
0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70,
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x3F, 0xF0, 0x7F,
|
||||
0xFC, 0xF8, 0x3C, 0x40, 0x1E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||
0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x1F, 0xE0, 0x1F, 0xF8, 0x01,
|
||||
0xFC, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00,
|
||||
0x07, 0x00, 0x0F, 0x80, 0x1E, 0xF8, 0x7E, 0xFF, 0xFC, 0x7F, 0xF0, 0x00,
|
||||
0x1E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0xEE, 0x00, 0x73,
|
||||
0x80, 0x1C, 0xE0, 0x0E, 0x38, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0xE0, 0xE0,
|
||||
0x70, 0x38, 0x1C, 0x0E, 0x0E, 0x03, 0x87, 0x00, 0xE1, 0x80, 0x38, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03,
|
||||
0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3F, 0xFC, 0x3F, 0xFC,
|
||||
0x3F, 0xFC, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
|
||||
0x70, 0x00, 0x70, 0x00, 0x7F, 0xF0, 0x7F, 0xFC, 0x30, 0x7E, 0x00, 0x1E,
|
||||
0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07,
|
||||
0x00, 0x0E, 0x80, 0x1E, 0xF8, 0x7C, 0xFF, 0xF8, 0x7F, 0xF0, 0x00, 0x10,
|
||||
0x01, 0xFF, 0x01, 0xFF, 0x83, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xE0,
|
||||
0x00, 0xE0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x38, 0x78, 0x1C, 0xFF, 0x8E,
|
||||
0xFF, 0xE7, 0xC0, 0x73, 0xC0, 0x1D, 0xE0, 0x0E, 0xE0, 0x07, 0x70, 0x03,
|
||||
0xF8, 0x01, 0xDC, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x38, 0xE0, 0x38, 0x7C,
|
||||
0x7C, 0x1F, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C,
|
||||
0x00, 0x38, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0,
|
||||
0x01, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x07, 0x80, 0x07, 0x00,
|
||||
0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x01, 0x80, 0x0F, 0xF8,
|
||||
0x3F, 0xFC, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0F, 0x70, 0x07, 0x70, 0x0F,
|
||||
0x70, 0x0E, 0x78, 0x1E, 0x3C, 0x3C, 0x1F, 0xF8, 0x0F, 0xE0, 0x0F, 0xF0,
|
||||
0x3E, 0xFC, 0x78, 0x1E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8,
|
||||
0x01, 0x00, 0x0F, 0xF0, 0x3F, 0xF8, 0x7C, 0x3C, 0x70, 0x1E, 0xF0, 0x0E,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0xF0, 0x0F, 0x78, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0x07, 0x00, 0x07,
|
||||
0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x3C, 0x41, 0xF8,
|
||||
0x3F, 0xF0, 0x3F, 0xC0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
|
||||
0xFF, 0xF4, 0x39, 0xF7, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x0E, 0x39, 0xE7, 0x1C, 0x71, 0x8E, 0x30, 0x00, 0x03, 0x00, 0x0F,
|
||||
0x00, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xF8, 0x00,
|
||||
0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E,
|
||||
0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
|
||||
0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7C, 0x03, 0xF0,
|
||||
0x0F, 0xC0, 0x7F, 0x00, 0xF8, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x01, 0x00,
|
||||
0xFF, 0xCF, 0xFF, 0x9E, 0x1F, 0x40, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07,
|
||||
0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x38,
|
||||
0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x3F,
|
||||
0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xF0, 0x3E, 0x00, 0x78, 0x00, 0xF0,
|
||||
0x0E, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x1C, 0x38, 0x00, 0x00, 0xC3, 0x81,
|
||||
0xFF, 0x0E, 0x70, 0x3F, 0xF0, 0x67, 0x07, 0x07, 0x06, 0x60, 0xE0, 0x70,
|
||||
0x7E, 0x0C, 0x07, 0x07, 0xE1, 0xC0, 0x70, 0x7E, 0x1C, 0x07, 0x07, 0xE1,
|
||||
0xC0, 0x70, 0x6E, 0x1C, 0x07, 0x06, 0xE1, 0xC0, 0xF0, 0xEE, 0x0C, 0x0F,
|
||||
0x0E, 0xE0, 0xE1, 0xB1, 0xC6, 0x07, 0xFB, 0xF8, 0x70, 0x3F, 0x1F, 0x07,
|
||||
0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, 0x00,
|
||||
0x08, 0x00, 0xFC, 0x0F, 0x80, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xFC, 0x00,
|
||||
0x00, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00,
|
||||
0xEE, 0x00, 0x03, 0xB8, 0x00, 0x1C, 0xE0, 0x00, 0x71, 0xC0, 0x03, 0x87,
|
||||
0x00, 0x0E, 0x1C, 0x00, 0x38, 0x38, 0x01, 0xC0, 0xE0, 0x07, 0x01, 0xC0,
|
||||
0x3C, 0x07, 0x00, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x70,
|
||||
0x03, 0xC1, 0xC0, 0x07, 0x0E, 0x00, 0x1C, 0x38, 0x00, 0x79, 0xE0, 0x00,
|
||||
0xE7, 0x00, 0x03, 0xDC, 0x00, 0x07, 0xE0, 0x00, 0x1C, 0xFF, 0xF8, 0x3F,
|
||||
0xFF, 0x8F, 0xFF, 0xF3, 0xC0, 0x3E, 0xF0, 0x07, 0xBC, 0x00, 0xEF, 0x00,
|
||||
0x3B, 0xC0, 0x0E, 0xF0, 0x07, 0xBC, 0x01, 0xCF, 0x07, 0xE3, 0xFF, 0xE0,
|
||||
0xFF, 0xFE, 0x3C, 0x07, 0xCF, 0x00, 0x7B, 0xC0, 0x0F, 0xF0, 0x03, 0xFC,
|
||||
0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x01, 0xEF, 0xFF,
|
||||
0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x3F, 0xF8, 0x1F,
|
||||
0xFF, 0x87, 0xE1, 0xE1, 0xF0, 0x04, 0x78, 0x00, 0x0E, 0x00, 0x03, 0xC0,
|
||||
0x00, 0x70, 0x00, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00,
|
||||
0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0,
|
||||
0x00, 0x7F, 0xBE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0xFF, 0xF8, 0x07, 0xFF,
|
||||
0xF0, 0x3F, 0xFF, 0xE1, 0xE0, 0x0F, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF3,
|
||||
0xC0, 0x03, 0xDE, 0x00, 0x1E, 0xF0, 0x00, 0x77, 0x80, 0x03, 0xBC, 0x00,
|
||||
0x1D, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xDE,
|
||||
0x00, 0x0E, 0xF0, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x39, 0xE0, 0x03,
|
||||
0xCF, 0x00, 0x3C, 0x78, 0x07, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF,
|
||||
0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0,
|
||||
0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C,
|
||||
0x00, 0xF0, 0x03, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00,
|
||||
0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0,
|
||||
0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFF, 0x81,
|
||||
0xFF, 0xFE, 0x1F, 0xC3, 0xE1, 0xF0, 0x01, 0x1E, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xFF, 0x80, 0x3F, 0xFE, 0x01, 0xFF,
|
||||
0xF0, 0x00, 0x3B, 0x80, 0x01, 0xDC, 0x00, 0x0E, 0xF0, 0x00, 0x73, 0x80,
|
||||
0x03, 0x9E, 0x00, 0x1C, 0x7C, 0x00, 0xE1, 0xFE, 0x3F, 0x07, 0xFF, 0xF8,
|
||||
0x0F, 0xFF, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xF1, 0xE0, 0x78, 0x1E,
|
||||
0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81,
|
||||
0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE3, 0xFF,
|
||||
0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
|
||||
0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0,
|
||||
0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x7F, 0xFB,
|
||||
0xF8, 0xF0, 0xF0, 0x03, 0xDE, 0x00, 0xF3, 0xC0, 0x3C, 0x78, 0x0F, 0x0F,
|
||||
0x01, 0xC1, 0xE0, 0x70, 0x3C, 0x1C, 0x07, 0x87, 0x00, 0xF1, 0xE0, 0x1E,
|
||||
0x78, 0x03, 0xDE, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFB, 0x80, 0x3C,
|
||||
0x78, 0x07, 0x87, 0x80, 0xF0, 0x78, 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x78,
|
||||
0x0F, 0x0F, 0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x01, 0xE7, 0x80, 0x1E, 0xF0,
|
||||
0x01, 0xE0, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E,
|
||||
0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80,
|
||||
0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03,
|
||||
0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF0,
|
||||
0x00, 0x77, 0xEE, 0x00, 0x1D, 0xFB, 0x80, 0x07, 0xFE, 0x70, 0x03, 0xBF,
|
||||
0x9C, 0x00, 0xEF, 0xE7, 0x00, 0x33, 0xF8, 0xE0, 0x1C, 0xFE, 0x38, 0x07,
|
||||
0x3F, 0x8E, 0x03, 0x8F, 0xE1, 0xC0, 0xE3, 0xF8, 0x70, 0x38, 0xFE, 0x0E,
|
||||
0x1C, 0x3F, 0x83, 0x87, 0x0F, 0xE0, 0xE3, 0x83, 0xF8, 0x1C, 0xE0, 0xFE,
|
||||
0x07, 0x38, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x3F, 0x03, 0xF8, 0x0F, 0x80,
|
||||
0xFE, 0x01, 0xE0, 0x3F, 0x80, 0x78, 0x0F, 0xE0, 0x1C, 0x03, 0xC0, 0xF8,
|
||||
0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00, 0x7F, 0xC0, 0x07, 0xFE, 0x00, 0x7E,
|
||||
0xF0, 0x07, 0xE7, 0x00, 0x7E, 0x78, 0x07, 0xE3, 0xC0, 0x7E, 0x1C, 0x07,
|
||||
0xE1, 0xE0, 0x7E, 0x0F, 0x07, 0xE0, 0x70, 0x7E, 0x07, 0x87, 0xE0, 0x3C,
|
||||
0x7E, 0x01, 0xC7, 0xE0, 0x1E, 0x7E, 0x00, 0xE7, 0xE0, 0x0F, 0x3E, 0x00,
|
||||
0x7B, 0xE0, 0x03, 0xBE, 0x00, 0x3F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0xF0, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0xFC,
|
||||
0x1F, 0x81, 0xE0, 0x07, 0x87, 0x80, 0x07, 0x1E, 0x00, 0x0F, 0x3C, 0x00,
|
||||
0x0E, 0x70, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00,
|
||||
0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x0E, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x7B, 0xC0, 0x00, 0xE3,
|
||||
0x80, 0x03, 0xC7, 0x80, 0x0F, 0x07, 0x80, 0x3E, 0x07, 0xF3, 0xF8, 0x07,
|
||||
0xFF, 0xE0, 0x03, 0xFF, 0x00, 0xFF, 0xF0, 0x7F, 0xFE, 0x3F, 0xFF, 0x9E,
|
||||
0x03, 0xEF, 0x00, 0xF7, 0x80, 0x3B, 0xC0, 0x1D, 0xE0, 0x0F, 0xF0, 0x07,
|
||||
0x78, 0x03, 0xBC, 0x03, 0xDE, 0x03, 0xCF, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF,
|
||||
0x81, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F,
|
||||
0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00,
|
||||
0x10, 0x00, 0x07, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0xFC, 0x1F, 0x81, 0xE0,
|
||||
0x07, 0x87, 0x80, 0x07, 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x0E, 0x70, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0E,
|
||||
0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x7B, 0xC0, 0x00, 0xE3, 0x80, 0x03, 0xC7,
|
||||
0x80, 0x0F, 0x07, 0x80, 0x3E, 0x07, 0xF3, 0xF8, 0x07, 0xFF, 0xE0, 0x03,
|
||||
0xFF, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||
0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F,
|
||||
0xFF, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x3C, 0x01, 0xCF, 0x00, 0x7B, 0xC0,
|
||||
0x1E, 0xF0, 0x07, 0x3C, 0x01, 0xCF, 0x00, 0xF3, 0xC0, 0xF8, 0xFF, 0xFC,
|
||||
0x3F, 0xFC, 0x0F, 0xFF, 0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x3C, 0x0F, 0x0F,
|
||||
0x01, 0xC3, 0xC0, 0x78, 0xF0, 0x0F, 0x3C, 0x01, 0xCF, 0x00, 0x7B, 0xC0,
|
||||
0x0E, 0xF0, 0x03, 0xC0, 0x00, 0x80, 0x1F, 0xFC, 0x3F, 0xFE, 0x7E, 0x3E,
|
||||
0x70, 0x04, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00,
|
||||
0x78, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7E,
|
||||
0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E,
|
||||
0x80, 0x1E, 0xFC, 0xFC, 0xFF, 0xF8, 0x7F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38,
|
||||
0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70,
|
||||
0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0,
|
||||
0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xFE, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0xFE, 0x00, 0x0E, 0xF0, 0x00, 0xE7, 0x00, 0x0E, 0x78, 0x01,
|
||||
0xE3, 0xC0, 0x3C, 0x3F, 0x9F, 0x81, 0xFF, 0xF0, 0x07, 0xFE, 0x00, 0xF0,
|
||||
0x00, 0x3B, 0x80, 0x03, 0xDC, 0x00, 0x1C, 0xF0, 0x01, 0xE3, 0x80, 0x0F,
|
||||
0x1C, 0x00, 0x70, 0xF0, 0x07, 0x83, 0x80, 0x38, 0x1C, 0x01, 0xC0, 0xF0,
|
||||
0x1E, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0x70, 0x78, 0x03, 0x83, 0x80,
|
||||
0x1C, 0x1C, 0x00, 0x71, 0xE0, 0x03, 0x8E, 0x00, 0x1E, 0x70, 0x00, 0x77,
|
||||
0x80, 0x03, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x1F, 0x00, 0x00, 0x70, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x70, 0x03, 0xC0,
|
||||
0x07, 0x70, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38, 0x07, 0xE0,
|
||||
0x0E, 0x38, 0x07, 0x70, 0x0E, 0x38, 0x07, 0x70, 0x1E, 0x3C, 0x0E, 0x70,
|
||||
0x1C, 0x1C, 0x0E, 0x38, 0x1C, 0x1C, 0x0E, 0x38, 0x1C, 0x1C, 0x1E, 0x38,
|
||||
0x3C, 0x0E, 0x1C, 0x38, 0x38, 0x0E, 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C,
|
||||
0x38, 0x0E, 0x38, 0x1C, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E,
|
||||
0x70, 0x07, 0x30, 0x0E, 0x70, 0x07, 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07,
|
||||
0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x07, 0xE0, 0x03, 0xE0, 0x03,
|
||||
0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x78, 0x00, 0xF1,
|
||||
0xC0, 0x0F, 0x0F, 0x00, 0x70, 0x38, 0x07, 0x80, 0xE0, 0x38, 0x07, 0x83,
|
||||
0x80, 0x1C, 0x3C, 0x00, 0x71, 0xC0, 0x03, 0xDC, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x3E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x73, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x78, 0x03, 0xC1, 0xC0, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x3C, 0x1E, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1E,
|
||||
0xF0, 0x00, 0x78, 0xF0, 0x00, 0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE3, 0x80,
|
||||
0x1C, 0x1C, 0x03, 0x81, 0xC0, 0x38, 0x0E, 0x07, 0x00, 0xE0, 0xF0, 0x07,
|
||||
0x0E, 0x00, 0x79, 0xE0, 0x03, 0x9C, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00,
|
||||
0x1F, 0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xFF,
|
||||
0xF8, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0xF0,
|
||||
0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00,
|
||||
0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0,
|
||||
0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xF0, 0x03,
|
||||
0x80, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x0E,
|
||||
0x00, 0x70, 0x03, 0x80, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70,
|
||||
0x01, 0xC0, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x01, 0xC0,
|
||||
0x0E, 0x00, 0x38, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x01, 0xC0,
|
||||
0x00, 0x78, 0x00, 0x3E, 0x00, 0x0D, 0xC0, 0x03, 0x30, 0x01, 0xCE, 0x00,
|
||||
0x61, 0x80, 0x38, 0x70, 0x0C, 0x0C, 0x07, 0x03, 0x81, 0x80, 0x60, 0xE0,
|
||||
0x1C, 0x30, 0x03, 0x1C, 0x00, 0xE7, 0x00, 0x1B, 0x80, 0x07, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF0, 0x78, 0x3C, 0x1C, 0x0E, 0x07, 0x0F, 0xF0, 0x7F, 0xF0,
|
||||
0xF9, 0xF1, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x0F,
|
||||
0xFE, 0x7F, 0xFD, 0xE0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x07,
|
||||
0xF0, 0x1F, 0xF8, 0xFE, 0xFF, 0xDC, 0xFF, 0x18, 0xE0, 0x00, 0x70, 0x00,
|
||||
0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0,
|
||||
0x00, 0xE7, 0xF0, 0x77, 0xFE, 0x3F, 0x9F, 0x9F, 0x01, 0xCF, 0x00, 0xF7,
|
||||
0x80, 0x3B, 0x80, 0x1D, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x01, 0xF8, 0x01,
|
||||
0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3B, 0xC0, 0x1D, 0xF0, 0x1E, 0xFE,
|
||||
0x3E, 0x77, 0xFE, 0x31, 0xFE, 0x00, 0x07, 0xF8, 0x7F, 0xF3, 0xF7, 0x9E,
|
||||
0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E,
|
||||
0x00, 0x38, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x3E, 0x38,
|
||||
0x7F, 0xE0, 0xFF, 0x80, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00,
|
||||
0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x0F, 0xE3, 0x8F,
|
||||
0xFD, 0xCF, 0x9F, 0xEF, 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F,
|
||||
0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00,
|
||||
0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0, 0x1F, 0x3E, 0x3F, 0x8F, 0xFD, 0xC3,
|
||||
0xF8, 0xE0, 0x07, 0xF0, 0x1F, 0xF8, 0x3E, 0x3C, 0x78, 0x1E, 0x70, 0x0E,
|
||||
0x70, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x78, 0x01, 0x3F, 0x1E,
|
||||
0x1F, 0xFE, 0x07, 0xFC, 0x03, 0xF8, 0x3F, 0x83, 0xFC, 0x3C, 0x01, 0xC0,
|
||||
0x0E, 0x00, 0x70, 0x03, 0x80, 0x7F, 0xE7, 0xFF, 0x3F, 0xF8, 0x38, 0x01,
|
||||
0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38,
|
||||
0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00,
|
||||
0x0F, 0xE3, 0x8F, 0xFD, 0xCF, 0x9F, 0xEF, 0x01, 0xF7, 0x00, 0x7F, 0x80,
|
||||
0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC,
|
||||
0x00, 0x7E, 0x00, 0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0, 0x1F, 0x3E, 0x3F,
|
||||
0x8F, 0xFD, 0xC3, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3C, 0x00,
|
||||
0x1C, 0x80, 0x1E, 0x78, 0x1E, 0x3F, 0xFF, 0x0F, 0xFE, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE3, 0xF8, 0xEF, 0xFC, 0xFE, 0x3E, 0xF8, 0x0E, 0xF0, 0x0F,
|
||||
0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFC, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
|
||||
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0xFE, 0xFC,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x1E, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0,
|
||||
0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x00, 0xFF, 0x00,
|
||||
0xFF, 0x80, 0xF3, 0xC0, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x78,
|
||||
0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE7, 0xF0, 0x7F, 0x1D, 0xFF, 0x9F, 0xFB,
|
||||
0xF9, 0xF7, 0x9F, 0x7C, 0x0F, 0xC0, 0xFF, 0x00, 0xF0, 0x0F, 0xE0, 0x1C,
|
||||
0x01, 0xF8, 0x03, 0x80, 0x3F, 0x00, 0x70, 0x07, 0xE0, 0x0E, 0x00, 0xFC,
|
||||
0x01, 0xC0, 0x1F, 0x80, 0x38, 0x03, 0xF0, 0x07, 0x00, 0x7E, 0x00, 0xE0,
|
||||
0x0F, 0xC0, 0x1C, 0x01, 0xF8, 0x03, 0x80, 0x3F, 0x00, 0x70, 0x07, 0xE0,
|
||||
0x0E, 0x00, 0xFC, 0x01, 0xC0, 0x1F, 0x80, 0x38, 0x03, 0x80, 0xE3, 0xF8,
|
||||
0xEF, 0xFC, 0xFF, 0x3E, 0xF8, 0x0E, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
|
||||
0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xCF, 0x8F, 0x01, 0xE7, 0x00, 0x77, 0x80,
|
||||
0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC,
|
||||
0x00, 0x7E, 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x1C, 0xF0, 0x1E, 0x3E, 0x1E,
|
||||
0x0F, 0xFE, 0x01, 0xFE, 0x00, 0xE3, 0xF0, 0x77, 0xFE, 0x3F, 0x9F, 0x9F,
|
||||
0x01, 0xCF, 0x00, 0xF7, 0x80, 0x3B, 0x80, 0x1D, 0xC0, 0x0F, 0xE0, 0x07,
|
||||
0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x80, 0x3B, 0xC0,
|
||||
0x3D, 0xF0, 0x1C, 0xFC, 0x3E, 0x77, 0xFE, 0x39, 0xFE, 0x1C, 0x00, 0x0E,
|
||||
0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00,
|
||||
0x38, 0x00, 0x00, 0x0F, 0xE3, 0x8F, 0xFD, 0xCF, 0x9E, 0xEF, 0x01, 0xF7,
|
||||
0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01,
|
||||
0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0,
|
||||
0x1F, 0x3E, 0x3F, 0x8F, 0xFD, 0xC3, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38,
|
||||
0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00,
|
||||
0xE0, 0xE3, 0xFC, 0xFF, 0xBF, 0xFE, 0x0F, 0x81, 0xE0, 0x38, 0x07, 0x00,
|
||||
0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0,
|
||||
0x1C, 0x03, 0x80, 0x00, 0x1F, 0xF3, 0xFF, 0xFE, 0x3D, 0xC0, 0x0E, 0x00,
|
||||
0x70, 0x03, 0xC0, 0x0F, 0x80, 0x3F, 0x00, 0xFF, 0x00, 0xFC, 0x01, 0xF0,
|
||||
0x03, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0xE0, 0xFF, 0xFF, 0x9F, 0xF0, 0x18,
|
||||
0x03, 0x00, 0x60, 0x1C, 0x07, 0xFF, 0xFF, 0xFF, 0xF9, 0xC0, 0x38, 0x07,
|
||||
0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00,
|
||||
0xE0, 0x1E, 0x01, 0xE2, 0x3F, 0xC3, 0xF8, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
|
||||
0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
|
||||
0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0,
|
||||
0x0F, 0xF0, 0x1F, 0x78, 0x7F, 0x7F, 0xF7, 0x1F, 0xC7, 0xE0, 0x03, 0xDC,
|
||||
0x00, 0xE7, 0x00, 0x39, 0xE0, 0x1E, 0x38, 0x07, 0x0E, 0x01, 0xC3, 0xC0,
|
||||
0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x03, 0x87, 0x00, 0xE1, 0xC0, 0x38, 0xF0,
|
||||
0x07, 0x38, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
|
||||
0x78, 0x00, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xEE, 0x01, 0xE0, 0x1D, 0xC0,
|
||||
0x7C, 0x07, 0xB8, 0x0F, 0xC0, 0xE3, 0x81, 0xF8, 0x1C, 0x70, 0x77, 0x03,
|
||||
0x8E, 0x0E, 0x70, 0xF1, 0xE1, 0xCE, 0x1C, 0x1C, 0x31, 0xC3, 0x83, 0x8E,
|
||||
0x18, 0x70, 0x71, 0xC3, 0x9C, 0x07, 0x30, 0x73, 0x80, 0xEE, 0x0E, 0x70,
|
||||
0x1D, 0xC0, 0xEE, 0x03, 0xB8, 0x1F, 0x80, 0x36, 0x03, 0xF0, 0x07, 0xC0,
|
||||
0x3E, 0x00, 0xF8, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0xB8,
|
||||
0x07, 0x8E, 0x03, 0x87, 0x83, 0x81, 0xE3, 0xC0, 0x73, 0xC0, 0x3D, 0xC0,
|
||||
0x0F, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0xFE, 0x00, 0xF7,
|
||||
0x00, 0x71, 0xC0, 0x70, 0xF0, 0x78, 0x3C, 0x78, 0x0E, 0x38, 0x07, 0xB8,
|
||||
0x01, 0xE0, 0xF0, 0x03, 0xDC, 0x00, 0xE7, 0x00, 0x39, 0xE0, 0x1E, 0x38,
|
||||
0x07, 0x0E, 0x01, 0xC1, 0xC0, 0xF0, 0x70, 0x38, 0x1E, 0x0E, 0x03, 0x87,
|
||||
0x00, 0xE1, 0xC0, 0x1C, 0x70, 0x07, 0x38, 0x01, 0xCE, 0x00, 0x3B, 0x80,
|
||||
0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01,
|
||||
0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x3F, 0xC0,
|
||||
0x0F, 0xC0, 0x00, 0x7F, 0xFD, 0xFF, 0xF7, 0xFF, 0xC0, 0x0E, 0x00, 0x78,
|
||||
0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0,
|
||||
0x1E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x00, 0xE0, 0x7C, 0x1F, 0x83, 0x80, 0xF0, 0x1C, 0x03, 0x80, 0x70,
|
||||
0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x7C, 0x3E, 0x07, 0x80, 0xFC,
|
||||
0x03, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01,
|
||||
0xC0, 0x3C, 0x03, 0xC0, 0x7E, 0x03, 0xC0, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F,
|
||||
0x81, 0xF0, 0x0F, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
|
||||
0x38, 0x07, 0x00, 0xF0, 0x0F, 0x00, 0xF8, 0x0F, 0x07, 0xE1, 0xE0, 0x38,
|
||||
0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x1F,
|
||||
0x0F, 0xC1, 0xF0, 0x30, 0x00, 0x1C, 0x01, 0xFF, 0x81, 0xFF, 0xFF, 0xC1,
|
||||
0xFF, 0x80, 0x3C };
|
||||
|
||||
const GFXglyph NotoSans_Regular18pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 4, 26, 9, 3, -24 }, // 0x21 '!'
|
||||
{ 14, 10, 9, 14, 2, -24 }, // 0x22 '"'
|
||||
{ 26, 21, 25, 23, 1, -24 }, // 0x23 '#'
|
||||
{ 92, 16, 29, 20, 2, -26 }, // 0x24 '$'
|
||||
{ 150, 26, 26, 29, 2, -25 }, // 0x25 '%'
|
||||
{ 235, 24, 26, 26, 2, -25 }, // 0x26 '&'
|
||||
{ 313, 4, 9, 8, 2, -24 }, // 0x27 '''
|
||||
{ 318, 9, 31, 11, 1, -24 }, // 0x28 '('
|
||||
{ 353, 8, 31, 11, 1, -24 }, // 0x29 ')'
|
||||
{ 384, 17, 16, 19, 1, -26 }, // 0x2A '*'
|
||||
{ 418, 16, 17, 20, 2, -20 }, // 0x2B '+'
|
||||
{ 452, 6, 9, 9, 1, -3 }, // 0x2C ','
|
||||
{ 459, 9, 3, 11, 1, -10 }, // 0x2D '-'
|
||||
{ 463, 4, 5, 9, 3, -3 }, // 0x2E '.'
|
||||
{ 466, 13, 25, 13, 0, -24 }, // 0x2F '/'
|
||||
{ 507, 16, 26, 20, 2, -25 }, // 0x30 '0'
|
||||
{ 559, 10, 25, 20, 3, -24 }, // 0x31 '1'
|
||||
{ 591, 16, 26, 20, 2, -25 }, // 0x32 '2'
|
||||
{ 643, 16, 26, 20, 2, -25 }, // 0x33 '3'
|
||||
{ 695, 18, 25, 20, 1, -24 }, // 0x34 '4'
|
||||
{ 752, 16, 25, 20, 2, -24 }, // 0x35 '5'
|
||||
{ 802, 17, 26, 20, 2, -25 }, // 0x36 '6'
|
||||
{ 858, 16, 25, 20, 2, -24 }, // 0x37 '7'
|
||||
{ 908, 16, 26, 20, 2, -25 }, // 0x38 '8'
|
||||
{ 960, 16, 26, 20, 2, -25 }, // 0x39 '9'
|
||||
{ 1012, 4, 20, 9, 3, -18 }, // 0x3A ':'
|
||||
{ 1022, 6, 24, 9, 1, -18 }, // 0x3B ';'
|
||||
{ 1040, 16, 17, 20, 2, -20 }, // 0x3C '<'
|
||||
{ 1074, 16, 9, 20, 2, -16 }, // 0x3D '='
|
||||
{ 1092, 16, 17, 20, 2, -20 }, // 0x3E '>'
|
||||
{ 1126, 14, 27, 15, 0, -25 }, // 0x3F '?'
|
||||
{ 1174, 28, 28, 32, 2, -24 }, // 0x40 '@'
|
||||
{ 1272, 22, 25, 23, 0, -24 }, // 0x41 'A'
|
||||
{ 1341, 18, 25, 23, 3, -24 }, // 0x42 'B'
|
||||
{ 1398, 19, 26, 22, 2, -25 }, // 0x43 'C'
|
||||
{ 1460, 21, 25, 26, 3, -24 }, // 0x44 'D'
|
||||
{ 1526, 14, 25, 20, 3, -24 }, // 0x45 'E'
|
||||
{ 1570, 14, 25, 18, 3, -24 }, // 0x46 'F'
|
||||
{ 1614, 21, 26, 26, 2, -25 }, // 0x47 'G'
|
||||
{ 1683, 20, 25, 26, 3, -24 }, // 0x48 'H'
|
||||
{ 1746, 10, 25, 12, 1, -24 }, // 0x49 'I'
|
||||
{ 1778, 9, 32, 10, -3, -24 }, // 0x4A 'J'
|
||||
{ 1814, 19, 25, 22, 3, -24 }, // 0x4B 'K'
|
||||
{ 1874, 15, 25, 18, 3, -24 }, // 0x4C 'L'
|
||||
{ 1921, 26, 25, 32, 3, -24 }, // 0x4D 'M'
|
||||
{ 2003, 20, 25, 27, 3, -24 }, // 0x4E 'N'
|
||||
{ 2066, 23, 26, 28, 2, -25 }, // 0x4F 'O'
|
||||
{ 2141, 17, 25, 21, 3, -24 }, // 0x50 'P'
|
||||
{ 2195, 23, 32, 28, 2, -25 }, // 0x51 'Q'
|
||||
{ 2287, 18, 25, 22, 3, -24 }, // 0x52 'R'
|
||||
{ 2344, 16, 26, 19, 2, -25 }, // 0x53 'S'
|
||||
{ 2396, 19, 25, 20, 0, -24 }, // 0x54 'T'
|
||||
{ 2456, 20, 25, 26, 3, -24 }, // 0x55 'U'
|
||||
{ 2519, 21, 25, 21, 0, -24 }, // 0x56 'V'
|
||||
{ 2585, 32, 25, 33, 0, -24 }, // 0x57 'W'
|
||||
{ 2685, 21, 25, 21, 0, -24 }, // 0x58 'X'
|
||||
{ 2751, 20, 25, 20, 0, -24 }, // 0x59 'Y'
|
||||
{ 2814, 18, 25, 20, 1, -24 }, // 0x5A 'Z'
|
||||
{ 2871, 8, 31, 12, 3, -24 }, // 0x5B '['
|
||||
{ 2902, 13, 25, 13, 0, -24 }, // 0x5C '\'
|
||||
{ 2943, 8, 31, 12, 1, -24 }, // 0x5D ']'
|
||||
{ 2974, 18, 16, 20, 1, -24 }, // 0x5E '^'
|
||||
{ 3010, 16, 2, 16, 0, 4 }, // 0x5F '_'
|
||||
{ 3014, 8, 6, 10, 1, -26 }, // 0x60 '`'
|
||||
{ 3020, 15, 19, 20, 2, -18 }, // 0x61 'a'
|
||||
{ 3056, 17, 27, 22, 3, -26 }, // 0x62 'b'
|
||||
{ 3114, 14, 19, 17, 2, -18 }, // 0x63 'c'
|
||||
{ 3148, 17, 27, 22, 2, -26 }, // 0x64 'd'
|
||||
{ 3206, 16, 19, 20, 2, -18 }, // 0x65 'e'
|
||||
{ 3244, 13, 27, 12, 1, -26 }, // 0x66 'f'
|
||||
{ 3288, 17, 27, 22, 2, -18 }, // 0x67 'g'
|
||||
{ 3346, 16, 27, 22, 3, -26 }, // 0x68 'h'
|
||||
{ 3400, 3, 26, 9, 3, -25 }, // 0x69 'i'
|
||||
{ 3410, 8, 34, 9, -2, -25 }, // 0x6A 'j'
|
||||
{ 3444, 16, 27, 19, 3, -26 }, // 0x6B 'k'
|
||||
{ 3498, 3, 27, 9, 3, -26 }, // 0x6C 'l'
|
||||
{ 3509, 27, 19, 33, 3, -18 }, // 0x6D 'm'
|
||||
{ 3574, 16, 19, 22, 3, -18 }, // 0x6E 'n'
|
||||
{ 3612, 17, 19, 21, 2, -18 }, // 0x6F 'o'
|
||||
{ 3653, 17, 27, 22, 3, -18 }, // 0x70 'p'
|
||||
{ 3711, 17, 27, 22, 2, -18 }, // 0x71 'q'
|
||||
{ 3769, 11, 19, 15, 3, -18 }, // 0x72 'r'
|
||||
{ 3796, 13, 19, 17, 2, -18 }, // 0x73 's'
|
||||
{ 3827, 11, 23, 13, 1, -22 }, // 0x74 't'
|
||||
{ 3859, 16, 19, 22, 3, -18 }, // 0x75 'u'
|
||||
{ 3897, 18, 19, 18, 0, -18 }, // 0x76 'v'
|
||||
{ 3940, 27, 19, 28, 0, -18 }, // 0x77 'w'
|
||||
{ 4005, 17, 19, 19, 1, -18 }, // 0x78 'x'
|
||||
{ 4046, 18, 27, 18, 0, -18 }, // 0x79 'y'
|
||||
{ 4107, 14, 19, 17, 1, -18 }, // 0x7A 'z'
|
||||
{ 4141, 11, 31, 13, 1, -24 }, // 0x7B '{'
|
||||
{ 4184, 3, 36, 19, 8, -26 }, // 0x7C '|'
|
||||
{ 4198, 11, 31, 13, 1, -24 }, // 0x7D '}'
|
||||
{ 4241, 16, 5, 20, 2, -14 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular18pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular18pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular18pt7bGlyphs,
|
||||
0x20, 0x7E, 48 };
|
||||
|
||||
// Approx. 4923 bytes
|
||||
|
||||
#endif // NOTOSANS18PT7B_H
|
||||
@@ -0,0 +1,545 @@
|
||||
#ifndef NOTOSANS20PT7B_H
|
||||
#define NOTOSANS20PT7B_H
|
||||
const uint8_t NotoSans_Regular20pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xF7, 0xBD, 0xEF, 0x7B, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
|
||||
0x98, 0xC0, 0x00, 0x0C, 0xF7, 0xFF, 0xE2, 0x00, 0xE1, 0xF8, 0x7E, 0x1F,
|
||||
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x70, 0x00, 0x70, 0x70,
|
||||
0x01, 0xC0, 0xE0, 0x03, 0x81, 0x80, 0x07, 0x03, 0x00, 0x0E, 0x0E, 0x00,
|
||||
0x1C, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, 0x60, 0x7F, 0xFF, 0xFE, 0xFF,
|
||||
0xFF, 0xFD, 0xFF, 0xFF, 0xF8, 0x0C, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0x70,
|
||||
0x70, 0x00, 0xE0, 0xE0, 0x01, 0xC1, 0xC0, 0x03, 0x03, 0x81, 0xFF, 0xFF,
|
||||
0xFB, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xE0, 0x70, 0x70, 0x00, 0xC0, 0xE0,
|
||||
0x03, 0x81, 0xC0, 0x07, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x1C, 0x1C, 0x00,
|
||||
0x30, 0x38, 0x00, 0xE0, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C,
|
||||
0x00, 0x03, 0x00, 0x0F, 0xFF, 0x07, 0xFF, 0xE3, 0xFF, 0xF9, 0xE3, 0x04,
|
||||
0x70, 0xC0, 0x3C, 0x30, 0x0F, 0x0C, 0x01, 0xC3, 0x00, 0x78, 0xC0, 0x1F,
|
||||
0xB0, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x0C,
|
||||
0xFC, 0x03, 0x0F, 0x00, 0xC1, 0xC0, 0x30, 0x70, 0x0C, 0x1E, 0x03, 0x0F,
|
||||
0xF0, 0xCF, 0xBF, 0xFF, 0xEF, 0xFF, 0xE0, 0x7F, 0xE0, 0x00, 0xC0, 0x00,
|
||||
0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x1F, 0x80, 0x0F, 0x01, 0xFE, 0x00,
|
||||
0x70, 0x1C, 0x70, 0x07, 0x00, 0xE1, 0xC0, 0x38, 0x0E, 0x0E, 0x03, 0x80,
|
||||
0x70, 0x70, 0x3C, 0x03, 0x81, 0x81, 0xC0, 0x1C, 0x0C, 0x1C, 0x00, 0xE0,
|
||||
0x70, 0xE0, 0x07, 0x03, 0x0E, 0x00, 0x38, 0x18, 0x70, 0x01, 0xC1, 0xC7,
|
||||
0x1F, 0x0E, 0x0E, 0x39, 0xFE, 0x38, 0x73, 0x9E, 0xF1, 0xEF, 0x3C, 0xE1,
|
||||
0xC7, 0xF9, 0xCE, 0x0E, 0x1F, 0x1C, 0x70, 0x30, 0x00, 0xE3, 0x81, 0xC0,
|
||||
0x0E, 0x1C, 0x0E, 0x00, 0x70, 0xE0, 0x70, 0x07, 0x07, 0x03, 0x80, 0x38,
|
||||
0x38, 0x1C, 0x03, 0x81, 0xC0, 0xC0, 0x1C, 0x0E, 0x0E, 0x01, 0xC0, 0x38,
|
||||
0x70, 0x1C, 0x01, 0xC7, 0x00, 0xE0, 0x07, 0xF8, 0x0E, 0x00, 0x1F, 0x80,
|
||||
0x03, 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x7E, 0xFC, 0x00, 0x0F, 0x07,
|
||||
0x80, 0x01, 0xC0, 0x78, 0x00, 0x38, 0x0F, 0x00, 0x07, 0x01, 0xE0, 0x00,
|
||||
0xE0, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x3E, 0xF0,
|
||||
0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07,
|
||||
0xFE, 0x01, 0xE1, 0xF3, 0xE0, 0x38, 0x7C, 0x3E, 0x07, 0x0F, 0x03, 0xE1,
|
||||
0xE3, 0xC0, 0x3E, 0x38, 0x78, 0x03, 0xEF, 0x0F, 0x00, 0x3F, 0xC1, 0xE0,
|
||||
0x03, 0xF8, 0x3C, 0x00, 0x3E, 0x07, 0xC0, 0x0F, 0xE0, 0x7C, 0x07, 0xFE,
|
||||
0x07, 0xFF, 0xFB, 0xE0, 0x7F, 0xFC, 0x3E, 0x07, 0xFE, 0x03, 0xF0, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x07, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, 0xE0, 0xF0,
|
||||
0x70, 0x78, 0x3C, 0x1E, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38,
|
||||
0x1C, 0x0E, 0x07, 0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x1E, 0x0F, 0x03, 0x81,
|
||||
0xE0, 0x70, 0x3C, 0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x0E, 0x07, 0x81, 0xC0,
|
||||
0xF0, 0x38, 0x1E, 0x0F, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x3C, 0x0E, 0x07,
|
||||
0x03, 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x07, 0x83,
|
||||
0xC1, 0xC1, 0xE0, 0xF0, 0xF0, 0x70, 0x78, 0x78, 0x00, 0x01, 0xE0, 0x00,
|
||||
0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x0E, 0x1C,
|
||||
0x3B, 0xFB, 0x7F, 0xFF, 0xFF, 0xC7, 0xFF, 0x80, 0x3E, 0x00, 0x1D, 0xC0,
|
||||
0x07, 0x78, 0x03, 0xCE, 0x01, 0xE3, 0xC0, 0xF8, 0x78, 0x1C, 0x1C, 0x01,
|
||||
0x02, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00,
|
||||
0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00,
|
||||
0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3D, 0xE7, 0x9E,
|
||||
0x71, 0xCF, 0x38, 0xE3, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x67, 0xBF, 0xFF,
|
||||
0x10, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xC0,
|
||||
0x0F, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0,
|
||||
0x0E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80,
|
||||
0x1E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00,
|
||||
0x3C, 0x00, 0x07, 0xF8, 0x03, 0xFF, 0x81, 0xFF, 0xF0, 0xF0, 0x3C, 0x78,
|
||||
0x07, 0x9E, 0x00, 0xE7, 0x00, 0x3D, 0xC0, 0x0F, 0xF0, 0x01, 0xFC, 0x00,
|
||||
0x7F, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F,
|
||||
0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0x70,
|
||||
0x03, 0xDC, 0x00, 0xF7, 0x80, 0x38, 0xE0, 0x1E, 0x3C, 0x0F, 0x07, 0xFF,
|
||||
0xC0, 0xFF, 0xE0, 0x1F, 0xE0, 0x01, 0xE0, 0x7C, 0x1F, 0x87, 0xF3, 0xEF,
|
||||
0xF9, 0xDC, 0x39, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01,
|
||||
0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
|
||||
0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0xF8, 0x0F, 0xFF,
|
||||
0x87, 0xFF, 0xF3, 0xE0, 0x3C, 0x60, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x38,
|
||||
0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00,
|
||||
0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78,
|
||||
0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01,
|
||||
0xE0, 0x00, 0x70, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F,
|
||||
0xF8, 0x1F, 0xFF, 0x8F, 0xFF, 0xF1, 0xC0, 0x3E, 0x40, 0x07, 0x80, 0x00,
|
||||
0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF0,
|
||||
0x00, 0xF8, 0x0F, 0xFC, 0x03, 0xFC, 0x00, 0xFF, 0xE0, 0x00, 0x7C, 0x00,
|
||||
0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00,
|
||||
0xF0, 0x00, 0x3C, 0x00, 0x1F, 0xC0, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xE1,
|
||||
0xFF, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x7F,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x3B, 0xC0, 0x03, 0xDE, 0x00, 0x1C, 0xF0, 0x01,
|
||||
0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xE1, 0xE0, 0x0E, 0x0F, 0x00, 0xE0, 0x78,
|
||||
0x0F, 0x03, 0xC0, 0x70, 0x1E, 0x07, 0x00, 0xF0, 0x78, 0x07, 0x83, 0x80,
|
||||
0x3C, 0x38, 0x01, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x0F, 0x00, 0x3F, 0xFF, 0x0F, 0xFF, 0xC3, 0xFF, 0xF0, 0xE0,
|
||||
0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00,
|
||||
0x1E, 0x00, 0x07, 0x80, 0x01, 0xFF, 0xE0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0,
|
||||
0x00, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1C, 0x00,
|
||||
0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x0F,
|
||||
0xBF, 0xFF, 0xCF, 0xFF, 0xE0, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0xE0,
|
||||
0x3F, 0xEC, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0E, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x80, 0x79, 0xFF, 0x0F,
|
||||
0x7F, 0xF1, 0xFE, 0x1F, 0x3F, 0x00, 0xF7, 0xC0, 0x1E, 0xF0, 0x01, 0xDE,
|
||||
0x00, 0x3B, 0xC0, 0x07, 0xF8, 0x00, 0xF7, 0x00, 0x1C, 0xE0, 0x03, 0x9E,
|
||||
0x00, 0x71, 0xC0, 0x1E, 0x3C, 0x07, 0x83, 0xFF, 0xF0, 0x3F, 0xFC, 0x01,
|
||||
0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x07, 0x00,
|
||||
0x03, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0F, 0x00, 0x03,
|
||||
0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x80,
|
||||
0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x01,
|
||||
0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0,
|
||||
0x00, 0xF0, 0x00, 0x78, 0x00, 0x07, 0xFC, 0x07, 0xFF, 0x83, 0xFB, 0xF1,
|
||||
0xF0, 0x1E, 0x78, 0x03, 0x9C, 0x00, 0xE7, 0x00, 0x3D, 0xC0, 0x0E, 0x78,
|
||||
0x03, 0x8E, 0x01, 0xE3, 0xE0, 0xF0, 0x7E, 0xF8, 0x0F, 0xF8, 0x01, 0xFE,
|
||||
0x00, 0xFF, 0xE0, 0xF8, 0xFC, 0x7C, 0x0F, 0x9E, 0x00, 0xFF, 0x00, 0x3F,
|
||||
0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x0F, 0x78,
|
||||
0x07, 0xDF, 0xCF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0, 0x07, 0xF8, 0x07, 0xFF,
|
||||
0x03, 0xFF, 0xE1, 0xF0, 0x3C, 0x78, 0x07, 0xBC, 0x00, 0xEF, 0x00, 0x3F,
|
||||
0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x0F, 0xF0,
|
||||
0x03, 0xDE, 0x01, 0xF7, 0xE1, 0xFC, 0xFF, 0xF7, 0x0F, 0xF1, 0xC0, 0x40,
|
||||
0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0x70,
|
||||
0x00, 0x3C, 0x00, 0x3E, 0x0C, 0xFF, 0x03, 0xFF, 0x80, 0xFF, 0x80, 0x27,
|
||||
0xBF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3D, 0xFF,
|
||||
0xF8, 0x80, 0x08, 0x78, 0xF9, 0xF3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xF1, 0xE3, 0x8F, 0x1E, 0x38, 0x70,
|
||||
0xC3, 0x80, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x3F, 0x00,
|
||||
0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00,
|
||||
0x0F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0,
|
||||
0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0C, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0x00,
|
||||
0x38, 0x00, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00,
|
||||
0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3C, 0x00,
|
||||
0x3F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, 0x00,
|
||||
0x3C, 0x00, 0x0C, 0x00, 0x00, 0x1F, 0xF0, 0xFF, 0xFC, 0x7F, 0xFE, 0x70,
|
||||
0x1E, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00,
|
||||
0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03,
|
||||
0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07,
|
||||
0x80, 0x01, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x03,
|
||||
0xFF, 0xFE, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x78, 0x00, 0x0F, 0x01, 0xE0,
|
||||
0x00, 0x0E, 0x07, 0x80, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x38, 0x07,
|
||||
0xFC, 0x1C, 0x70, 0x3F, 0xF8, 0x39, 0xC0, 0xF0, 0x70, 0x3B, 0x83, 0xC0,
|
||||
0xE0, 0x77, 0x07, 0x01, 0xC0, 0xEC, 0x1E, 0x03, 0x81, 0xF8, 0x38, 0x07,
|
||||
0x03, 0xF0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x0F, 0xC1, 0xC0, 0x38,
|
||||
0x1F, 0x83, 0x80, 0xF0, 0x77, 0x03, 0x81, 0xE0, 0xE6, 0x07, 0x87, 0xE3,
|
||||
0x8E, 0x07, 0xFD, 0xFF, 0x1C, 0x0F, 0xF1, 0xFC, 0x38, 0x03, 0x80, 0xE0,
|
||||
0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
|
||||
0x78, 0x00, 0x10, 0x00, 0x7E, 0x01, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00,
|
||||
0x1F, 0xFF, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F,
|
||||
0x80, 0x00, 0x07, 0xE0, 0x00, 0x07, 0x70, 0x00, 0x03, 0xB8, 0x00, 0x03,
|
||||
0xDE, 0x00, 0x01, 0xC7, 0x00, 0x00, 0xE3, 0x80, 0x00, 0xF1, 0xE0, 0x00,
|
||||
0x70, 0x70, 0x00, 0x78, 0x3C, 0x00, 0x38, 0x0E, 0x00, 0x1C, 0x07, 0x00,
|
||||
0x1E, 0x03, 0xC0, 0x0E, 0x00, 0xE0, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xFC,
|
||||
0x03, 0xFF, 0xFE, 0x03, 0xC0, 0x07, 0x81, 0xC0, 0x03, 0xC0, 0xE0, 0x00,
|
||||
0xE0, 0xF0, 0x00, 0x78, 0x70, 0x00, 0x1C, 0x78, 0x00, 0x0F, 0x3C, 0x00,
|
||||
0x07, 0x9C, 0x00, 0x01, 0xDE, 0x00, 0x00, 0xF0, 0xFF, 0xF8, 0x1F, 0xFF,
|
||||
0xE3, 0xFF, 0xFE, 0x70, 0x07, 0xEE, 0x00, 0x3D, 0xC0, 0x07, 0xB8, 0x00,
|
||||
0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x7B, 0x80, 0x0E, 0x70, 0x07,
|
||||
0xCF, 0xFF, 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0xE7, 0x00, 0x3E, 0xE0, 0x03,
|
||||
0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03,
|
||||
0xF8, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x07, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC,
|
||||
0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0xF0, 0x7F, 0xFF, 0x83,
|
||||
0xF0, 0x0E, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0x00,
|
||||
0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00,
|
||||
0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x10,
|
||||
0x1F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0x3F, 0xFC, 0xFF, 0xF8, 0x03, 0xFF,
|
||||
0xFC, 0x0F, 0xFF, 0xF8, 0x38, 0x03, 0xF0, 0xE0, 0x03, 0xE3, 0x80, 0x03,
|
||||
0xCE, 0x00, 0x0F, 0xB8, 0x00, 0x1E, 0xE0, 0x00, 0x3B, 0x80, 0x00, 0xFE,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x1E, 0xE0, 0x00, 0x7B, 0x80, 0x03, 0xEE, 0x00, 0x1F, 0x38,
|
||||
0x00, 0xF8, 0xE0, 0x1F, 0xC3, 0xFF, 0xFE, 0x0F, 0xFF, 0xE0, 0x3F, 0xFC,
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x1C, 0x00,
|
||||
0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0F,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80,
|
||||
0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0,
|
||||
0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38,
|
||||
0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x00, 0x00,
|
||||
0x7F, 0xF8, 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xC0, 0x0C, 0x1F,
|
||||
0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78,
|
||||
0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF0,
|
||||
0x00, 0x00, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0x70,
|
||||
0x00, 0x0F, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x78,
|
||||
0x00, 0x0F, 0x3C, 0x00, 0x0F, 0x3E, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x0F,
|
||||
0xC0, 0x0F, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0xE0,
|
||||
0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03,
|
||||
0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC,
|
||||
0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x70, 0xFF, 0xFF, 0xF7, 0xF0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01,
|
||||
0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0xCF, 0xFF, 0xFF,
|
||||
0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0,
|
||||
0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C,
|
||||
0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01,
|
||||
0xC0, 0xF0, 0x3C, 0x1E, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x01, 0xFE, 0x00,
|
||||
0x3C, 0xE0, 0x07, 0xCE, 0x00, 0x78, 0xE0, 0x0F, 0x0E, 0x01, 0xE0, 0xE0,
|
||||
0x3C, 0x0E, 0x07, 0x80, 0xE0, 0xF0, 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E,
|
||||
0x78, 0x00, 0xEF, 0x80, 0x0E, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0x9E, 0x00,
|
||||
0xF0, 0xF0, 0x0E, 0x0F, 0x80, 0xE0, 0x78, 0x0E, 0x03, 0xC0, 0xE0, 0x1E,
|
||||
0x0E, 0x01, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x07, 0xCE, 0x00,
|
||||
0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
|
||||
0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x00, 0x03,
|
||||
0xFF, 0xC0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFE, 0xE0, 0x00, 0xFF, 0xEE,
|
||||
0x00, 0x0E, 0xFE, 0xF0, 0x00, 0xEF, 0xE7, 0x00, 0x1C, 0xFE, 0x78, 0x01,
|
||||
0xCF, 0xE3, 0x80, 0x1C, 0xFE, 0x38, 0x03, 0x8F, 0xE3, 0xC0, 0x38, 0xFE,
|
||||
0x1C, 0x07, 0x8F, 0xE1, 0xC0, 0x70, 0xFE, 0x1E, 0x07, 0x0F, 0xE0, 0xE0,
|
||||
0xE0, 0xFE, 0x0F, 0x0E, 0x0F, 0xE0, 0x71, 0xE0, 0xFE, 0x07, 0x1C, 0x0F,
|
||||
0xE0, 0x79, 0xC0, 0xFE, 0x03, 0xBC, 0x0F, 0xE0, 0x3B, 0x80, 0xFE, 0x03,
|
||||
0xF8, 0x0F, 0xE0, 0x1F, 0x00, 0xFE, 0x01, 0xF0, 0x0F, 0xE0, 0x0F, 0x00,
|
||||
0xFE, 0x00, 0xE0, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01,
|
||||
0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7E, 0xF0, 0x01, 0xF9,
|
||||
0xE0, 0x07, 0xE7, 0x80, 0x1F, 0x8F, 0x00, 0x7E, 0x1E, 0x01, 0xF8, 0x78,
|
||||
0x07, 0xE0, 0xF0, 0x1F, 0x81, 0xE0, 0x7E, 0x07, 0x81, 0xF8, 0x0F, 0x07,
|
||||
0xE0, 0x3C, 0x1F, 0x80, 0x78, 0x7E, 0x00, 0xF1, 0xF8, 0x03, 0xC7, 0xE0,
|
||||
0x07, 0x9F, 0x80, 0x0F, 0x7E, 0x00, 0x3D, 0xF8, 0x00, 0x7F, 0xE0, 0x00,
|
||||
0xFF, 0x80, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0x00, 0xFF, 0xE0,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0x00,
|
||||
0x1F, 0x0F, 0x80, 0x03, 0xC3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x78,
|
||||
0x00, 0x03, 0x9E, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00,
|
||||
0x0F, 0x70, 0x00, 0x03, 0xDC, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3D, 0xE0,
|
||||
0x00, 0x0E, 0x78, 0x00, 0x07, 0x8F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0xF0,
|
||||
0x7C, 0x00, 0x7C, 0x0F, 0x80, 0x3E, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF,
|
||||
0x80, 0x03, 0xFF, 0x80, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF3, 0x80,
|
||||
0xFC, 0xE0, 0x0F, 0xB8, 0x01, 0xEE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03,
|
||||
0xF8, 0x00, 0xFE, 0x00, 0x3B, 0x80, 0x1E, 0xE0, 0x0F, 0xB8, 0x07, 0xCF,
|
||||
0xFF, 0xE3, 0xFF, 0xF0, 0xFF, 0xF0, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80,
|
||||
0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00,
|
||||
0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0xFF,
|
||||
0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, 0x1F, 0x0F,
|
||||
0x80, 0x03, 0xC3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x78, 0x00, 0x03,
|
||||
0x9E, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0x70,
|
||||
0x00, 0x03, 0xDC, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3D, 0xE0, 0x00, 0x0E,
|
||||
0x78, 0x00, 0x07, 0x8F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0xF0, 0x7C, 0x00,
|
||||
0x7C, 0x0F, 0x80, 0x3E, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x03,
|
||||
0xFF, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80,
|
||||
0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
|
||||
0xF8, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x0E, 0x01, 0xF8, 0xE0,
|
||||
0x07, 0x8E, 0x00, 0x78, 0xE0, 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x03, 0xCE,
|
||||
0x00, 0x3C, 0xE0, 0x03, 0x8E, 0x00, 0x78, 0xE0, 0x0F, 0x0F, 0xFF, 0xE0,
|
||||
0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xE0, 0x78, 0x0E, 0x03, 0x80, 0xE0, 0x3C,
|
||||
0x0E, 0x01, 0xE0, 0xE0, 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00,
|
||||
0x78, 0xE0, 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x1F, 0x07,
|
||||
0xFE, 0x07, 0xFF, 0xE3, 0xFF, 0xF9, 0xF0, 0x0C, 0x78, 0x00, 0x3C, 0x00,
|
||||
0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00,
|
||||
0xFC, 0x00, 0x1F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xFC, 0x00,
|
||||
0x1F, 0x80, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
|
||||
0xF0, 0x00, 0x38, 0x00, 0x1E, 0xC0, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xE1,
|
||||
0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xF0,
|
||||
0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00,
|
||||
0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80,
|
||||
0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E,
|
||||
0x00, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F,
|
||||
0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00,
|
||||
0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E,
|
||||
0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00,
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8,
|
||||
0x00, 0x3F, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x7C, 0x03, 0xE1, 0xFF, 0xFE,
|
||||
0x07, 0xFF, 0xE0, 0x0F, 0xFC, 0x00, 0xF0, 0x00, 0x0F, 0x70, 0x00, 0x1E,
|
||||
0x78, 0x00, 0x1E, 0x78, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x3C, 0x00, 0x3C,
|
||||
0x3C, 0x00, 0x78, 0x1C, 0x00, 0x78, 0x1E, 0x00, 0x70, 0x1E, 0x00, 0xF0,
|
||||
0x0E, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0F, 0x01, 0xE0, 0x07, 0x01, 0xE0,
|
||||
0x07, 0x81, 0xC0, 0x03, 0x83, 0xC0, 0x03, 0x83, 0xC0, 0x03, 0xC3, 0x80,
|
||||
0x01, 0xC7, 0x80, 0x01, 0xE7, 0x80, 0x01, 0xE7, 0x00, 0x00, 0xEF, 0x00,
|
||||
0x00, 0xEE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00,
|
||||
0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF7, 0x80,
|
||||
0x0F, 0x00, 0x0F, 0x78, 0x00, 0xF8, 0x00, 0xE7, 0x80, 0x1F, 0x80, 0x1E,
|
||||
0x38, 0x01, 0xF8, 0x01, 0xE3, 0xC0, 0x1F, 0xC0, 0x1C, 0x3C, 0x03, 0xDC,
|
||||
0x01, 0xC3, 0xC0, 0x39, 0xC0, 0x3C, 0x1C, 0x03, 0x9C, 0x03, 0xC1, 0xE0,
|
||||
0x79, 0xE0, 0x38, 0x1E, 0x07, 0x8E, 0x03, 0x80, 0xE0, 0x70, 0xE0, 0x78,
|
||||
0x0E, 0x07, 0x0F, 0x07, 0x80, 0xF0, 0xF0, 0x70, 0x70, 0x0F, 0x0E, 0x07,
|
||||
0x07, 0x00, 0x70, 0xE0, 0x78, 0xF0, 0x07, 0x1E, 0x03, 0x8F, 0x00, 0x79,
|
||||
0xE0, 0x38, 0xE0, 0x07, 0x9C, 0x03, 0x8E, 0x00, 0x39, 0xC0, 0x3D, 0xE0,
|
||||
0x03, 0xBC, 0x01, 0xDC, 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x03, 0xF8, 0x01,
|
||||
0xDC, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x1F,
|
||||
0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x07, 0x80,
|
||||
0x78, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0xF0, 0x01, 0xE0, 0xF0, 0x07, 0x80,
|
||||
0xE0, 0x0E, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0xF0, 0x01, 0xC1, 0xC0, 0x03,
|
||||
0xC7, 0x80, 0x03, 0xDE, 0x00, 0x03, 0xB8, 0x00, 0x07, 0xF0, 0x00, 0x07,
|
||||
0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xEE,
|
||||
0x00, 0x03, 0x9E, 0x00, 0x0F, 0x1E, 0x00, 0x1C, 0x1C, 0x00, 0x78, 0x3C,
|
||||
0x01, 0xE0, 0x3C, 0x03, 0x80, 0x78, 0x0F, 0x00, 0x78, 0x3C, 0x00, 0x78,
|
||||
0x70, 0x00, 0xF1, 0xE0, 0x00, 0xF7, 0x80, 0x01, 0xF0, 0xF0, 0x00, 0x3D,
|
||||
0xE0, 0x00, 0xE7, 0x80, 0x07, 0x8F, 0x00, 0x1C, 0x3C, 0x00, 0xF0, 0x78,
|
||||
0x07, 0x81, 0xE0, 0x1E, 0x03, 0xC0, 0xF0, 0x07, 0x03, 0xC0, 0x1E, 0x1E,
|
||||
0x00, 0x38, 0x70, 0x00, 0xF3, 0xC0, 0x01, 0xCE, 0x00, 0x07, 0xF8, 0x00,
|
||||
0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07,
|
||||
0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80,
|
||||
0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00,
|
||||
0x1E, 0x00, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0x7F, 0xFF, 0xE0, 0x00, 0x1E,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0F,
|
||||
0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F,
|
||||
0x00, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07,
|
||||
0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x78, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
|
||||
0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07,
|
||||
0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xF0, 0x01, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00,
|
||||
0xF0, 0x01, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xC0,
|
||||
0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x1E,
|
||||
0x00, 0x38, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00,
|
||||
0xE0, 0x03, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
|
||||
0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
|
||||
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0,
|
||||
0x78, 0x3C, 0x1F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xE0, 0x00, 0x0F, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xB8, 0x00, 0x39, 0xC0, 0x03, 0x1C,
|
||||
0x00, 0x70, 0xE0, 0x07, 0x0E, 0x00, 0xE0, 0x70, 0x0E, 0x07, 0x01, 0xC0,
|
||||
0x38, 0x1C, 0x03, 0x83, 0x80, 0x1C, 0x38, 0x01, 0xC7, 0x00, 0x0E, 0x70,
|
||||
0x00, 0xEF, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF1, 0xE1, 0xE1,
|
||||
0xE1, 0xC1, 0xC0, 0x0F, 0xFC, 0x1F, 0xFF, 0x07, 0xEF, 0xC2, 0x01, 0xE0,
|
||||
0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x7F, 0x87, 0xFF,
|
||||
0xCF, 0xFF, 0xEF, 0x80, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x1F, 0xC0,
|
||||
0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0xDF, 0x3E, 0xEF, 0xFE, 0x71, 0xFE, 0x38,
|
||||
0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x7F, 0x83,
|
||||
0xDF, 0xFC, 0x7F, 0xFF, 0xCF, 0xC0, 0x79, 0xF0, 0x07, 0xBE, 0x00, 0x77,
|
||||
0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF,
|
||||
0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF8, 0x03, 0xDF,
|
||||
0x00, 0x7B, 0xF0, 0x1E, 0x77, 0xDF, 0xCE, 0x7F, 0xF1, 0xC7, 0xF8, 0x00,
|
||||
0x07, 0xFF, 0x0F, 0xFE, 0x1F, 0xFE, 0x3C, 0x02, 0x78, 0x00, 0x78, 0x00,
|
||||
0x70, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00,
|
||||
0xF0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x02,
|
||||
0x1F, 0xFE, 0x0F, 0xFE, 0x07, 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00,
|
||||
0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00,
|
||||
0x0F, 0x00, 0x01, 0xE0, 0xFF, 0x3C, 0x7F, 0xF7, 0x9F, 0xDF, 0x73, 0xC0,
|
||||
0x7E, 0xF0, 0x07, 0xDE, 0x00, 0x7B, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00,
|
||||
0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00,
|
||||
0x7B, 0x80, 0x0F, 0x78, 0x01, 0xEF, 0x00, 0x7C, 0xF0, 0x1F, 0x9F, 0xDF,
|
||||
0x71, 0xFF, 0xCE, 0x0F, 0xF1, 0xC0, 0x07, 0xFC, 0x03, 0xFF, 0x81, 0xFB,
|
||||
0xF0, 0xF0, 0x1E, 0x78, 0x07, 0x9E, 0x00, 0xF7, 0x00, 0x3F, 0xC0, 0x0F,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xF0, 0x00, 0x3C,
|
||||
0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x21, 0xFF,
|
||||
0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x00, 0x01, 0xF8, 0x1F, 0xF0, 0xFF, 0xC3,
|
||||
0xC0, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0xFF, 0xCF,
|
||||
0xFF, 0x3F, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
|
||||
0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80,
|
||||
0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0x07,
|
||||
0xF8, 0xE3, 0xFF, 0x9C, 0xFF, 0xFB, 0x9E, 0x03, 0xF7, 0x80, 0x3E, 0xF0,
|
||||
0x03, 0xDC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0,
|
||||
0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xDC, 0x00, 0x7B, 0xC0,
|
||||
0x0F, 0x78, 0x03, 0xE7, 0x80, 0xFC, 0xFE, 0xFF, 0x8F, 0xFE, 0xF0, 0x7F,
|
||||
0x9E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00,
|
||||
0x78, 0x80, 0x1F, 0x1F, 0xDF, 0xC3, 0xFF, 0xF0, 0x3F, 0xF8, 0x00, 0xF0,
|
||||
0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00,
|
||||
0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x7F, 0x8F, 0x7F, 0xF3,
|
||||
0xFF, 0xFE, 0xFC, 0x07, 0xBE, 0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x07, 0xF0,
|
||||
0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00,
|
||||
0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x70, 0x6F, 0xFF, 0x20, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0x03,
|
||||
0xC1, 0xE0, 0xF0, 0x10, 0x00, 0x00, 0x00, 0x07, 0x83, 0xC1, 0xE0, 0xF0,
|
||||
0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
|
||||
0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
|
||||
0xC1, 0xDB, 0xEF, 0xF7, 0xE0, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03,
|
||||
0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
|
||||
0x00, 0x3C, 0x03, 0xEF, 0x00, 0xF3, 0xC0, 0x78, 0xF0, 0x3C, 0x3C, 0x1E,
|
||||
0x0F, 0x0F, 0x03, 0xC7, 0x80, 0xF3, 0xC0, 0x3D, 0xE0, 0x0F, 0xF8, 0x03,
|
||||
0xFF, 0x00, 0xFF, 0xC0, 0x3E, 0x78, 0x0F, 0x0F, 0x03, 0xC1, 0xE0, 0xF0,
|
||||
0x78, 0x3C, 0x0F, 0x0F, 0x01, 0xE3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x01,
|
||||
0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFC, 0x1F, 0xE3, 0x9F, 0xF8, 0xFF, 0xEF,
|
||||
0xFF, 0xF7, 0xFF, 0xBF, 0x03, 0xF8, 0x0F, 0xF8, 0x07, 0xC0, 0x3F, 0xC0,
|
||||
0x1F, 0x00, 0x7F, 0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03,
|
||||
0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F, 0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0,
|
||||
0x07, 0xF0, 0x03, 0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F, 0x00, 0x38, 0x01,
|
||||
0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03, 0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F,
|
||||
0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03, 0x80, 0x1C, 0xE3,
|
||||
0xFE, 0x39, 0xFF, 0xCF, 0xFF, 0xFB, 0xF0, 0x1E, 0xF8, 0x03, 0xFE, 0x00,
|
||||
0xFF, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0,
|
||||
0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xC0, 0x07,
|
||||
0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xC0, 0x7C, 0x78, 0x03, 0xC7,
|
||||
0x80, 0x1E, 0x70, 0x01, 0xEF, 0x00, 0x0E, 0xF0, 0x00, 0xEF, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xEF, 0x00, 0x0E, 0x70, 0x01,
|
||||
0xE7, 0x80, 0x1E, 0x78, 0x03, 0xC3, 0xC0, 0x7C, 0x1F, 0xFF, 0x80, 0xFF,
|
||||
0xF0, 0x03, 0xFC, 0x00, 0xE3, 0xFC, 0x1C, 0xFF, 0xE3, 0xFF, 0xFE, 0x7E,
|
||||
0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x07, 0xBC, 0x00, 0x7F, 0x80, 0x0F, 0xF0,
|
||||
0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0,
|
||||
0x03, 0xFC, 0x00, 0x7F, 0xC0, 0x1E, 0xF8, 0x03, 0xDF, 0x80, 0xF3, 0xFE,
|
||||
0xFE, 0x7B, 0xFF, 0x8F, 0x3F, 0xC1, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80,
|
||||
0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0xE3, 0xFF, 0x9C, 0xFE, 0xFB, 0x9E,
|
||||
0x03, 0xF7, 0x80, 0x3E, 0xF0, 0x03, 0xDC, 0x00, 0x7F, 0x80, 0x0F, 0xF0,
|
||||
0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0,
|
||||
0x03, 0xDC, 0x00, 0x7B, 0xC0, 0x0F, 0x78, 0x03, 0xE7, 0x80, 0xFC, 0xFE,
|
||||
0xFF, 0x8F, 0xFE, 0xF0, 0x7F, 0x9E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00,
|
||||
0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00,
|
||||
0x1E, 0x00, 0x03, 0xC0, 0xE1, 0xFF, 0x1F, 0xB9, 0xFD, 0xFC, 0x0F, 0xC0,
|
||||
0x7C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F,
|
||||
0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
|
||||
0x0F, 0x00, 0x00, 0x1F, 0xF8, 0x7F, 0xFD, 0xFB, 0xF7, 0x80, 0x2E, 0x00,
|
||||
0x1C, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x7F, 0x00, 0x7F, 0x80, 0x3F, 0xC0,
|
||||
0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x1F, 0x00,
|
||||
0x3F, 0xE3, 0xF7, 0xFF, 0xC7, 0xFE, 0x00, 0x0C, 0x00, 0xC0, 0x1C, 0x01,
|
||||
0xC0, 0x1C, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x01, 0xC0, 0x1C, 0x01,
|
||||
0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01,
|
||||
0xC0, 0x1C, 0x01, 0xC0, 0x1E, 0x01, 0xFB, 0x0F, 0xF0, 0x7F, 0xF0, 0x03,
|
||||
0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF,
|
||||
0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0,
|
||||
0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x07,
|
||||
0xDE, 0x03, 0xF7, 0xF7, 0xDC, 0xFF, 0xE7, 0x1F, 0xF1, 0xC0, 0xF0, 0x00,
|
||||
0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x38, 0x01, 0xC3, 0xC0,
|
||||
0x3C, 0x3C, 0x03, 0x81, 0xC0, 0x78, 0x1E, 0x07, 0x80, 0xE0, 0x70, 0x0E,
|
||||
0x0F, 0x00, 0xF0, 0xF0, 0x07, 0x0E, 0x00, 0x79, 0xE0, 0x07, 0x9C, 0x00,
|
||||
0x39, 0xC0, 0x03, 0xBC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x00,
|
||||
0x00, 0xF0, 0x00, 0xF0, 0x07, 0x80, 0x1D, 0xC0, 0x1F, 0x00, 0xF7, 0x80,
|
||||
0x7C, 0x03, 0xDE, 0x03, 0xF0, 0x0E, 0x38, 0x0E, 0xE0, 0x38, 0xE0, 0x3B,
|
||||
0x81, 0xE3, 0xC1, 0xEE, 0x07, 0x8F, 0x07, 0x3C, 0x1C, 0x1C, 0x1C, 0x70,
|
||||
0x70, 0x70, 0x71, 0xC3, 0xC1, 0xE3, 0x87, 0x8E, 0x03, 0x8E, 0x0E, 0x38,
|
||||
0x0E, 0x38, 0x38, 0xE0, 0x39, 0xC0, 0xE7, 0x80, 0xF7, 0x01, 0xDC, 0x01,
|
||||
0xDC, 0x07, 0x70, 0x07, 0x70, 0x1D, 0xC0, 0x1F, 0x80, 0x7F, 0x00, 0x3E,
|
||||
0x00, 0xF8, 0x00, 0xF8, 0x03, 0xE0, 0x03, 0xC0, 0x0F, 0x80, 0xF0, 0x03,
|
||||
0xEF, 0x00, 0x78, 0xF0, 0x1E, 0x0E, 0x07, 0x81, 0xE0, 0xE0, 0x1E, 0x3C,
|
||||
0x01, 0xCF, 0x00, 0x3D, 0xC0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0,
|
||||
0x01, 0xF8, 0x00, 0x3F, 0x80, 0x0F, 0x78, 0x03, 0xC7, 0x00, 0x70, 0xF0,
|
||||
0x1E, 0x0F, 0x07, 0x80, 0xF1, 0xE0, 0x1E, 0x3C, 0x01, 0xEF, 0x00, 0x1E,
|
||||
0xF0, 0x00, 0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x38, 0x01,
|
||||
0xC3, 0xC0, 0x3C, 0x1C, 0x03, 0xC1, 0xE0, 0x38, 0x1E, 0x07, 0x80, 0xE0,
|
||||
0x70, 0x0F, 0x0F, 0x00, 0x70, 0xF0, 0x07, 0x0E, 0x00, 0x79, 0xE0, 0x03,
|
||||
0x9E, 0x00, 0x39, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00,
|
||||
0x0F, 0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00,
|
||||
0x01, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0xC0, 0x0D, 0xF8, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xE0, 0x03,
|
||||
0x80, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x80, 0x1E, 0x00,
|
||||
0x38, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x01, 0xE0,
|
||||
0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x78, 0x0F, 0xC0, 0xFE,
|
||||
0x0F, 0x80, 0x78, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01,
|
||||
0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x0F, 0xC0, 0xFC, 0x07, 0xC0,
|
||||
0x3F, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00,
|
||||
0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x1E, 0x00, 0x7F, 0x01,
|
||||
0xF8, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0, 0x07, 0xE0, 0x3F, 0x80, 0x3C,
|
||||
0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0,
|
||||
0x0E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x7E, 0x01, 0xF8, 0x07, 0xC0,
|
||||
0xFE, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38,
|
||||
0x01, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x7C, 0x1F, 0xC0, 0xFC, 0x07,
|
||||
0x80, 0x00, 0x7F, 0x80, 0x7F, 0xF8, 0x3F, 0x7F, 0xFF, 0x03, 0xFE, 0x80,
|
||||
0x1E, 0x00 };
|
||||
|
||||
const GFXglyph NotoSans_Regular20pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 10, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 5, 29, 11, 3, -27 }, // 0x21 '!'
|
||||
{ 20, 10, 10, 16, 3, -27 }, // 0x22 '"'
|
||||
{ 33, 23, 28, 25, 1, -27 }, // 0x23 '#'
|
||||
{ 114, 18, 32, 22, 2, -29 }, // 0x24 '$'
|
||||
{ 186, 29, 28, 33, 2, -27 }, // 0x25 '%'
|
||||
{ 288, 27, 28, 29, 2, -27 }, // 0x26 '&'
|
||||
{ 383, 3, 10, 9, 3, -27 }, // 0x27 '''
|
||||
{ 387, 9, 34, 12, 2, -27 }, // 0x28 '('
|
||||
{ 426, 9, 34, 12, 1, -27 }, // 0x29 ')'
|
||||
{ 465, 18, 18, 22, 2, -29 }, // 0x2A '*'
|
||||
{ 506, 18, 19, 22, 2, -22 }, // 0x2B '+'
|
||||
{ 549, 6, 10, 11, 2, -4 }, // 0x2C ','
|
||||
{ 557, 9, 3, 13, 2, -11 }, // 0x2D '-'
|
||||
{ 561, 5, 6, 11, 3, -4 }, // 0x2E '.'
|
||||
{ 565, 14, 28, 15, 0, -27 }, // 0x2F '/'
|
||||
{ 614, 18, 28, 22, 2, -27 }, // 0x30 '0'
|
||||
{ 677, 11, 28, 22, 3, -27 }, // 0x31 '1'
|
||||
{ 716, 18, 28, 22, 2, -27 }, // 0x32 '2'
|
||||
{ 779, 18, 28, 22, 2, -27 }, // 0x33 '3'
|
||||
{ 842, 21, 28, 22, 1, -27 }, // 0x34 '4'
|
||||
{ 916, 18, 28, 22, 2, -27 }, // 0x35 '5'
|
||||
{ 979, 19, 28, 22, 2, -27 }, // 0x36 '6'
|
||||
{ 1046, 18, 28, 22, 2, -27 }, // 0x37 '7'
|
||||
{ 1109, 18, 28, 22, 2, -27 }, // 0x38 '8'
|
||||
{ 1172, 18, 28, 22, 2, -27 }, // 0x39 '9'
|
||||
{ 1235, 5, 23, 11, 3, -21 }, // 0x3A ':'
|
||||
{ 1250, 7, 27, 11, 1, -21 }, // 0x3B ';'
|
||||
{ 1274, 18, 19, 22, 2, -23 }, // 0x3C '<'
|
||||
{ 1317, 18, 11, 22, 2, -18 }, // 0x3D '='
|
||||
{ 1342, 18, 19, 22, 2, -23 }, // 0x3E '>'
|
||||
{ 1385, 16, 29, 17, 0, -27 }, // 0x3F '?'
|
||||
{ 1443, 31, 31, 35, 2, -27 }, // 0x40 '@'
|
||||
{ 1564, 25, 28, 25, 0, -27 }, // 0x41 'A'
|
||||
{ 1652, 19, 28, 25, 4, -27 }, // 0x42 'B'
|
||||
{ 1719, 22, 28, 25, 2, -27 }, // 0x43 'C'
|
||||
{ 1796, 22, 28, 29, 4, -27 }, // 0x44 'D'
|
||||
{ 1873, 15, 28, 22, 4, -27 }, // 0x45 'E'
|
||||
{ 1926, 15, 28, 20, 4, -27 }, // 0x46 'F'
|
||||
{ 1979, 24, 28, 29, 2, -27 }, // 0x47 'G'
|
||||
{ 2063, 21, 28, 29, 4, -27 }, // 0x48 'H'
|
||||
{ 2137, 10, 28, 13, 2, -27 }, // 0x49 'I'
|
||||
{ 2172, 10, 35, 11, -3, -27 }, // 0x4A 'J'
|
||||
{ 2216, 20, 28, 24, 4, -27 }, // 0x4B 'K'
|
||||
{ 2286, 16, 28, 21, 4, -27 }, // 0x4C 'L'
|
||||
{ 2342, 28, 28, 36, 4, -27 }, // 0x4D 'M'
|
||||
{ 2440, 22, 28, 30, 4, -27 }, // 0x4E 'N'
|
||||
{ 2517, 26, 28, 31, 2, -27 }, // 0x4F 'O'
|
||||
{ 2608, 18, 28, 24, 4, -27 }, // 0x50 'P'
|
||||
{ 2671, 26, 35, 31, 2, -27 }, // 0x51 'Q'
|
||||
{ 2785, 20, 28, 24, 4, -27 }, // 0x52 'R'
|
||||
{ 2855, 18, 28, 22, 2, -27 }, // 0x53 'S'
|
||||
{ 2918, 21, 28, 22, 0, -27 }, // 0x54 'T'
|
||||
{ 2992, 21, 28, 29, 4, -27 }, // 0x55 'U'
|
||||
{ 3066, 24, 28, 24, 0, -27 }, // 0x56 'V'
|
||||
{ 3150, 36, 28, 36, 0, -27 }, // 0x57 'W'
|
||||
{ 3276, 23, 28, 23, 0, -27 }, // 0x58 'X'
|
||||
{ 3357, 22, 28, 22, 0, -27 }, // 0x59 'Y'
|
||||
{ 3434, 20, 28, 22, 1, -27 }, // 0x5A 'Z'
|
||||
{ 3504, 9, 34, 13, 3, -27 }, // 0x5B '['
|
||||
{ 3543, 14, 28, 15, 0, -27 }, // 0x5C '\'
|
||||
{ 3592, 9, 34, 13, 1, -27 }, // 0x5D ']'
|
||||
{ 3631, 20, 18, 22, 1, -27 }, // 0x5E '^'
|
||||
{ 3676, 17, 2, 17, 0, 5 }, // 0x5F '_'
|
||||
{ 3681, 7, 6, 11, 2, -29 }, // 0x60 '`'
|
||||
{ 3687, 17, 21, 22, 2, -20 }, // 0x61 'a'
|
||||
{ 3732, 19, 30, 24, 3, -29 }, // 0x62 'b'
|
||||
{ 3804, 16, 21, 19, 2, -20 }, // 0x63 'c'
|
||||
{ 3846, 19, 30, 24, 2, -29 }, // 0x64 'd'
|
||||
{ 3918, 18, 21, 22, 2, -20 }, // 0x65 'e'
|
||||
{ 3966, 14, 30, 13, 1, -29 }, // 0x66 'f'
|
||||
{ 4019, 19, 30, 24, 2, -20 }, // 0x67 'g'
|
||||
{ 4091, 18, 30, 24, 3, -29 }, // 0x68 'h'
|
||||
{ 4159, 4, 29, 10, 3, -28 }, // 0x69 'i'
|
||||
{ 4174, 9, 38, 10, -2, -28 }, // 0x6A 'j'
|
||||
{ 4217, 18, 30, 21, 3, -29 }, // 0x6B 'k'
|
||||
{ 4285, 4, 30, 10, 3, -29 }, // 0x6C 'l'
|
||||
{ 4300, 30, 21, 37, 3, -20 }, // 0x6D 'm'
|
||||
{ 4379, 18, 21, 24, 3, -20 }, // 0x6E 'n'
|
||||
{ 4427, 20, 21, 24, 2, -20 }, // 0x6F 'o'
|
||||
{ 4480, 19, 30, 24, 3, -20 }, // 0x70 'p'
|
||||
{ 4552, 19, 30, 24, 2, -20 }, // 0x71 'q'
|
||||
{ 4624, 13, 21, 16, 3, -20 }, // 0x72 'r'
|
||||
{ 4659, 15, 21, 19, 2, -20 }, // 0x73 's'
|
||||
{ 4699, 12, 26, 14, 1, -25 }, // 0x74 't'
|
||||
{ 4738, 18, 21, 24, 3, -20 }, // 0x75 'u'
|
||||
{ 4786, 20, 21, 20, 0, -20 }, // 0x76 'v'
|
||||
{ 4839, 30, 21, 31, 0, -20 }, // 0x77 'w'
|
||||
{ 4918, 19, 21, 21, 1, -20 }, // 0x78 'x'
|
||||
{ 4968, 20, 30, 20, 0, -20 }, // 0x79 'y'
|
||||
{ 5043, 15, 21, 18, 2, -20 }, // 0x7A 'z'
|
||||
{ 5083, 13, 34, 15, 1, -27 }, // 0x7B '{'
|
||||
{ 5139, 3, 39, 22, 9, -29 }, // 0x7C '|'
|
||||
{ 5154, 13, 34, 15, 1, -27 }, // 0x7D '}'
|
||||
{ 5210, 18, 5, 22, 2, -15 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular20pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular20pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular20pt7bGlyphs,
|
||||
0x20, 0x7E, 53 };
|
||||
|
||||
// Approx. 5894 bytes
|
||||
|
||||
#endif // NOTOSANS20PT7B_H
|
||||
@@ -0,0 +1,639 @@
|
||||
#ifndef NOTOSANS22PT7B_H
|
||||
#define NOTOSANS22PT7B_H
|
||||
const uint8_t NotoSans_Regular22pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFB, 0xDE, 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xF7, 0xB9, 0xCE, 0x73,
|
||||
0x9C, 0xE7, 0x18, 0x00, 0x00, 0x1F, 0xFF, 0xFD, 0xE4, 0xF0, 0xFF, 0x0F,
|
||||
0xF0, 0xFF, 0x0F, 0xF0, 0xEF, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0, 0xE6, 0x0E,
|
||||
0x60, 0xE0, 0x00, 0x38, 0x1C, 0x00, 0x1E, 0x07, 0x00, 0x07, 0x01, 0xC0,
|
||||
0x01, 0xC0, 0xE0, 0x00, 0x70, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x0F, 0x03,
|
||||
0x80, 0x03, 0x80, 0xE0, 0x00, 0xE0, 0x70, 0x0F, 0xFF, 0xFF, 0xF3, 0xFF,
|
||||
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x70, 0x00, 0x70, 0x38, 0x00,
|
||||
0x1C, 0x0E, 0x00, 0x07, 0x03, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0x38,
|
||||
0x00, 0x38, 0x1C, 0x03, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF,
|
||||
0xFF, 0xC0, 0x70, 0x1C, 0x00, 0x1C, 0x0F, 0x00, 0x07, 0x03, 0x80, 0x01,
|
||||
0xC0, 0xE0, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x0E, 0x00, 0x0E, 0x07, 0x80,
|
||||
0x03, 0x81, 0xC0, 0x00, 0xE0, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x70, 0x00, 0x7F, 0xE0, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3,
|
||||
0xF7, 0x7E, 0xF0, 0xE0, 0x9E, 0x1C, 0x03, 0x83, 0x80, 0x70, 0x70, 0x0F,
|
||||
0x0E, 0x01, 0xE1, 0xC0, 0x3F, 0x38, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x01,
|
||||
0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x0E, 0x7E, 0x01, 0xC3, 0xC0,
|
||||
0x38, 0x78, 0x07, 0x07, 0x00, 0xE1, 0xE0, 0x1C, 0x3F, 0x03, 0x8F, 0xFF,
|
||||
0x7F, 0xEF, 0xFF, 0xF9, 0xFF, 0xFC, 0x07, 0xFC, 0x00, 0x07, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x1F, 0x80, 0x01,
|
||||
0xC0, 0x3F, 0xE0, 0x03, 0x80, 0x3F, 0xE0, 0x07, 0x80, 0x70, 0xF0, 0x07,
|
||||
0x00, 0x70, 0x70, 0x0F, 0x00, 0xF0, 0x70, 0x0E, 0x00, 0xE0, 0x38, 0x1E,
|
||||
0x00, 0xE0, 0x38, 0x1C, 0x00, 0xE0, 0x38, 0x3C, 0x00, 0xE0, 0x38, 0x38,
|
||||
0x00, 0xE0, 0x38, 0x70, 0x00, 0xE0, 0x38, 0x70, 0x00, 0xE0, 0x78, 0xE1,
|
||||
0xE0, 0x70, 0x71, 0xE7, 0xF8, 0x70, 0x71, 0xC7, 0xFC, 0x78, 0xF3, 0xCF,
|
||||
0x1E, 0x3F, 0xE3, 0x8E, 0x0E, 0x3F, 0xE7, 0x9E, 0x0E, 0x0F, 0x87, 0x1C,
|
||||
0x0E, 0x00, 0x0E, 0x1C, 0x0F, 0x00, 0x0E, 0x1C, 0x0F, 0x00, 0x1C, 0x1C,
|
||||
0x07, 0x00, 0x3C, 0x1C, 0x07, 0x00, 0x38, 0x1C, 0x0F, 0x00, 0x78, 0x1C,
|
||||
0x0F, 0x00, 0x70, 0x1C, 0x0E, 0x00, 0xF0, 0x1E, 0x0E, 0x00, 0xE0, 0x0E,
|
||||
0x1E, 0x01, 0xC0, 0x0F, 0xBC, 0x01, 0xC0, 0x07, 0xFC, 0x03, 0x80, 0x03,
|
||||
0xF8, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x03, 0xFF, 0xE0, 0x00,
|
||||
0x1F, 0x0F, 0x80, 0x01, 0xE0, 0x3C, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x78,
|
||||
0x07, 0x80, 0x03, 0xC0, 0x38, 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x78, 0x1E,
|
||||
0x00, 0x03, 0xE1, 0xE0, 0x00, 0x0F, 0x3E, 0x00, 0x00, 0x3F, 0xE0, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x1F,
|
||||
0xFE, 0x01, 0xE1, 0xF1, 0xF8, 0x0F, 0x1F, 0x07, 0xE0, 0x78, 0xF0, 0x1F,
|
||||
0x87, 0x87, 0x80, 0x7E, 0x3C, 0x78, 0x00, 0xFB, 0xC3, 0xC0, 0x03, 0xFE,
|
||||
0x1E, 0x00, 0x0F, 0xE0, 0xF0, 0x00, 0x3E, 0x03, 0xC0, 0x01, 0xF8, 0x1F,
|
||||
0x00, 0x3F, 0xE0, 0xFC, 0x07, 0xEF, 0x83, 0xFF, 0xFE, 0x3E, 0x0F, 0xFF,
|
||||
0xE0, 0xF8, 0x1F, 0xF8, 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xEE, 0xE6, 0x60,
|
||||
0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x78, 0x1E,
|
||||
0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
|
||||
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78,
|
||||
0x1E, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
||||
0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x01,
|
||||
0xE0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
|
||||
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x78, 0x1E, 0x07,
|
||||
0x81, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x3C, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0,
|
||||
0x00, 0x0E, 0x00, 0x80, 0xE0, 0x2F, 0x8E, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x0F, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3B, 0xC0, 0x07,
|
||||
0x9E, 0x00, 0xF1, 0xE0, 0x1F, 0x0F, 0x01, 0xE0, 0xF8, 0x0E, 0x06, 0x00,
|
||||
0x20, 0x40, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00,
|
||||
0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70,
|
||||
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x70, 0x00, 0x07,
|
||||
0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00,
|
||||
0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x3C, 0xF7, 0xDE, 0x79, 0xE7,
|
||||
0x3C, 0xE3, 0x8E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xF7, 0x98,
|
||||
0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C,
|
||||
0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xE0,
|
||||
0x01, 0xE0, 0x01, 0xE0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80,
|
||||
0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00,
|
||||
0x1E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00,
|
||||
0xF0, 0x00, 0x03, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xE0, 0x3E, 0x0F,
|
||||
0x83, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0, 0x07, 0x8F, 0x00, 0x1E, 0x78,
|
||||
0x00, 0xF3, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xE0, 0x00, 0xEF, 0x00, 0x07,
|
||||
0x78, 0x00, 0x3B, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80,
|
||||
0x03, 0xBC, 0x00, 0x1D, 0xE0, 0x00, 0xEF, 0x00, 0x0F, 0x38, 0x00, 0x79,
|
||||
0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x01, 0xE1, 0xE0, 0x0F, 0x0F, 0x00,
|
||||
0xF8, 0x3C, 0x0F, 0x81, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x0F, 0xF8, 0x00,
|
||||
0x00, 0xE0, 0x3C, 0x1F, 0x87, 0xF1, 0xEE, 0xF9, 0xFE, 0x3F, 0x87, 0x60,
|
||||
0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0,
|
||||
0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C,
|
||||
0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0xFF, 0xF0,
|
||||
0x3F, 0xFF, 0x8F, 0xE0, 0xFC, 0x78, 0x03, 0xC2, 0x00, 0x1E, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00,
|
||||
0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00,
|
||||
0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00,
|
||||
0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x7C, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0x07, 0xFC, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x8F, 0xC0, 0x7C, 0x70,
|
||||
0x03, 0xE2, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
|
||||
0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x0F, 0xF0,
|
||||
0x07, 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xFF, 0x80, 0x00, 0x7E, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xEE, 0x00, 0x7E, 0xFF,
|
||||
0xFF, 0xCF, 0xFF, 0xF0, 0x3F, 0xFE, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x0F,
|
||||
0x80, 0x00, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xB8,
|
||||
0x00, 0x0E, 0x70, 0x00, 0x3C, 0xE0, 0x00, 0xF1, 0xC0, 0x01, 0xC3, 0x80,
|
||||
0x07, 0x87, 0x00, 0x1E, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0xF0, 0x38, 0x03,
|
||||
0xC0, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0x78, 0x03, 0x81, 0xE0,
|
||||
0x07, 0x03, 0x80, 0x0E, 0x0F, 0x00, 0x1C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07,
|
||||
0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70,
|
||||
0x00, 0x3F, 0xFF, 0x8F, 0xFF, 0xF1, 0xFF, 0xFE, 0x3F, 0xFF, 0xC7, 0x80,
|
||||
0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x70, 0x00, 0x0E, 0x00,
|
||||
0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x7F, 0x00, 0xFF, 0xFC, 0x3F, 0xFF,
|
||||
0xC1, 0xC3, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0x80, 0x00,
|
||||
0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x7A, 0x00, 0x1F, 0x70, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC,
|
||||
0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x0F,
|
||||
0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
|
||||
0x38, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x0F,
|
||||
0xF0, 0x39, 0xFF, 0xC3, 0xDF, 0xFF, 0x1F, 0xE0, 0x7C, 0xFC, 0x01, 0xF7,
|
||||
0xC0, 0x07, 0xBE, 0x00, 0x1D, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xB8, 0x00,
|
||||
0x3D, 0xC0, 0x01, 0xEF, 0x00, 0x0E, 0x78, 0x00, 0xF1, 0xE0, 0x07, 0x8F,
|
||||
0x80, 0x78, 0x3E, 0x07, 0xC0, 0xFF, 0xFC, 0x03, 0xFF, 0xC0, 0x07, 0xF8,
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x0F, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x00, 0x03,
|
||||
0xFE, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0xC3, 0xE0, 0x7E, 0x3C, 0x01, 0xE7,
|
||||
0x80, 0x1E, 0x78, 0x00, 0xE7, 0x80, 0x0F, 0x78, 0x00, 0xE7, 0x80, 0x1E,
|
||||
0x3C, 0x01, 0xE3, 0xE0, 0x3C, 0x1F, 0x8F, 0x80, 0xFF, 0xF0, 0x03, 0xFC,
|
||||
0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x81, 0xF0, 0xFC, 0x3C, 0x03, 0xE7, 0x80,
|
||||
0x1F, 0x70, 0x00, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0x78, 0x00, 0xF7, 0xC0, 0x3E, 0x3F, 0xFF, 0xC1,
|
||||
0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||
0x83, 0xE0, 0xFC, 0x7C, 0x03, 0xC7, 0x80, 0x1E, 0x78, 0x01, 0xEF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0xF7, 0x80, 0x0F, 0x78, 0x01, 0xF7, 0xC0, 0x3F, 0x3F, 0xFF, 0x71,
|
||||
0xFF, 0xEF, 0x0F, 0xF8, 0xF0, 0x08, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0E,
|
||||
0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07,
|
||||
0x80, 0x01, 0xF0, 0x3F, 0xFE, 0x03, 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0x37,
|
||||
0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
||||
0xFF, 0xEF, 0x30, 0x0C, 0x7C, 0xF9, 0xF3, 0xE3, 0xC0, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3, 0xE7, 0x8F, 0x1E,
|
||||
0x78, 0xF1, 0xC3, 0x87, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00,
|
||||
0x01, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x00,
|
||||
0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x7F, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x10, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x00,
|
||||
0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xC0, 0x0F,
|
||||
0xF0, 0x00, 0xFC, 0x00, 0x0F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x1F, 0xF0,
|
||||
0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0x07, 0xE4, 0x00, 0xF0, 0x00, 0x38, 0x00,
|
||||
0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0x80, 0x03, 0xC0, 0x03, 0xC0,
|
||||
0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0,
|
||||
0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00,
|
||||
0x7C, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07,
|
||||
0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x03, 0xF8, 0x0F, 0xE0, 0x03,
|
||||
0xF0, 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x78, 0x00, 0x00, 0xF0,
|
||||
0x3C, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x07, 0x87, 0x00, 0xFF, 0xC0,
|
||||
0xE3, 0x80, 0xFF, 0xF8, 0x3C, 0xE0, 0x7E, 0x3E, 0x07, 0x78, 0x1E, 0x07,
|
||||
0x81, 0xDC, 0x0F, 0x01, 0xE0, 0x77, 0x03, 0x80, 0x78, 0x1D, 0xC1, 0xE0,
|
||||
0x1E, 0x07, 0x70, 0x78, 0x07, 0x81, 0xDC, 0x1E, 0x01, 0xC0, 0x7F, 0x07,
|
||||
0x00, 0x70, 0x1F, 0xC1, 0xE0, 0x1C, 0x07, 0x70, 0x78, 0x07, 0x03, 0x9C,
|
||||
0x0E, 0x03, 0xC0, 0xE7, 0x03, 0xC1, 0xF8, 0x79, 0xC0, 0xFD, 0xE7, 0x3C,
|
||||
0x70, 0x1F, 0xF9, 0xFE, 0x0E, 0x01, 0xF8, 0x3F, 0x03, 0x80, 0x00, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00,
|
||||
0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x0F, 0xC0, 0x1F, 0x00, 0x01, 0xFF,
|
||||
0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x00, 0x77, 0x80, 0x00, 0x0E, 0xF0, 0x00, 0x03,
|
||||
0xCE, 0x00, 0x00, 0x71, 0xE0, 0x00, 0x1E, 0x3C, 0x00, 0x03, 0xC3, 0xC0,
|
||||
0x00, 0x70, 0x78, 0x00, 0x1E, 0x07, 0x00, 0x03, 0xC0, 0xF0, 0x00, 0xF0,
|
||||
0x1E, 0x00, 0x1E, 0x01, 0xC0, 0x03, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80,
|
||||
0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, 0x1E, 0x00,
|
||||
0x1E, 0x07, 0x80, 0x03, 0xC0, 0xF0, 0x00, 0x3C, 0x1C, 0x00, 0x07, 0x87,
|
||||
0x80, 0x00, 0xF0, 0xF0, 0x00, 0x0F, 0x3C, 0x00, 0x01, 0xE7, 0x80, 0x00,
|
||||
0x3E, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x78, 0xFF, 0xF0, 0x03, 0xFF,
|
||||
0xFE, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xF0, 0x03, 0xF3, 0xC0, 0x03,
|
||||
0xCF, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0xF0, 0x00, 0x7B, 0xC0, 0x01, 0xCF,
|
||||
0x00, 0x0F, 0x3C, 0x00, 0x3C, 0xF0, 0x01, 0xE3, 0xFF, 0xFF, 0x0F, 0xFF,
|
||||
0xE0, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0xE3, 0xC0, 0x07, 0xCF, 0x00, 0x0F,
|
||||
0xBC, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC,
|
||||
0x00, 0x1F, 0xF0, 0x00, 0x7B, 0xC0, 0x03, 0xEF, 0x00, 0x1F, 0xBC, 0x03,
|
||||
0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFF, 0xE0, 0x00, 0x00, 0x7F,
|
||||
0xF0, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x7F, 0x83, 0xE1, 0xF8, 0x00,
|
||||
0xC7, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01,
|
||||
0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E,
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00,
|
||||
0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00,
|
||||
0x00, 0x7C, 0x00, 0x00, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF,
|
||||
0x80, 0x3F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF,
|
||||
0xF8, 0x1F, 0xFF, 0xFE, 0x0F, 0x00, 0x1F, 0x87, 0x80, 0x03, 0xE3, 0xC0,
|
||||
0x00, 0xF9, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0x78, 0x00, 0x07, 0xBC,
|
||||
0x00, 0x03, 0xDE, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03,
|
||||
0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xEF, 0x00, 0x00, 0xF7, 0x80, 0x00,
|
||||
0x7B, 0xC0, 0x00, 0x7D, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x3E, 0x78, 0x00,
|
||||
0x3E, 0x3C, 0x00, 0x7E, 0x1E, 0x03, 0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF,
|
||||
0xFC, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00,
|
||||
0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F,
|
||||
0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00,
|
||||
0x3C, 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x80, 0x03,
|
||||
0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00,
|
||||
0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFC, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01,
|
||||
0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00,
|
||||
0x07, 0x80, 0x03, 0xC0, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFF, 0xC0,
|
||||
0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xE1, 0xF8, 0x00, 0x30, 0xF8, 0x00, 0x00,
|
||||
0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00,
|
||||
0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00,
|
||||
0x03, 0xC0, 0x00, 0x01, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00,
|
||||
0xFF, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0,
|
||||
0x00, 0x3D, 0xE0, 0x00, 0x1E, 0xF8, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9F,
|
||||
0x00, 0x03, 0xC7, 0xE0, 0x01, 0xE1, 0xFC, 0x00, 0xF0, 0x7F, 0xFF, 0xF8,
|
||||
0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x01, 0xE0, 0x3C, 0x07,
|
||||
0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80,
|
||||
0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
||||
0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x07, 0xFD, 0xFF, 0xFF, 0xF8, 0x01, 0xE0,
|
||||
0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
|
||||
0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07,
|
||||
0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80,
|
||||
0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x47, 0xEF,
|
||||
0xF9, 0xFE, 0x3F, 0x00, 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xF3, 0xC0, 0x03,
|
||||
0xC7, 0x80, 0x0F, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xE0,
|
||||
0x78, 0x0F, 0x80, 0xF0, 0x3E, 0x01, 0xE0, 0xF8, 0x03, 0xC3, 0xE0, 0x07,
|
||||
0x87, 0x80, 0x0F, 0x1E, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xF8, 0x00, 0x7F,
|
||||
0xF0, 0x00, 0xFF, 0xF0, 0x01, 0xF9, 0xF0, 0x03, 0xE1, 0xF0, 0x07, 0x81,
|
||||
0xE0, 0x0F, 0x03, 0xE0, 0x1E, 0x03, 0xE0, 0x3C, 0x03, 0xC0, 0x78, 0x03,
|
||||
0xC0, 0xF0, 0x07, 0xC1, 0xE0, 0x07, 0xC3, 0xC0, 0x07, 0x87, 0x80, 0x0F,
|
||||
0x8F, 0x00, 0x0F, 0x9E, 0x00, 0x0F, 0xBC, 0x00, 0x0F, 0x80, 0xF0, 0x00,
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
|
||||
0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
|
||||
0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00,
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
|
||||
0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0x00, 0x00, 0x7F,
|
||||
0xF8, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFE,
|
||||
0xF0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFD, 0xC0, 0x00, 0x77, 0xFB,
|
||||
0xC0, 0x01, 0xEF, 0xF7, 0x80, 0x03, 0xDF, 0xE7, 0x00, 0x07, 0x3F, 0xCF,
|
||||
0x00, 0x1E, 0x7F, 0x9E, 0x00, 0x38, 0xFF, 0x1E, 0x00, 0xF1, 0xFE, 0x3C,
|
||||
0x01, 0xE3, 0xFC, 0x38, 0x03, 0x87, 0xF8, 0x78, 0x0F, 0x0F, 0xF0, 0xF0,
|
||||
0x1C, 0x1F, 0xE0, 0xE0, 0x38, 0x3F, 0xC1, 0xE0, 0xF0, 0x7F, 0x83, 0xC1,
|
||||
0xC0, 0xFF, 0x03, 0xC7, 0x81, 0xFE, 0x07, 0x8F, 0x03, 0xFC, 0x07, 0x1C,
|
||||
0x07, 0xF8, 0x0F, 0x78, 0x0F, 0xF0, 0x1E, 0xE0, 0x1F, 0xE0, 0x1F, 0xC0,
|
||||
0x3F, 0xC0, 0x3F, 0x80, 0x7F, 0x80, 0x7E, 0x00, 0xFF, 0x00, 0x7C, 0x01,
|
||||
0xFE, 0x00, 0xF8, 0x03, 0xFC, 0x00, 0xE0, 0x07, 0x80, 0xF8, 0x00, 0x07,
|
||||
0xFC, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00,
|
||||
0x7F, 0x78, 0x00, 0x3F, 0xBE, 0x00, 0x1F, 0xEF, 0x00, 0x0F, 0xF3, 0xC0,
|
||||
0x07, 0xF9, 0xF0, 0x03, 0xFC, 0x78, 0x01, 0xFE, 0x3E, 0x00, 0xFF, 0x0F,
|
||||
0x80, 0x7F, 0x83, 0xC0, 0x3F, 0xC1, 0xF0, 0x1F, 0xE0, 0x7C, 0x0F, 0xF0,
|
||||
0x1E, 0x07, 0xF8, 0x0F, 0x83, 0xFC, 0x03, 0xC1, 0xFE, 0x00, 0xF0, 0xFF,
|
||||
0x00, 0x7C, 0x7F, 0x80, 0x1E, 0x3F, 0xC0, 0x07, 0x9F, 0xE0, 0x03, 0xEF,
|
||||
0xF0, 0x00, 0xF7, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x07,
|
||||
0xFF, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x7F,
|
||||
0xE0, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xFE, 0x00, 0xFE, 0x07, 0xF0,
|
||||
0x1F, 0x00, 0x1F, 0x83, 0xE0, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC7, 0x80,
|
||||
0x00, 0x3C, 0x78, 0x00, 0x01, 0xEF, 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x01,
|
||||
0xEF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF,
|
||||
0x80, 0x00, 0x1E, 0x78, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x3E, 0x7C, 0x00,
|
||||
0x03, 0xC3, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x0F, 0x81, 0xFC, 0x03, 0xF0,
|
||||
0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xF0, 0x00, 0xFF,
|
||||
0xF0, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xF0, 0x07, 0xEF,
|
||||
0x00, 0x3E, 0xF0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, 0x07,
|
||||
0xCF, 0x03, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xE0, 0xFF, 0xF8, 0x0F, 0x00,
|
||||
0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F,
|
||||
0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xFF, 0x80,
|
||||
0x07, 0xFF, 0xFE, 0x00, 0xFE, 0x07, 0xF0, 0x1F, 0x00, 0x1F, 0x83, 0xE0,
|
||||
0x00, 0x78, 0x3C, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x3C, 0x78, 0x00, 0x01,
|
||||
0xEF, 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x1E, 0x78, 0x00,
|
||||
0x01, 0xE7, 0x80, 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xC3, 0xE0, 0x00, 0x7C,
|
||||
0x1F, 0x00, 0x0F, 0x81, 0xFC, 0x03, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x3F,
|
||||
0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8,
|
||||
0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xF0, 0x00,
|
||||
0x00, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x0F,
|
||||
0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0xF0, 0x07, 0xE3, 0xC0, 0x07, 0x8F, 0x00,
|
||||
0x1F, 0x3C, 0x00, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x0F,
|
||||
0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xE3, 0xC0, 0x0F, 0x8F, 0x00, 0xFC, 0x3F,
|
||||
0xFF, 0xE0, 0xFF, 0xFE, 0x03, 0xFF, 0xF0, 0x0F, 0x03, 0xC0, 0x3C, 0x07,
|
||||
0x80, 0xF0, 0x1F, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0x78, 0x3C, 0x01, 0xF0,
|
||||
0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0xF0,
|
||||
0x00, 0xFB, 0xC0, 0x01, 0xEF, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0x00, 0xFF,
|
||||
0xFE, 0x1F, 0xFF, 0xE3, 0xF0, 0x7C, 0x7C, 0x00, 0x47, 0x80, 0x00, 0x78,
|
||||
0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07,
|
||||
0xC0, 0x00, 0x3F, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01,
|
||||
0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x1E, 0x80, 0x03, 0xEF, 0x00, 0x7C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x7F,
|
||||
0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E,
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00,
|
||||
0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00,
|
||||
0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
|
||||
0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x0E, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x78,
|
||||
0x00, 0x3C, 0x7C, 0x00, 0x7C, 0x3F, 0x01, 0xF8, 0x1F, 0xFF, 0xF0, 0x0F,
|
||||
0xFF, 0xE0, 0x03, 0xFF, 0x80, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xE7,
|
||||
0x80, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x0F, 0x00, 0x03,
|
||||
0xC3, 0xC0, 0x00, 0xF0, 0x78, 0x00, 0x78, 0x1E, 0x00, 0x1E, 0x07, 0x80,
|
||||
0x0F, 0x80, 0xF0, 0x03, 0xC0, 0x3C, 0x00, 0xF0, 0x0F, 0x00, 0x78, 0x01,
|
||||
0xE0, 0x1E, 0x00, 0x78, 0x07, 0x80, 0x1E, 0x03, 0xC0, 0x03, 0xC0, 0xF0,
|
||||
0x00, 0xF0, 0x3C, 0x00, 0x1C, 0x1E, 0x00, 0x07, 0x87, 0x80, 0x01, 0xE1,
|
||||
0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x0F, 0x3C, 0x00, 0x03, 0xCF, 0x00, 0x00,
|
||||
0x77, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00,
|
||||
0x00, 0x3F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0xF0, 0x00,
|
||||
0x78, 0x00, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x7B, 0xC0, 0x03, 0xF0, 0x00,
|
||||
0xF7, 0x80, 0x07, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0xC0, 0x07, 0x8F, 0x00,
|
||||
0x3F, 0x80, 0x0F, 0x1E, 0x00, 0x7F, 0x80, 0x1E, 0x3C, 0x00, 0xEF, 0x00,
|
||||
0x3C, 0x3C, 0x03, 0xCE, 0x00, 0xF0, 0x78, 0x07, 0x9E, 0x01, 0xE0, 0xF0,
|
||||
0x0F, 0x3C, 0x03, 0xC0, 0xE0, 0x1C, 0x38, 0x07, 0x81, 0xE0, 0x78, 0x78,
|
||||
0x1E, 0x03, 0xC0, 0xF0, 0xF0, 0x3C, 0x07, 0x81, 0xC1, 0xE0, 0x78, 0x07,
|
||||
0x07, 0x81, 0xE0, 0xE0, 0x0F, 0x0F, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x07,
|
||||
0x87, 0x80, 0x3C, 0x38, 0x07, 0x0F, 0x00, 0x38, 0xF0, 0x0F, 0x1C, 0x00,
|
||||
0x79, 0xE0, 0x1E, 0x78, 0x00, 0xF3, 0x80, 0x1C, 0xF0, 0x01, 0xEF, 0x00,
|
||||
0x39, 0xE0, 0x01, 0xDE, 0x00, 0x7B, 0x80, 0x03, 0xF8, 0x00, 0xFF, 0x00,
|
||||
0x07, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x0F, 0xC0,
|
||||
0x03, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
|
||||
0x00, 0x3C, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x0F, 0x1E, 0x00, 0x0F,
|
||||
0x8F, 0x80, 0x07, 0x83, 0xC0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x03,
|
||||
0xC0, 0x1E, 0x03, 0xC0, 0x07, 0x81, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1,
|
||||
0xE0, 0x00, 0x7C, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03,
|
||||
0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x3F, 0x80, 0x00, 0x3D, 0xE0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, 0x00,
|
||||
0x1E, 0x0F, 0x00, 0x0F, 0x03, 0xC0, 0x0F, 0x01, 0xE0, 0x0F, 0x00, 0x78,
|
||||
0x07, 0x80, 0x3E, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x03, 0xC3, 0xC0, 0x01,
|
||||
0xE3, 0xC0, 0x00, 0x7B, 0xE0, 0x00, 0x3E, 0xF0, 0x00, 0x0F, 0x78, 0x00,
|
||||
0x0F, 0x78, 0x00, 0x1E, 0x3C, 0x00, 0x3E, 0x3C, 0x00, 0x3C, 0x1E, 0x00,
|
||||
0x7C, 0x1F, 0x00, 0x78, 0x0F, 0x00, 0xF0, 0x0F, 0x80, 0xF0, 0x07, 0x81,
|
||||
0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC3, 0xC0, 0x01, 0xE3, 0xC0, 0x01, 0xE7,
|
||||
0x80, 0x00, 0xF7, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
|
||||
0x00, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00,
|
||||
0xF8, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00,
|
||||
0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xF0,
|
||||
0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07,
|
||||
0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00,
|
||||
0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
|
||||
0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
|
||||
0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
|
||||
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0x38, 0x00, 0x3C, 0x00,
|
||||
0x3C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0F, 0x00,
|
||||
0x07, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0x80, 0x03, 0xC0, 0x03, 0xC0,
|
||||
0x01, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x70,
|
||||
0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E,
|
||||
0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0,
|
||||
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
|
||||
0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
|
||||
0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3F,
|
||||
0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x60, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00,
|
||||
0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xCE, 0x00, 0x0E, 0x70, 0x00, 0xE1,
|
||||
0xC0, 0x07, 0x0E, 0x00, 0x70, 0x38, 0x03, 0x81, 0xC0, 0x3C, 0x07, 0x01,
|
||||
0xC0, 0x38, 0x1E, 0x00, 0xE0, 0xE0, 0x07, 0x0F, 0x00, 0x1C, 0x70, 0x00,
|
||||
0xE3, 0x80, 0x03, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xF0, 0xF8, 0x7C, 0x3C, 0x1E, 0x0F, 0x07,
|
||||
0x07, 0xFE, 0x03, 0xFF, 0xF0, 0x7F, 0xFF, 0x0E, 0x03, 0xE0, 0x00, 0x3C,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x1F, 0xFC,
|
||||
0x3F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x1E, 0xF0, 0x03, 0xFC, 0x00, 0x7F,
|
||||
0x80, 0x0F, 0xF0, 0x03, 0xFE, 0x00, 0x7F, 0xC0, 0x1F, 0xFC, 0x07, 0xF7,
|
||||
0xFF, 0xDE, 0x7F, 0xF1, 0xC7, 0xFC, 0x38, 0xE0, 0x00, 0x0E, 0x00, 0x00,
|
||||
0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE3, 0xFE, 0x0E, 0x7F,
|
||||
0xF0, 0xEF, 0xFF, 0xCF, 0xC0, 0x7C, 0xF8, 0x03, 0xEF, 0x00, 0x1E, 0xF0,
|
||||
0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
|
||||
0xF0, 0x01, 0xFF, 0x80, 0x1E, 0xF8, 0x03, 0xEF, 0xC0, 0x7C, 0xEF, 0xFF,
|
||||
0x8E, 0x7F, 0xF0, 0xE3, 0xFE, 0x00, 0x00, 0x10, 0x01, 0xFF, 0xC3, 0xFF,
|
||||
0xE3, 0xFF, 0xF3, 0xF0, 0x11, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78,
|
||||
0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03,
|
||||
0xC0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80,
|
||||
0x03, 0xF0, 0x18, 0xFF, 0xFC, 0x3F, 0xFE, 0x07, 0xFE, 0x00, 0x00, 0x78,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00,
|
||||
0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x03, 0x03, 0xC1,
|
||||
0xFF, 0x1E, 0x1F, 0xFE, 0xF1, 0xFF, 0xFF, 0x9F, 0x01, 0xFC, 0xF0, 0x07,
|
||||
0xEF, 0x80, 0x1F, 0x78, 0x00, 0xFB, 0xC0, 0x03, 0xDE, 0x00, 0x1F, 0xE0,
|
||||
0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F,
|
||||
0x78, 0x00, 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x3E, 0xF8, 0x01, 0xF3, 0xC0,
|
||||
0x1F, 0x9F, 0x01, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xEF, 0x03, 0xFC, 0x38,
|
||||
0x00, 0x20, 0x00, 0x3F, 0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x1E, 0x03,
|
||||
0xC3, 0xC0, 0x1E, 0x78, 0x01, 0xE7, 0x80, 0x0F, 0x78, 0x00, 0xF7, 0x00,
|
||||
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0,
|
||||
0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x00, 0x03,
|
||||
0xE0, 0x00, 0x1F, 0x00, 0x61, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xFC,
|
||||
0x00, 0xFE, 0x03, 0xFF, 0x07, 0xFE, 0x07, 0xC2, 0x0F, 0x00, 0x0F, 0x00,
|
||||
0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x7F, 0xF8, 0xFF, 0xF8,
|
||||
0xFF, 0xF8, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||
0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||
0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
|
||||
0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xE1, 0xC3,
|
||||
0xFF, 0xCE, 0x3F, 0xFF, 0xF3, 0xE0, 0x3F, 0x9E, 0x00, 0xFD, 0xF0, 0x03,
|
||||
0xEF, 0x00, 0x1F, 0x78, 0x00, 0x7B, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xE0,
|
||||
0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, 0x01, 0xEF, 0x00, 0x0F,
|
||||
0x78, 0x00, 0x7B, 0xC0, 0x03, 0xDF, 0x00, 0x3E, 0x78, 0x03, 0xF3, 0xE0,
|
||||
0x3F, 0x8F, 0xFF, 0xFC, 0x3F, 0xFD, 0xE0, 0x7F, 0x8F, 0x00, 0x00, 0x78,
|
||||
0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x10, 0x00,
|
||||
0xF8, 0xE0, 0x0F, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xC0, 0x7F, 0xF8, 0x00,
|
||||
0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01,
|
||||
0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03,
|
||||
0x8F, 0xFC, 0x73, 0xFF, 0xCE, 0xFF, 0xFD, 0xF8, 0x0F, 0xBE, 0x00, 0xFF,
|
||||
0xC0, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFE,
|
||||
0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC,
|
||||
0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xE0, 0x33, 0xFF, 0xF7, 0x00, 0x00,
|
||||
0x03, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C,
|
||||
0xE7, 0x39, 0xCE, 0x01, 0x80, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03,
|
||||
0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||
0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E,
|
||||
0x03, 0x81, 0xE0, 0x7B, 0xFE, 0xFF, 0x3F, 0x80, 0xE0, 0x00, 0x1C, 0x00,
|
||||
0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00,
|
||||
0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x1F, 0x70, 0x07,
|
||||
0x8E, 0x01, 0xF1, 0xC0, 0x7C, 0x38, 0x1F, 0x07, 0x07, 0xC0, 0xE1, 0xF0,
|
||||
0x1C, 0x7C, 0x03, 0x9F, 0x00, 0x73, 0xC0, 0x0E, 0xF8, 0x01, 0xFF, 0x80,
|
||||
0x3F, 0xF8, 0x07, 0xCF, 0x00, 0xE0, 0xF0, 0x1C, 0x1F, 0x03, 0x81, 0xF0,
|
||||
0x70, 0x1E, 0x0E, 0x01, 0xE1, 0xC0, 0x3E, 0x38, 0x03, 0xE7, 0x00, 0x3C,
|
||||
0xE0, 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x71, 0xFF, 0x03, 0xFE,
|
||||
0x39, 0xFF, 0xC7, 0xFF, 0x9D, 0xFF, 0xF7, 0xFF, 0xEF, 0xC0, 0x7F, 0x81,
|
||||
0xF7, 0xC0, 0x3F, 0x80, 0x7B, 0xC0, 0x0F, 0x80, 0x1F, 0xE0, 0x07, 0xC0,
|
||||
0x0F, 0xF0, 0x03, 0xC0, 0x07, 0xF8, 0x01, 0xE0, 0x03, 0xFC, 0x00, 0xF0,
|
||||
0x01, 0xFC, 0x00, 0x78, 0x00, 0xFE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x1E,
|
||||
0x00, 0x3F, 0x80, 0x0F, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0x0F, 0xE0, 0x03,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xE0, 0x03, 0xF8, 0x00, 0xF0, 0x01, 0xFC, 0x00,
|
||||
0x78, 0x00, 0xFE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x1E, 0x00, 0x3F, 0x80,
|
||||
0x0F, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x30, 0x1C, 0x7F, 0xE3,
|
||||
0x9F, 0xFE, 0x77, 0xFF, 0xEF, 0xC0, 0x7D, 0xF0, 0x07, 0xFC, 0x00, 0x7F,
|
||||
0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF0, 0x00, 0xFE,
|
||||
0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC,
|
||||
0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFC,
|
||||
0x07, 0xFF, 0xF8, 0x3E, 0x03, 0xE0, 0xF0, 0x03, 0xC7, 0xC0, 0x0F, 0x9E,
|
||||
0x00, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x00, 0xEF, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xDE, 0x00, 0x0E,
|
||||
0x78, 0x00, 0x79, 0xE0, 0x01, 0xE3, 0xC0, 0x0F, 0x8F, 0x00, 0x3C, 0x1F,
|
||||
0x03, 0xE0, 0x3F, 0xFF, 0x80, 0x7F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x20,
|
||||
0x0E, 0x3F, 0xE0, 0xE7, 0xFF, 0x8E, 0xFF, 0xFC, 0xFC, 0x07, 0xCF, 0x80,
|
||||
0x3E, 0xF0, 0x01, 0xEF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0xFF,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x1E, 0xF8, 0x01, 0xEF, 0x80, 0x3E,
|
||||
0xFE, 0x07, 0xCE, 0xFF, 0xF8, 0xE7, 0xFF, 0x0E, 0x3F, 0xE0, 0xE0, 0x00,
|
||||
0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00,
|
||||
0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x00,
|
||||
0x60, 0x00, 0x1F, 0xE1, 0xC3, 0xFF, 0xCE, 0x3F, 0xFF, 0xF3, 0xE0, 0x3F,
|
||||
0x9E, 0x00, 0xFD, 0xF0, 0x03, 0xEF, 0x00, 0x1F, 0x78, 0x00, 0x7B, 0xC0,
|
||||
0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F,
|
||||
0xC0, 0x01, 0xEF, 0x00, 0x0F, 0x78, 0x00, 0x7B, 0xC0, 0x07, 0xDF, 0x00,
|
||||
0x3E, 0x78, 0x03, 0xF3, 0xE0, 0x3F, 0x8F, 0xFF, 0xFC, 0x3F, 0xFD, 0xE0,
|
||||
0x7F, 0x8F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00,
|
||||
0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00,
|
||||
0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x27, 0x0F, 0xF9, 0xFF, 0xDF, 0xFE,
|
||||
0xF0, 0x7E, 0x03, 0xE0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0,
|
||||
0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01,
|
||||
0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x00, 0xC0, 0x07, 0xFF,
|
||||
0x0F, 0xFF, 0xCF, 0xFF, 0xE7, 0x80, 0x67, 0x80, 0x03, 0xC0, 0x01, 0xE0,
|
||||
0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x03, 0xFE, 0x00, 0x7F, 0xC0,
|
||||
0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01,
|
||||
0xE0, 0x00, 0xEE, 0x00, 0xF7, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xF0, 0x0E,
|
||||
0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0xFF, 0xEF, 0xFF, 0xBF,
|
||||
0xFE, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01,
|
||||
0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
|
||||
0x78, 0x01, 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xF0, 0x7F, 0xC0, 0xFF,
|
||||
0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xF7, 0x80, 0x1F, 0x78, 0x03, 0xF7,
|
||||
0xC0, 0x7F, 0x3F, 0xFF, 0xF1, 0xFF, 0xE7, 0x0F, 0xF8, 0x70, 0xF0, 0x00,
|
||||
0x3D, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x3C, 0x00, 0xF0,
|
||||
0xF0, 0x03, 0xC1, 0xC0, 0x1E, 0x07, 0x80, 0x78, 0x1E, 0x01, 0xE0, 0x3C,
|
||||
0x0F, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0xE0, 0x07, 0x87, 0x80, 0x1E, 0x1E,
|
||||
0x00, 0x38, 0x70, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x07, 0x38, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x07,
|
||||
0x80, 0x00, 0xF8, 0x01, 0xE0, 0x07, 0xBC, 0x01, 0xF8, 0x03, 0xDE, 0x00,
|
||||
0xFC, 0x01, 0xEF, 0x00, 0x7E, 0x00, 0xE3, 0xC0, 0x7F, 0x00, 0xF1, 0xE0,
|
||||
0x3B, 0xC0, 0x78, 0xF0, 0x1C, 0xE0, 0x3C, 0x38, 0x1E, 0x70, 0x1C, 0x1E,
|
||||
0x0F, 0x3C, 0x1E, 0x0F, 0x07, 0x1E, 0x0F, 0x07, 0x83, 0x87, 0x07, 0x01,
|
||||
0xC3, 0xC3, 0xC7, 0x80, 0xF1, 0xC1, 0xE3, 0xC0, 0x78, 0xE0, 0x71, 0xE0,
|
||||
0x3C, 0xF0, 0x38, 0xE0, 0x0E, 0x70, 0x1E, 0xF0, 0x07, 0xB8, 0x07, 0x78,
|
||||
0x03, 0xDC, 0x03, 0xBC, 0x00, 0xFE, 0x01, 0xDC, 0x00, 0x7E, 0x00, 0xFE,
|
||||
0x00, 0x3F, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x1F, 0x00, 0x07, 0x80, 0x0F,
|
||||
0x80, 0xF8, 0x00, 0xFB, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x3C, 0x07, 0x81,
|
||||
0xF0, 0x78, 0x07, 0x83, 0xC0, 0x1E, 0x3C, 0x00, 0x7B, 0xC0, 0x03, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xC0, 0x01,
|
||||
0xFE, 0x00, 0x0F, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x8F, 0x00, 0x78, 0x3C,
|
||||
0x07, 0x80, 0xF0, 0x78, 0x07, 0xC3, 0xC0, 0x1E, 0x3C, 0x00, 0x7B, 0xC0,
|
||||
0x03, 0xE0, 0xF0, 0x00, 0x3D, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0x9E, 0x00,
|
||||
0x1E, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC1, 0xE0, 0x1E, 0x07, 0x80, 0x78,
|
||||
0x1E, 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0xF0, 0x3C, 0x01, 0xC0, 0xF0, 0x07,
|
||||
0x87, 0x80, 0x0E, 0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF3, 0xC0, 0x01, 0xCF,
|
||||
0x00, 0x07, 0xB8, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00,
|
||||
0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00,
|
||||
0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x7F,
|
||||
0xFF, 0xBF, 0xFF, 0xC0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xF0,
|
||||
0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78,
|
||||
0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x1E,
|
||||
0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x1C,
|
||||
0x01, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x01, 0xE0,
|
||||
0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||
0x01, 0xE0, 0x0F, 0x83, 0xFC, 0x0F, 0xC0, 0x3F, 0x00, 0xFF, 0x00, 0x3E,
|
||||
0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07,
|
||||
0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3F, 0x80,
|
||||
0x7F, 0x00, 0xFC, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x03,
|
||||
0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x01, 0xE0,
|
||||
0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||
0x01, 0xE0, 0x03, 0xC0, 0x07, 0xF0, 0x0F, 0xC0, 0x1F, 0x01, 0xFC, 0x0F,
|
||||
0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07,
|
||||
0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x07, 0xF0, 0x3F,
|
||||
0x80, 0xFC, 0x03, 0x80, 0x00, 0x1F, 0x80, 0x17, 0xFE, 0x01, 0xFF, 0xFE,
|
||||
0xFE, 0x0F, 0xFF, 0xC0, 0x3F, 0xE8, 0x00, 0x78 };
|
||||
|
||||
const GFXglyph NotoSans_Regular22pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 5, 32, 12, 3, -30 }, // 0x21 '!'
|
||||
{ 21, 12, 11, 18, 3, -30 }, // 0x22 '"'
|
||||
{ 38, 26, 31, 28, 1, -30 }, // 0x23 '#'
|
||||
{ 139, 19, 36, 25, 3, -32 }, // 0x24 '$'
|
||||
{ 225, 32, 31, 36, 2, -30 }, // 0x25 '%'
|
||||
{ 349, 29, 31, 32, 2, -30 }, // 0x26 '&'
|
||||
{ 462, 4, 11, 10, 3, -30 }, // 0x27 '''
|
||||
{ 468, 10, 38, 13, 2, -30 }, // 0x28 '('
|
||||
{ 516, 10, 38, 13, 1, -30 }, // 0x29 ')'
|
||||
{ 564, 20, 20, 24, 2, -32 }, // 0x2A '*'
|
||||
{ 614, 20, 21, 25, 2, -25 }, // 0x2B '+'
|
||||
{ 667, 6, 11, 12, 2, -4 }, // 0x2C ','
|
||||
{ 676, 10, 3, 14, 2, -12 }, // 0x2D '-'
|
||||
{ 680, 5, 6, 12, 3, -4 }, // 0x2E '.'
|
||||
{ 684, 16, 31, 16, 0, -30 }, // 0x2F '/'
|
||||
{ 746, 21, 31, 25, 2, -30 }, // 0x30 '0'
|
||||
{ 828, 11, 31, 25, 4, -30 }, // 0x31 '1'
|
||||
{ 871, 20, 31, 25, 2, -30 }, // 0x32 '2'
|
||||
{ 949, 20, 31, 25, 2, -30 }, // 0x33 '3'
|
||||
{ 1027, 23, 31, 25, 1, -30 }, // 0x34 '4'
|
||||
{ 1117, 19, 31, 25, 3, -30 }, // 0x35 '5'
|
||||
{ 1191, 21, 31, 25, 2, -30 }, // 0x36 '6'
|
||||
{ 1273, 21, 31, 25, 2, -30 }, // 0x37 '7'
|
||||
{ 1355, 20, 31, 25, 2, -30 }, // 0x38 '8'
|
||||
{ 1433, 20, 31, 25, 2, -30 }, // 0x39 '9'
|
||||
{ 1511, 5, 25, 12, 3, -23 }, // 0x3A ':'
|
||||
{ 1527, 7, 30, 12, 1, -23 }, // 0x3B ';'
|
||||
{ 1554, 20, 21, 25, 2, -25 }, // 0x3C '<'
|
||||
{ 1607, 20, 12, 25, 2, -20 }, // 0x3D '='
|
||||
{ 1637, 20, 21, 25, 2, -25 }, // 0x3E '>'
|
||||
{ 1690, 17, 32, 19, 1, -30 }, // 0x3F '?'
|
||||
{ 1758, 34, 35, 39, 2, -30 }, // 0x40 '@'
|
||||
{ 1907, 27, 31, 28, 0, -30 }, // 0x41 'A'
|
||||
{ 2012, 22, 31, 28, 4, -30 }, // 0x42 'B'
|
||||
{ 2098, 23, 31, 27, 3, -30 }, // 0x43 'C'
|
||||
{ 2188, 25, 31, 31, 4, -30 }, // 0x44 'D'
|
||||
{ 2285, 17, 31, 24, 4, -30 }, // 0x45 'E'
|
||||
{ 2351, 17, 31, 22, 4, -30 }, // 0x46 'F'
|
||||
{ 2417, 25, 31, 31, 3, -30 }, // 0x47 'G'
|
||||
{ 2514, 24, 31, 32, 4, -30 }, // 0x48 'H'
|
||||
{ 2607, 11, 31, 15, 2, -30 }, // 0x49 'I'
|
||||
{ 2650, 11, 39, 12, -3, -30 }, // 0x4A 'J'
|
||||
{ 2704, 23, 31, 27, 4, -30 }, // 0x4B 'K'
|
||||
{ 2794, 18, 31, 23, 4, -30 }, // 0x4C 'L'
|
||||
{ 2864, 31, 31, 39, 4, -30 }, // 0x4D 'M'
|
||||
{ 2985, 25, 31, 33, 4, -30 }, // 0x4E 'N'
|
||||
{ 3082, 28, 31, 34, 3, -30 }, // 0x4F 'O'
|
||||
{ 3191, 20, 31, 26, 4, -30 }, // 0x50 'P'
|
||||
{ 3269, 28, 38, 34, 3, -30 }, // 0x51 'Q'
|
||||
{ 3402, 22, 31, 27, 4, -30 }, // 0x52 'R'
|
||||
{ 3488, 20, 31, 24, 2, -30 }, // 0x53 'S'
|
||||
{ 3566, 23, 31, 24, 0, -30 }, // 0x54 'T'
|
||||
{ 3656, 24, 31, 31, 4, -30 }, // 0x55 'U'
|
||||
{ 3749, 26, 31, 26, 0, -30 }, // 0x56 'V'
|
||||
{ 3850, 39, 31, 40, 1, -30 }, // 0x57 'W'
|
||||
{ 4002, 25, 31, 25, 0, -30 }, // 0x58 'X'
|
||||
{ 4099, 24, 31, 24, 0, -30 }, // 0x59 'Y'
|
||||
{ 4192, 21, 31, 25, 2, -30 }, // 0x5A 'Z'
|
||||
{ 4274, 10, 38, 14, 3, -30 }, // 0x5B '['
|
||||
{ 4322, 16, 31, 16, 0, -30 }, // 0x5C '\'
|
||||
{ 4384, 10, 38, 14, 1, -30 }, // 0x5D ']'
|
||||
{ 4432, 21, 20, 25, 2, -30 }, // 0x5E '^'
|
||||
{ 4485, 19, 3, 19, 0, 5 }, // 0x5F '_'
|
||||
{ 4493, 8, 7, 12, 2, -32 }, // 0x60 '`'
|
||||
{ 4500, 19, 23, 24, 2, -22 }, // 0x61 'a'
|
||||
{ 4555, 20, 33, 27, 4, -32 }, // 0x62 'b'
|
||||
{ 4638, 17, 24, 21, 2, -23 }, // 0x63 'c'
|
||||
{ 4689, 21, 33, 27, 2, -32 }, // 0x64 'd'
|
||||
{ 4776, 20, 24, 24, 2, -23 }, // 0x65 'e'
|
||||
{ 4836, 16, 33, 15, 1, -32 }, // 0x66 'f'
|
||||
{ 4902, 21, 34, 27, 2, -23 }, // 0x67 'g'
|
||||
{ 4992, 19, 33, 27, 4, -32 }, // 0x68 'h'
|
||||
{ 5071, 5, 32, 11, 3, -31 }, // 0x69 'i'
|
||||
{ 5091, 10, 42, 11, -2, -31 }, // 0x6A 'j'
|
||||
{ 5144, 19, 33, 23, 4, -32 }, // 0x6B 'k'
|
||||
{ 5223, 3, 33, 11, 4, -32 }, // 0x6C 'l'
|
||||
{ 5236, 33, 24, 40, 4, -23 }, // 0x6D 'm'
|
||||
{ 5335, 19, 24, 27, 4, -23 }, // 0x6E 'n'
|
||||
{ 5392, 22, 24, 26, 2, -23 }, // 0x6F 'o'
|
||||
{ 5458, 20, 34, 27, 4, -23 }, // 0x70 'p'
|
||||
{ 5543, 21, 34, 27, 2, -23 }, // 0x71 'q'
|
||||
{ 5633, 13, 24, 18, 4, -23 }, // 0x72 'r'
|
||||
{ 5672, 17, 24, 21, 2, -23 }, // 0x73 's'
|
||||
{ 5723, 14, 28, 16, 1, -27 }, // 0x74 't'
|
||||
{ 5772, 20, 23, 27, 3, -22 }, // 0x75 'u'
|
||||
{ 5830, 22, 23, 22, 0, -22 }, // 0x76 'v'
|
||||
{ 5894, 33, 23, 34, 0, -22 }, // 0x77 'w'
|
||||
{ 5989, 21, 23, 23, 1, -22 }, // 0x78 'x'
|
||||
{ 6050, 22, 33, 22, 0, -22 }, // 0x79 'y'
|
||||
{ 6141, 17, 23, 20, 2, -22 }, // 0x7A 'z'
|
||||
{ 6190, 14, 38, 16, 1, -30 }, // 0x7B '{'
|
||||
{ 6257, 3, 43, 24, 10, -32 }, // 0x7C '|'
|
||||
{ 6274, 14, 38, 16, 1, -30 }, // 0x7D '}'
|
||||
{ 6341, 20, 6, 25, 2, -17 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular22pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular22pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular22pt7bGlyphs,
|
||||
0x20, 0x7E, 59 };
|
||||
|
||||
// Approx. 7028 bytes
|
||||
|
||||
#endif // NOTOSANS22PT7B_H
|
||||
@@ -0,0 +1,166 @@
|
||||
#ifndef NOTOSANS7PT7B_H
|
||||
#define NOTOSANS7PT7B_H
|
||||
const uint8_t NotoSans_Regular7pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFA, 0xA8, 0xB0, 0xBB, 0x99, 0x12, 0x09, 0x04, 0x8F, 0xF1, 0x41,
|
||||
0x23, 0xFC, 0x48, 0x24, 0x16, 0x00, 0x21, 0xFA, 0x28, 0xE0, 0xE2, 0x49,
|
||||
0xF8, 0x82, 0x00, 0xE1, 0x2C, 0x89, 0x22, 0x50, 0x97, 0xBA, 0xB1, 0x24,
|
||||
0x49, 0x22, 0x58, 0xE0, 0x78, 0x24, 0x13, 0x09, 0x03, 0x02, 0x8A, 0x25,
|
||||
0x0C, 0x86, 0x3C, 0xC0, 0xF0, 0x6A, 0x49, 0x24, 0x93, 0x30, 0xC4, 0x22,
|
||||
0x23, 0x32, 0x22, 0x6C, 0x22, 0x9F, 0xCC, 0x5B, 0x20, 0x20, 0x82, 0x3F,
|
||||
0x20, 0x80, 0xEA, 0xE0, 0xB0, 0x08, 0x84, 0x22, 0x11, 0x88, 0x44, 0x00,
|
||||
0x7B, 0x28, 0x61, 0x86, 0x18, 0x61, 0xCD, 0xE0, 0x37, 0xD1, 0x11, 0x11,
|
||||
0x11, 0x7A, 0x20, 0xC3, 0x08, 0x43, 0x18, 0xC3, 0xF0, 0x7A, 0x30, 0x43,
|
||||
0x78, 0x60, 0x41, 0x8F, 0xE0, 0x04, 0x0C, 0x14, 0x14, 0x24, 0x44, 0xC4,
|
||||
0xFF, 0x04, 0x04, 0xFA, 0x08, 0x20, 0xF8, 0x30, 0x41, 0x8F, 0xE0, 0x39,
|
||||
0x0C, 0x20, 0xFA, 0x18, 0x61, 0xC5, 0xE0, 0xFC, 0x10, 0xC2, 0x18, 0x43,
|
||||
0x08, 0x21, 0x00, 0x7B, 0x38, 0x73, 0x79, 0x68, 0x61, 0x85, 0xE0, 0x73,
|
||||
0x28, 0x61, 0x87, 0xF0, 0x43, 0x0B, 0xC0, 0xB0, 0x0B, 0x4C, 0x00, 0x1A,
|
||||
0x50, 0x0C, 0xEC, 0x30, 0x30, 0x30, 0xFC, 0x00, 0x3F, 0x81, 0x81, 0x83,
|
||||
0x33, 0x00, 0x7A, 0x20, 0xC2, 0x18, 0xC2, 0x00, 0x20, 0x80, 0x0E, 0x06,
|
||||
0x31, 0x01, 0x47, 0xA9, 0x23, 0x24, 0x64, 0x94, 0xBA, 0x88, 0x88, 0x00,
|
||||
0xFC, 0x00, 0x08, 0x0C, 0x05, 0x02, 0x82, 0x61, 0x11, 0xF8, 0x82, 0x41,
|
||||
0x40, 0xC0, 0xF9, 0x8F, 0x0E, 0x3F, 0xD9, 0xB0, 0xE1, 0xC7, 0xF8, 0x3E,
|
||||
0xC7, 0x04, 0x08, 0x10, 0x20, 0x60, 0x60, 0x7C, 0xF8, 0xC6, 0xC3, 0xC1,
|
||||
0xC1, 0xC1, 0xC1, 0xC3, 0xC6, 0xFC, 0xFF, 0x0C, 0x30, 0xFF, 0x0C, 0x30,
|
||||
0xC3, 0xF0, 0xFF, 0x0C, 0x30, 0xC3, 0xFC, 0x30, 0xC3, 0x00, 0x1E, 0x61,
|
||||
0xC0, 0x80, 0x80, 0x87, 0x81, 0xC1, 0x61, 0x3F, 0xC1, 0xC1, 0xC1, 0xC1,
|
||||
0xFF, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xE9, 0x24, 0x92, 0x5C, 0x33, 0x33,
|
||||
0x33, 0x33, 0x33, 0x2E, 0xC0, 0xC3, 0x8B, 0x26, 0x8E, 0x1A, 0x36, 0x66,
|
||||
0xC5, 0x84, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0xF0, 0xC0, 0xF8,
|
||||
0x3A, 0x1E, 0x85, 0x91, 0x64, 0x99, 0xA6, 0x29, 0x8C, 0x63, 0x10, 0xC1,
|
||||
0xE1, 0xA1, 0xB1, 0x99, 0x89, 0x8D, 0x85, 0x83, 0x83, 0x3E, 0x31, 0xB0,
|
||||
0x50, 0x38, 0x0C, 0x06, 0x07, 0x82, 0x43, 0x1F, 0x00, 0xF9, 0x9B, 0x1E,
|
||||
0x3C, 0x5F, 0x30, 0x60, 0xC1, 0x80, 0x3E, 0x31, 0xB0, 0x50, 0x38, 0x0C,
|
||||
0x06, 0x07, 0x82, 0x43, 0x1F, 0x01, 0x80, 0x60, 0xF9, 0x9B, 0x1E, 0x3C,
|
||||
0x5F, 0x32, 0x66, 0xC5, 0x84, 0x7B, 0x18, 0x20, 0x60, 0xE0, 0xC1, 0x8F,
|
||||
0xE0, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x81, 0x81,
|
||||
0x81, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x42, 0x3C, 0x81, 0xC3, 0x42, 0x42,
|
||||
0x26, 0x24, 0x34, 0x1C, 0x18, 0x18, 0xC2, 0x1A, 0x30, 0x91, 0x44, 0x8A,
|
||||
0x66, 0xD2, 0x14, 0xD0, 0xA2, 0x85, 0x1C, 0x30, 0xC0, 0x82, 0x00, 0xC3,
|
||||
0x42, 0x24, 0x3C, 0x18, 0x18, 0x3C, 0x24, 0x42, 0xC3, 0x83, 0x42, 0x66,
|
||||
0x24, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFC, 0x10, 0x86, 0x10, 0x86,
|
||||
0x10, 0x83, 0xF0, 0xF2, 0x49, 0x24, 0x92, 0x70, 0x82, 0x10, 0xC2, 0x10,
|
||||
0xC2, 0x10, 0x40, 0xE4, 0x92, 0x49, 0x24, 0xF0, 0x20, 0xC5, 0x12, 0x8A,
|
||||
0x10, 0xFC, 0xB4, 0xF8, 0x30, 0xFF, 0x8E, 0x3F, 0x40, 0x81, 0x02, 0x07,
|
||||
0xEC, 0x50, 0xE1, 0xC3, 0xC5, 0x78, 0x7C, 0x21, 0x08, 0x61, 0xE0, 0x04,
|
||||
0x10, 0x5F, 0x86, 0x18, 0x61, 0xC5, 0xF0, 0x7A, 0x18, 0x7F, 0x83, 0x07,
|
||||
0xC0, 0x39, 0x19, 0xF6, 0x31, 0x8C, 0x63, 0x00, 0x7E, 0x18, 0x61, 0x87,
|
||||
0x17, 0xC1, 0x07, 0xE0, 0x82, 0x08, 0x2F, 0xC6, 0x18, 0x61, 0x86, 0x10,
|
||||
0x9F, 0xC0, 0x20, 0x12, 0x49, 0x24, 0x9E, 0x82, 0x08, 0x62, 0x92, 0x8F,
|
||||
0x24, 0x8A, 0x30, 0xFF, 0xC0, 0xFF, 0xD8, 0x8E, 0x10, 0xC2, 0x18, 0x43,
|
||||
0x08, 0x61, 0x08, 0xFF, 0x18, 0x61, 0x86, 0x18, 0x40, 0x7D, 0x0A, 0x14,
|
||||
0x38, 0x58, 0x9E, 0x00, 0xFD, 0x8A, 0x1C, 0x38, 0x78, 0xAF, 0x40, 0x81,
|
||||
0x00, 0x7E, 0x18, 0x61, 0x87, 0x17, 0xC1, 0x04, 0x10, 0xBC, 0x88, 0x88,
|
||||
0x80, 0xFC, 0x30, 0x60, 0x87, 0xC0, 0x22, 0x3E, 0x84, 0x21, 0x0C, 0x38,
|
||||
0x86, 0x18, 0x61, 0x87, 0x17, 0xC0, 0xC6, 0x89, 0x13, 0x62, 0x85, 0x04,
|
||||
0x00, 0xCC, 0x69, 0x49, 0x29, 0x25, 0x67, 0x38, 0x63, 0x0C, 0x60, 0xC6,
|
||||
0x58, 0xE0, 0xC2, 0x8C, 0xB1, 0x80, 0xC6, 0x89, 0x11, 0x62, 0x85, 0x04,
|
||||
0x08, 0x31, 0xC0, 0xF8, 0x88, 0xC4, 0x43, 0xE0, 0x19, 0x88, 0x42, 0x33,
|
||||
0x84, 0x21, 0x08, 0x30, 0xFF, 0xF8, 0xC1, 0x08, 0x42, 0x18, 0x64, 0x21,
|
||||
0x09, 0xC0, 0xE6, 0xF0 };
|
||||
|
||||
const GFXglyph NotoSans_Regular7pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 10, 4, 1, -9 }, // 0x21 '!'
|
||||
{ 4, 4, 4, 6, 1, -9 }, // 0x22 '"'
|
||||
{ 6, 9, 10, 9, 0, -9 }, // 0x23 '#'
|
||||
{ 18, 6, 11, 8, 1, -9 }, // 0x24 '$'
|
||||
{ 27, 10, 10, 11, 1, -9 }, // 0x25 '%'
|
||||
{ 40, 9, 10, 10, 1, -9 }, // 0x26 '&'
|
||||
{ 52, 1, 4, 3, 1, -9 }, // 0x27 '''
|
||||
{ 53, 3, 12, 4, 1, -9 }, // 0x28 '('
|
||||
{ 58, 4, 12, 4, 0, -9 }, // 0x29 ')'
|
||||
{ 64, 6, 6, 8, 1, -9 }, // 0x2A '*'
|
||||
{ 69, 6, 6, 8, 1, -7 }, // 0x2B '+'
|
||||
{ 74, 2, 4, 4, 1, -1 }, // 0x2C ','
|
||||
{ 75, 3, 1, 4, 1, -3 }, // 0x2D '-'
|
||||
{ 76, 2, 2, 4, 1, -1 }, // 0x2E '.'
|
||||
{ 77, 5, 10, 5, 0, -9 }, // 0x2F '/'
|
||||
{ 84, 6, 10, 8, 1, -9 }, // 0x30 '0'
|
||||
{ 92, 4, 10, 8, 1, -9 }, // 0x31 '1'
|
||||
{ 97, 6, 10, 8, 1, -9 }, // 0x32 '2'
|
||||
{ 105, 6, 10, 8, 1, -9 }, // 0x33 '3'
|
||||
{ 113, 8, 10, 8, 0, -9 }, // 0x34 '4'
|
||||
{ 123, 6, 10, 8, 1, -9 }, // 0x35 '5'
|
||||
{ 131, 6, 10, 8, 1, -9 }, // 0x36 '6'
|
||||
{ 139, 6, 10, 8, 1, -9 }, // 0x37 '7'
|
||||
{ 147, 6, 10, 8, 1, -9 }, // 0x38 '8'
|
||||
{ 155, 6, 10, 8, 1, -9 }, // 0x39 '9'
|
||||
{ 163, 2, 8, 4, 1, -7 }, // 0x3A ':'
|
||||
{ 165, 3, 10, 4, 0, -7 }, // 0x3B ';'
|
||||
{ 169, 6, 6, 8, 1, -7 }, // 0x3C '<'
|
||||
{ 174, 6, 4, 8, 1, -6 }, // 0x3D '='
|
||||
{ 177, 6, 6, 8, 1, -7 }, // 0x3E '>'
|
||||
{ 182, 6, 10, 6, 0, -9 }, // 0x3F '?'
|
||||
{ 190, 11, 11, 12, 1, -9 }, // 0x40 '@'
|
||||
{ 206, 9, 10, 9, 0, -9 }, // 0x41 'A'
|
||||
{ 218, 7, 10, 9, 1, -9 }, // 0x42 'B'
|
||||
{ 227, 7, 10, 9, 1, -9 }, // 0x43 'C'
|
||||
{ 236, 8, 10, 10, 1, -9 }, // 0x44 'D'
|
||||
{ 246, 6, 10, 8, 1, -9 }, // 0x45 'E'
|
||||
{ 254, 6, 10, 7, 1, -9 }, // 0x46 'F'
|
||||
{ 262, 8, 10, 10, 1, -9 }, // 0x47 'G'
|
||||
{ 272, 8, 10, 10, 1, -9 }, // 0x48 'H'
|
||||
{ 282, 3, 10, 5, 1, -9 }, // 0x49 'I'
|
||||
{ 286, 4, 13, 4, -1, -9 }, // 0x4A 'J'
|
||||
{ 293, 7, 10, 8, 1, -9 }, // 0x4B 'K'
|
||||
{ 302, 6, 10, 7, 1, -9 }, // 0x4C 'L'
|
||||
{ 310, 10, 10, 12, 1, -9 }, // 0x4D 'M'
|
||||
{ 323, 8, 10, 10, 1, -9 }, // 0x4E 'N'
|
||||
{ 333, 9, 10, 11, 1, -9 }, // 0x4F 'O'
|
||||
{ 345, 7, 10, 8, 1, -9 }, // 0x50 'P'
|
||||
{ 354, 9, 12, 11, 1, -9 }, // 0x51 'Q'
|
||||
{ 368, 7, 10, 9, 1, -9 }, // 0x52 'R'
|
||||
{ 377, 6, 10, 8, 1, -9 }, // 0x53 'S'
|
||||
{ 385, 7, 10, 8, 0, -9 }, // 0x54 'T'
|
||||
{ 394, 8, 10, 10, 1, -9 }, // 0x55 'U'
|
||||
{ 404, 8, 10, 8, 0, -9 }, // 0x56 'V'
|
||||
{ 414, 13, 10, 13, 0, -9 }, // 0x57 'W'
|
||||
{ 431, 8, 10, 8, 0, -9 }, // 0x58 'X'
|
||||
{ 441, 8, 10, 8, 0, -9 }, // 0x59 'Y'
|
||||
{ 451, 6, 10, 8, 1, -9 }, // 0x5A 'Z'
|
||||
{ 459, 3, 12, 5, 1, -9 }, // 0x5B '['
|
||||
{ 464, 5, 10, 5, 0, -9 }, // 0x5C '\'
|
||||
{ 471, 3, 12, 5, 0, -9 }, // 0x5D ']'
|
||||
{ 476, 6, 6, 8, 1, -9 }, // 0x5E '^'
|
||||
{ 481, 6, 1, 6, 0, 2 }, // 0x5F '_'
|
||||
{ 482, 2, 3, 4, 1, -10 }, // 0x60 '`'
|
||||
{ 483, 6, 7, 8, 1, -6 }, // 0x61 'a'
|
||||
{ 489, 7, 10, 8, 1, -9 }, // 0x62 'b'
|
||||
{ 498, 5, 7, 7, 1, -6 }, // 0x63 'c'
|
||||
{ 503, 6, 10, 8, 1, -9 }, // 0x64 'd'
|
||||
{ 511, 6, 7, 8, 1, -6 }, // 0x65 'e'
|
||||
{ 517, 5, 10, 5, 0, -9 }, // 0x66 'f'
|
||||
{ 524, 6, 10, 8, 1, -6 }, // 0x67 'g'
|
||||
{ 532, 6, 10, 8, 1, -9 }, // 0x68 'h'
|
||||
{ 540, 1, 10, 4, 1, -9 }, // 0x69 'i'
|
||||
{ 542, 3, 13, 4, -1, -9 }, // 0x6A 'j'
|
||||
{ 547, 6, 10, 7, 1, -9 }, // 0x6B 'k'
|
||||
{ 555, 1, 10, 4, 1, -9 }, // 0x6C 'l'
|
||||
{ 557, 11, 7, 13, 1, -6 }, // 0x6D 'm'
|
||||
{ 567, 6, 7, 8, 1, -6 }, // 0x6E 'n'
|
||||
{ 573, 7, 7, 8, 1, -6 }, // 0x6F 'o'
|
||||
{ 580, 7, 10, 8, 1, -6 }, // 0x70 'p'
|
||||
{ 589, 6, 10, 8, 1, -6 }, // 0x71 'q'
|
||||
{ 597, 4, 7, 6, 1, -6 }, // 0x72 'r'
|
||||
{ 601, 5, 7, 7, 1, -6 }, // 0x73 's'
|
||||
{ 606, 5, 9, 5, 0, -8 }, // 0x74 't'
|
||||
{ 612, 6, 7, 8, 1, -6 }, // 0x75 'u'
|
||||
{ 618, 7, 7, 7, 0, -6 }, // 0x76 'v'
|
||||
{ 625, 11, 7, 11, 0, -6 }, // 0x77 'w'
|
||||
{ 635, 7, 7, 7, 0, -6 }, // 0x78 'x'
|
||||
{ 642, 7, 10, 7, 0, -6 }, // 0x79 'y'
|
||||
{ 651, 5, 7, 6, 1, -6 }, // 0x7A 'z'
|
||||
{ 656, 5, 12, 5, 0, -9 }, // 0x7B '{'
|
||||
{ 664, 1, 13, 8, 3, -9 }, // 0x7C '|'
|
||||
{ 666, 5, 12, 5, 0, -9 }, // 0x7D '}'
|
||||
{ 674, 6, 2, 8, 1, -5 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular7pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular7pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular7pt7bGlyphs,
|
||||
0x20, 0x7E, 19 };
|
||||
|
||||
// Approx. 1348 bytes
|
||||
|
||||
#endif // NOTOSANS7PT7B_H
|
||||
@@ -0,0 +1,201 @@
|
||||
#ifndef NOTOSANS9PT7B_H
|
||||
#define NOTOSANS9PT7B_H
|
||||
const uint8_t NotoSans_Regular9pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xF5, 0x55, 0x43, 0xC0, 0xDE, 0xF3, 0x9C, 0x80, 0x0C, 0x81, 0x10,
|
||||
0x22, 0x04, 0x47, 0xFE, 0x32, 0x04, 0x40, 0x88, 0xFF, 0xC2, 0x60, 0xC8,
|
||||
0x11, 0x02, 0x20, 0x18, 0x3E, 0x7F, 0xD8, 0xD8, 0xF8, 0x3C, 0x1F, 0x1B,
|
||||
0x19, 0x9B, 0xFE, 0x18, 0x18, 0x70, 0x46, 0xC2, 0x22, 0x21, 0x13, 0x08,
|
||||
0x90, 0x45, 0xB3, 0x6B, 0x4E, 0xD3, 0x04, 0x98, 0x44, 0xC2, 0x26, 0x21,
|
||||
0x23, 0x07, 0x00, 0x1C, 0x07, 0x60, 0x62, 0x06, 0x20, 0x26, 0x03, 0xC0,
|
||||
0x38, 0x06, 0xC6, 0xC6, 0x6C, 0x3C, 0xC1, 0x8E, 0x3C, 0x7E, 0x70, 0xFF,
|
||||
0xC0, 0x32, 0x64, 0xCC, 0x88, 0x88, 0x8C, 0xC4, 0x63, 0x8C, 0x46, 0x22,
|
||||
0x23, 0x33, 0x22, 0x64, 0xC8, 0x18, 0x10, 0xD3, 0xFF, 0x18, 0x2C, 0x66,
|
||||
0x24, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x7E, 0xF0, 0xF0,
|
||||
0x04, 0x30, 0xC2, 0x18, 0x41, 0x0C, 0x21, 0x86, 0x10, 0xC0, 0x3C, 0x7E,
|
||||
0x42, 0xC3, 0xC1, 0x81, 0x81, 0x81, 0xC1, 0xC3, 0xC3, 0x66, 0x3C, 0x13,
|
||||
0xD9, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3C, 0xFE, 0x83, 0x03, 0x03, 0x02,
|
||||
0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFF, 0x3C, 0xFE, 0x83, 0x03, 0x03,
|
||||
0x06, 0x38, 0x06, 0x03, 0x03, 0x03, 0x86, 0xFC, 0x03, 0x01, 0xC0, 0x70,
|
||||
0x3C, 0x1B, 0x04, 0xC2, 0x31, 0x8C, 0x43, 0x3F, 0xF0, 0x30, 0x0C, 0x03,
|
||||
0x00, 0x7E, 0x7E, 0x40, 0x40, 0x40, 0xFC, 0x7E, 0x03, 0x03, 0x03, 0x03,
|
||||
0x86, 0xFC, 0x0E, 0x3E, 0x60, 0x40, 0xC0, 0xDC, 0xE7, 0xC3, 0xC1, 0xC1,
|
||||
0xC3, 0x63, 0x3E, 0xFF, 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x0C, 0x18,
|
||||
0x18, 0x10, 0x30, 0x60, 0x3C, 0x7E, 0xC3, 0xC3, 0x43, 0x76, 0x3C, 0x66,
|
||||
0xC3, 0x81, 0x81, 0xC3, 0x7E, 0x38, 0x7E, 0xC3, 0xC3, 0x81, 0xC3, 0xC3,
|
||||
0x7D, 0x03, 0x03, 0x02, 0x0E, 0x78, 0x74, 0x00, 0xF0, 0x74, 0x00, 0xFA,
|
||||
0x01, 0x03, 0x0C, 0x30, 0xC0, 0xE0, 0x1C, 0x07, 0x01, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x07, 0x38, 0xE0, 0x80, 0x39,
|
||||
0xFC, 0x08, 0x10, 0x60, 0x86, 0x08, 0x30, 0x00, 0x01, 0x83, 0x00, 0x03,
|
||||
0x80, 0x7F, 0x83, 0x01, 0x18, 0x02, 0x47, 0xCF, 0x31, 0x38, 0x84, 0x62,
|
||||
0x31, 0x88, 0xCE, 0x23, 0x2C, 0x77, 0x10, 0x00, 0x60, 0x00, 0x7F, 0x00,
|
||||
0x30, 0x00, 0x04, 0x01, 0xC0, 0x28, 0x05, 0x81, 0xB0, 0x22, 0x04, 0x61,
|
||||
0x84, 0x3F, 0xCC, 0x19, 0x81, 0x20, 0x3C, 0x06, 0xF8, 0x7F, 0x20, 0xD0,
|
||||
0x68, 0x34, 0x33, 0xF1, 0x06, 0x81, 0x40, 0xE0, 0x50, 0xEF, 0xE0, 0x0F,
|
||||
0x0F, 0xF6, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x06,
|
||||
0x00, 0xC2, 0x1F, 0x80, 0xF8, 0x3F, 0xC8, 0x3A, 0x06, 0x80, 0xE0, 0x38,
|
||||
0x0E, 0x03, 0x80, 0xE0, 0x68, 0x1A, 0x1C, 0xFC, 0x00, 0xFF, 0xFE, 0x04,
|
||||
0x08, 0x10, 0x3F, 0x40, 0x81, 0x02, 0x04, 0x0F, 0xE0, 0xFF, 0xFE, 0x04,
|
||||
0x08, 0x10, 0x3F, 0x7E, 0x81, 0x02, 0x04, 0x08, 0x00, 0x0F, 0x87, 0xF9,
|
||||
0xC0, 0x30, 0x0C, 0x01, 0x80, 0x30, 0xFE, 0x1F, 0xC0, 0x68, 0x0D, 0x81,
|
||||
0x98, 0x31, 0xFE, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFF, 0x01,
|
||||
0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, 0xFF, 0x66, 0x66, 0x66, 0x66, 0x66,
|
||||
0xF0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3E, 0x81, 0xC1, 0xA1,
|
||||
0x91, 0x89, 0x85, 0x83, 0xC1, 0xB0, 0x8C, 0x46, 0x21, 0x90, 0x68, 0x18,
|
||||
0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x0F, 0xE0,
|
||||
0xC0, 0x3C, 0x03, 0xE0, 0x7A, 0x05, 0xB0, 0xDB, 0x09, 0x90, 0x99, 0x99,
|
||||
0x89, 0x18, 0xB1, 0x8F, 0x18, 0x61, 0x86, 0x10, 0xC0, 0xF0, 0x3E, 0x0E,
|
||||
0xC3, 0xB0, 0xE6, 0x38, 0x8E, 0x33, 0x86, 0xE0, 0xB8, 0x3E, 0x07, 0x80,
|
||||
0xC0, 0x0F, 0x03, 0xFC, 0x60, 0x64, 0x06, 0xC0, 0x2C, 0x03, 0xC0, 0x3C,
|
||||
0x03, 0xC0, 0x3C, 0x02, 0x60, 0x63, 0x0C, 0x1F, 0x80, 0xF0, 0xFE, 0x82,
|
||||
0x83, 0x83, 0x83, 0x86, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0F, 0x03,
|
||||
0xFC, 0x60, 0x64, 0x06, 0xC0, 0x2C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C,
|
||||
0x02, 0x60, 0x63, 0x0C, 0x1F, 0x80, 0x18, 0x01, 0xC0, 0x0E, 0xF0, 0x7F,
|
||||
0x20, 0xD0, 0x68, 0x34, 0x13, 0xF9, 0xF0, 0x8C, 0x43, 0x21, 0x90, 0x68,
|
||||
0x18, 0x3D, 0x7E, 0xC0, 0xC0, 0xC0, 0x60, 0x3C, 0x0E, 0x03, 0x03, 0x03,
|
||||
0x86, 0xFC, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
|
||||
0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18,
|
||||
0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x70, 0x7C, 0x63, 0xE0, 0xC0, 0x78,
|
||||
0x09, 0x03, 0x30, 0x46, 0x18, 0x43, 0x0C, 0x40, 0x98, 0x1B, 0x03, 0x40,
|
||||
0x38, 0x07, 0x00, 0xC0, 0xC1, 0x83, 0x41, 0x83, 0x41, 0xC3, 0x63, 0xC2,
|
||||
0x63, 0x46, 0x22, 0x46, 0x22, 0x66, 0x36, 0x24, 0x34, 0x2C, 0x14, 0x3C,
|
||||
0x14, 0x38, 0x1C, 0x18, 0x18, 0x18, 0xC0, 0xD8, 0x22, 0x18, 0xCC, 0x1A,
|
||||
0x03, 0x80, 0xC0, 0x38, 0x1A, 0x0C, 0xC2, 0x19, 0x82, 0xC0, 0xC0, 0xC0,
|
||||
0xD0, 0x26, 0x18, 0x84, 0x33, 0x04, 0x81, 0xE0, 0x30, 0x0C, 0x03, 0x00,
|
||||
0xC0, 0x30, 0x0C, 0x00, 0xFF, 0xFF, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10,
|
||||
0x30, 0x60, 0x40, 0xC0, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||
0xCF, 0xC1, 0x04, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x20, 0x83, 0x04, 0xFF,
|
||||
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x10, 0x18, 0x38, 0x24, 0x64,
|
||||
0x42, 0x42, 0x81, 0xFF, 0xD9, 0x80, 0x18, 0xFC, 0x08, 0x11, 0xEE, 0x70,
|
||||
0xC1, 0xC6, 0xF4, 0xC0, 0x60, 0x30, 0x19, 0x8F, 0xF7, 0x0B, 0x07, 0x83,
|
||||
0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x1C, 0xFD, 0x06, 0x0C, 0x18, 0x30,
|
||||
0x60, 0x62, 0x7C, 0x01, 0x01, 0x01, 0x19, 0x7F, 0xC3, 0xC1, 0xC1, 0xC1,
|
||||
0xC1, 0xC1, 0x63, 0x3D, 0x18, 0x7E, 0x43, 0xC3, 0xFF, 0xFF, 0xC0, 0xC0,
|
||||
0x61, 0x3F, 0x1E, 0x60, 0x81, 0x0F, 0xC4, 0x08, 0x10, 0x20, 0x40, 0x81,
|
||||
0x02, 0x00, 0x18, 0x7F, 0x43, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D,
|
||||
0x01, 0x01, 0x43, 0x7E, 0xC0, 0xC0, 0xC0, 0xCC, 0xFF, 0xE1, 0xC1, 0xC1,
|
||||
0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xF0, 0xFF, 0xFF, 0xC0, 0x33, 0x00, 0x33,
|
||||
0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC6, 0xCC,
|
||||
0xD8, 0xD0, 0xF8, 0xCC, 0xC4, 0xC6, 0xC3, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C,
|
||||
0x33, 0xFB, 0xFE, 0x38, 0xF0, 0xC3, 0xC1, 0x07, 0x04, 0x1C, 0x10, 0x70,
|
||||
0x41, 0xC1, 0x07, 0x04, 0x10, 0x0C, 0xFF, 0xE1, 0xC1, 0xC1, 0xC1, 0xC1,
|
||||
0xC1, 0xC1, 0xC1, 0x18, 0x3F, 0x10, 0xD8, 0x3C, 0x1E, 0x0F, 0x07, 0x82,
|
||||
0x63, 0x1F, 0x00, 0x0C, 0x7F, 0xB8, 0x58, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
|
||||
0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x18, 0x7F, 0xC3, 0xC1, 0xC1,
|
||||
0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x7E, 0x30,
|
||||
0xC3, 0x0C, 0x30, 0xC3, 0x00, 0x39, 0xFA, 0x06, 0x07, 0x07, 0x81, 0x83,
|
||||
0x85, 0xF8, 0x20, 0x86, 0x3F, 0x20, 0x82, 0x08, 0x20, 0x83, 0x0F, 0xC1,
|
||||
0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x7D, 0xC1, 0xA0, 0x98, 0xCC,
|
||||
0x42, 0x21, 0xB0, 0x50, 0x28, 0x1C, 0x00, 0xC3, 0x0D, 0x1C, 0x26, 0x79,
|
||||
0x99, 0x26, 0x24, 0x90, 0xB3, 0x43, 0x8F, 0x0E, 0x18, 0x18, 0x60, 0xE3,
|
||||
0x99, 0x05, 0x83, 0x80, 0xC0, 0xB0, 0xC8, 0xC6, 0xC1, 0x80, 0xC1, 0xA0,
|
||||
0x98, 0xC4, 0x43, 0x21, 0xB0, 0x50, 0x38, 0x0C, 0x04, 0x06, 0x02, 0x0F,
|
||||
0x00, 0xFC, 0x18, 0x20, 0xC3, 0x0C, 0x10, 0x60, 0xFE, 0x04, 0x71, 0x04,
|
||||
0x10, 0x41, 0x3C, 0xE0, 0xC1, 0x04, 0x10, 0x41, 0xC3, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0x87, 0x18, 0x42, 0x10, 0x87, 0x39, 0x08, 0x42, 0x33, 0x90,
|
||||
0xF9, 0x8F };
|
||||
|
||||
const GFXglyph NotoSans_Regular9pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 13, 5, 1, -12 }, // 0x21 '!'
|
||||
{ 5, 5, 5, 7, 1, -12 }, // 0x22 '"'
|
||||
{ 9, 11, 13, 11, 0, -12 }, // 0x23 '#'
|
||||
{ 27, 8, 14, 10, 1, -12 }, // 0x24 '$'
|
||||
{ 41, 13, 13, 15, 1, -12 }, // 0x25 '%'
|
||||
{ 63, 12, 13, 13, 1, -12 }, // 0x26 '&'
|
||||
{ 83, 2, 5, 4, 1, -12 }, // 0x27 '''
|
||||
{ 85, 4, 16, 5, 1, -12 }, // 0x28 '('
|
||||
{ 93, 4, 16, 5, 1, -12 }, // 0x29 ')'
|
||||
{ 101, 8, 8, 10, 1, -12 }, // 0x2A '*'
|
||||
{ 109, 8, 8, 10, 1, -9 }, // 0x2B '+'
|
||||
{ 117, 2, 4, 5, 1, -1 }, // 0x2C ','
|
||||
{ 118, 4, 1, 6, 1, -4 }, // 0x2D '-'
|
||||
{ 119, 2, 2, 5, 1, -1 }, // 0x2E '.'
|
||||
{ 120, 6, 13, 7, 0, -12 }, // 0x2F '/'
|
||||
{ 130, 8, 13, 10, 1, -12 }, // 0x30 '0'
|
||||
{ 143, 4, 13, 10, 2, -12 }, // 0x31 '1'
|
||||
{ 150, 8, 13, 10, 1, -12 }, // 0x32 '2'
|
||||
{ 163, 8, 13, 10, 1, -12 }, // 0x33 '3'
|
||||
{ 176, 10, 13, 10, 0, -12 }, // 0x34 '4'
|
||||
{ 193, 8, 13, 10, 1, -12 }, // 0x35 '5'
|
||||
{ 206, 8, 13, 10, 1, -12 }, // 0x36 '6'
|
||||
{ 219, 8, 13, 10, 1, -12 }, // 0x37 '7'
|
||||
{ 232, 8, 13, 10, 1, -12 }, // 0x38 '8'
|
||||
{ 245, 8, 13, 10, 1, -12 }, // 0x39 '9'
|
||||
{ 258, 2, 10, 5, 1, -9 }, // 0x3A ':'
|
||||
{ 261, 2, 12, 5, 1, -9 }, // 0x3B ';'
|
||||
{ 264, 8, 9, 10, 1, -10 }, // 0x3C '<'
|
||||
{ 273, 8, 5, 10, 1, -8 }, // 0x3D '='
|
||||
{ 278, 8, 9, 10, 1, -10 }, // 0x3E '>'
|
||||
{ 287, 7, 13, 8, 0, -12 }, // 0x3F '?'
|
||||
{ 299, 14, 15, 16, 1, -12 }, // 0x40 '@'
|
||||
{ 326, 11, 13, 11, 0, -12 }, // 0x41 'A'
|
||||
{ 344, 9, 13, 11, 2, -12 }, // 0x42 'B'
|
||||
{ 359, 10, 13, 11, 1, -12 }, // 0x43 'C'
|
||||
{ 376, 10, 13, 13, 2, -12 }, // 0x44 'D'
|
||||
{ 393, 7, 13, 10, 2, -12 }, // 0x45 'E'
|
||||
{ 405, 7, 13, 9, 2, -12 }, // 0x46 'F'
|
||||
{ 417, 11, 13, 13, 1, -12 }, // 0x47 'G'
|
||||
{ 435, 9, 13, 13, 2, -12 }, // 0x48 'H'
|
||||
{ 450, 4, 13, 6, 1, -12 }, // 0x49 'I'
|
||||
{ 457, 4, 16, 5, -1, -12 }, // 0x4A 'J'
|
||||
{ 465, 9, 13, 11, 2, -12 }, // 0x4B 'K'
|
||||
{ 480, 7, 13, 9, 2, -12 }, // 0x4C 'L'
|
||||
{ 492, 12, 13, 16, 2, -12 }, // 0x4D 'M'
|
||||
{ 512, 10, 13, 13, 2, -12 }, // 0x4E 'N'
|
||||
{ 529, 12, 13, 14, 1, -12 }, // 0x4F 'O'
|
||||
{ 549, 8, 13, 11, 2, -12 }, // 0x50 'P'
|
||||
{ 562, 12, 16, 14, 1, -12 }, // 0x51 'Q'
|
||||
{ 586, 9, 13, 11, 2, -12 }, // 0x52 'R'
|
||||
{ 601, 8, 13, 10, 1, -12 }, // 0x53 'S'
|
||||
{ 614, 10, 13, 10, 0, -12 }, // 0x54 'T'
|
||||
{ 631, 9, 13, 13, 2, -12 }, // 0x55 'U'
|
||||
{ 646, 11, 13, 11, 0, -12 }, // 0x56 'V'
|
||||
{ 664, 16, 13, 16, 0, -12 }, // 0x57 'W'
|
||||
{ 690, 10, 13, 10, 0, -12 }, // 0x58 'X'
|
||||
{ 707, 10, 13, 10, 0, -12 }, // 0x59 'Y'
|
||||
{ 724, 8, 13, 10, 1, -12 }, // 0x5A 'Z'
|
||||
{ 737, 4, 16, 6, 1, -12 }, // 0x5B '['
|
||||
{ 745, 6, 13, 7, 0, -12 }, // 0x5C '\'
|
||||
{ 755, 4, 16, 6, 0, -12 }, // 0x5D ']'
|
||||
{ 763, 8, 8, 10, 1, -12 }, // 0x5E '^'
|
||||
{ 771, 8, 1, 8, 0, 3 }, // 0x5F '_'
|
||||
{ 772, 3, 3, 5, 1, -13 }, // 0x60 '`'
|
||||
{ 774, 7, 10, 10, 1, -9 }, // 0x61 'a'
|
||||
{ 783, 9, 13, 11, 1, -12 }, // 0x62 'b'
|
||||
{ 798, 7, 10, 8, 1, -9 }, // 0x63 'c'
|
||||
{ 807, 8, 13, 11, 1, -12 }, // 0x64 'd'
|
||||
{ 820, 8, 10, 10, 1, -9 }, // 0x65 'e'
|
||||
{ 830, 7, 13, 6, 0, -12 }, // 0x66 'f'
|
||||
{ 842, 8, 14, 11, 1, -9 }, // 0x67 'g'
|
||||
{ 856, 8, 13, 11, 1, -12 }, // 0x68 'h'
|
||||
{ 869, 2, 13, 5, 1, -12 }, // 0x69 'i'
|
||||
{ 873, 4, 17, 5, -1, -12 }, // 0x6A 'j'
|
||||
{ 882, 8, 13, 9, 1, -12 }, // 0x6B 'k'
|
||||
{ 895, 2, 13, 5, 1, -12 }, // 0x6C 'l'
|
||||
{ 899, 14, 10, 16, 1, -9 }, // 0x6D 'm'
|
||||
{ 917, 8, 10, 11, 1, -9 }, // 0x6E 'n'
|
||||
{ 927, 9, 10, 11, 1, -9 }, // 0x6F 'o'
|
||||
{ 939, 9, 14, 11, 1, -9 }, // 0x70 'p'
|
||||
{ 955, 8, 14, 11, 1, -9 }, // 0x71 'q'
|
||||
{ 969, 6, 10, 7, 1, -9 }, // 0x72 'r'
|
||||
{ 977, 7, 10, 8, 1, -9 }, // 0x73 's'
|
||||
{ 986, 6, 12, 6, 0, -11 }, // 0x74 't'
|
||||
{ 995, 8, 9, 11, 1, -8 }, // 0x75 'u'
|
||||
{ 1004, 9, 9, 9, 0, -8 }, // 0x76 'v'
|
||||
{ 1015, 14, 9, 14, 0, -8 }, // 0x77 'w'
|
||||
{ 1031, 9, 9, 9, 0, -8 }, // 0x78 'x'
|
||||
{ 1042, 9, 13, 9, 0, -8 }, // 0x79 'y'
|
||||
{ 1057, 7, 9, 8, 1, -8 }, // 0x7A 'z'
|
||||
{ 1065, 6, 16, 7, 0, -12 }, // 0x7B '{'
|
||||
{ 1077, 2, 17, 10, 4, -12 }, // 0x7C '|'
|
||||
{ 1082, 5, 16, 7, 1, -12 }, // 0x7D '}'
|
||||
{ 1092, 8, 2, 10, 1, -6 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Regular9pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Regular9pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Regular9pt7bGlyphs,
|
||||
0x20, 0x7E, 24 };
|
||||
|
||||
// Approx. 1766 bytes
|
||||
|
||||
#endif // NOTOSANS9PT7B_H
|
||||
@@ -0,0 +1,285 @@
|
||||
#ifndef NOTOSANSBOLD12PT7B_H
|
||||
#define NOTOSANSBOLD12PT7B_H
|
||||
const uint8_t NotoSans_Bold12pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0x77, 0x77, 0x77, 0x77, 0x06, 0xFF, 0x70, 0xF7, 0xB9,
|
||||
0xDC, 0xEE, 0x77, 0x33, 0x18, 0x0E, 0x70, 0x39, 0xC0, 0xE6, 0x03, 0x18,
|
||||
0x0C, 0x63, 0xFF, 0xFF, 0xFF, 0xC7, 0x30, 0x1C, 0xC0, 0x63, 0x0F, 0xFF,
|
||||
0xBF, 0xFE, 0x39, 0x80, 0xE6, 0x03, 0x18, 0x0C, 0xE0, 0x73, 0x80, 0x06,
|
||||
0x00, 0x60, 0x1F, 0xC7, 0xFE, 0xFF, 0xEF, 0x62, 0xF6, 0x0F, 0xE0, 0x7F,
|
||||
0x03, 0xFC, 0x0F, 0xE0, 0x7E, 0x06, 0xF8, 0x6E, 0xFF, 0xEF, 0xFC, 0x7F,
|
||||
0x80, 0x60, 0x06, 0x00, 0x3C, 0x07, 0x0F, 0xC1, 0xC3, 0xB8, 0x30, 0x73,
|
||||
0x8E, 0x0E, 0x73, 0x81, 0x8E, 0x70, 0x39, 0xDC, 0x07, 0x33, 0xBE, 0xFE,
|
||||
0xEF, 0xEF, 0x99, 0xDC, 0x47, 0x31, 0x80, 0xCE, 0x30, 0x38, 0xC6, 0x0E,
|
||||
0x18, 0xC1, 0xC3, 0xB8, 0x70, 0x7F, 0x0E, 0x07, 0xC0, 0x0F, 0x80, 0x1F,
|
||||
0xE0, 0x0F, 0xF8, 0x0F, 0x3C, 0x07, 0x8E, 0x01, 0xCF, 0x00, 0xFF, 0x00,
|
||||
0x3F, 0x00, 0x3F, 0x0F, 0x3F, 0xC7, 0x3C, 0xF7, 0x9E, 0x3F, 0xCF, 0x0F,
|
||||
0xC7, 0x83, 0xC3, 0xFF, 0xF0, 0xFF, 0xFC, 0x3F, 0xCF, 0x80, 0xF7, 0x77,
|
||||
0x76, 0x1C, 0xE3, 0x9C, 0x71, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E,
|
||||
0x1C, 0x71, 0xC3, 0x8E, 0x1C, 0xE1, 0xC7, 0x0E, 0x38, 0xE3, 0xC7, 0x1C,
|
||||
0x71, 0xC7, 0x1C, 0x73, 0xCE, 0x38, 0xE7, 0x38, 0xE0, 0x0E, 0x01, 0xC0,
|
||||
0x38, 0x47, 0x3F, 0xFF, 0xFF, 0xC7, 0x80, 0xF8, 0x3B, 0x8E, 0x78, 0xC4,
|
||||
0x00, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x70,
|
||||
0x0E, 0x01, 0xC0, 0x38, 0x00, 0x77, 0xFE, 0xEC, 0xFF, 0xFF, 0xC0, 0x6F,
|
||||
0xF7, 0x03, 0xC0, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x38, 0x1E,
|
||||
0x07, 0x01, 0xC0, 0xE0, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0xF0, 0x00, 0x1F,
|
||||
0x03, 0xFC, 0x7F, 0xC7, 0x1E, 0xF0, 0xEF, 0x0E, 0xE0, 0xEE, 0x0F, 0xE0,
|
||||
0xFE, 0x0F, 0xE0, 0xFF, 0x0E, 0xF0, 0xE7, 0x1E, 0x7F, 0xE3, 0xFC, 0x1F,
|
||||
0x80, 0x07, 0x87, 0xC7, 0xE7, 0xFF, 0xFB, 0xBC, 0x9E, 0x0F, 0x07, 0x83,
|
||||
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x80, 0x1F, 0x87, 0xFC,
|
||||
0xFF, 0xE7, 0x1E, 0x40, 0xE0, 0x0E, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x78,
|
||||
0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F,
|
||||
0x0F, 0xFC, 0xFF, 0xE6, 0x1E, 0x00, 0xE0, 0x1E, 0x01, 0xC3, 0xF8, 0x3F,
|
||||
0x83, 0xFE, 0x01, 0xE0, 0x0E, 0x00, 0xF8, 0x1E, 0xFF, 0xEF, 0xFC, 0xFF,
|
||||
0x80, 0x00, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x7E, 0x07, 0x70, 0x73,
|
||||
0x83, 0x9C, 0x38, 0xE3, 0x87, 0x1C, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0x03, 0x80, 0x1C, 0x00, 0xE0, 0x7F, 0xCF, 0xF9, 0xFF, 0x38, 0x07, 0x00,
|
||||
0xE0, 0x1F, 0xC3, 0xFE, 0xFF, 0xE8, 0x7C, 0x03, 0x80, 0x70, 0x0F, 0x03,
|
||||
0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x07, 0xC1, 0xFC, 0x3F, 0xC7, 0x80, 0x70,
|
||||
0x0F, 0x00, 0xE7, 0x8E, 0xFC, 0xFF, 0xEF, 0x0E, 0xE0, 0xFE, 0x0F, 0xF0,
|
||||
0xFF, 0x0E, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||
0x0E, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x38, 0x07, 0x80, 0x78, 0x07, 0x00,
|
||||
0xF0, 0x0E, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x3C, 0x00, 0x1F, 0x07, 0xFC,
|
||||
0x7F, 0xEF, 0x0E, 0xF0, 0xE7, 0x1E, 0x7B, 0xC3, 0xF8, 0x1F, 0x87, 0xFC,
|
||||
0xF1, 0xEE, 0x0E, 0xE0, 0xFE, 0x0F, 0xF9, 0xE7, 0xFC, 0x3F, 0x80, 0x1F,
|
||||
0x07, 0xF8, 0x7F, 0xCF, 0x1E, 0xE0, 0xEE, 0x0E, 0xE0, 0xFF, 0x1F, 0xFF,
|
||||
0xF7, 0xFE, 0x3E, 0xE0, 0x0E, 0x01, 0xE0, 0x1C, 0x7F, 0xC7, 0xF8, 0x7E,
|
||||
0x00, 0x7F, 0xF6, 0x00, 0x00, 0x06, 0xFF, 0x70, 0x7F, 0xF6, 0x00, 0x00,
|
||||
0x00, 0x77, 0xFE, 0xEC, 0x00, 0x20, 0x0C, 0x07, 0x83, 0xE1, 0xF0, 0xF8,
|
||||
0x3C, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0x80, 0x30, 0x02, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x18, 0x03, 0xC0,
|
||||
0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x1F, 0x1F, 0x8F, 0xC3, 0xE0, 0x70,
|
||||
0x08, 0x00, 0x3F, 0x1F, 0xF9, 0xFF, 0x20, 0xF0, 0x1E, 0x03, 0xC0, 0xF0,
|
||||
0x3C, 0x0F, 0x03, 0xC0, 0x70, 0x0E, 0x00, 0x00, 0x10, 0x07, 0x80, 0xF0,
|
||||
0x1E, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xC0, 0x7C, 0x3E, 0x1E, 0x01, 0xE3,
|
||||
0x83, 0x1C, 0xE3, 0xF9, 0xD8, 0xFF, 0x3F, 0x38, 0xE7, 0xE7, 0x1C, 0xFC,
|
||||
0xC3, 0x9F, 0x98, 0x73, 0xF3, 0x8E, 0x6E, 0x7F, 0xFC, 0xC7, 0xCF, 0x1C,
|
||||
0x00, 0x01, 0xC0, 0x00, 0x3E, 0x1E, 0x01, 0xFF, 0xC0, 0x0F, 0xE0, 0x00,
|
||||
0x03, 0xC0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0E, 0x70,
|
||||
0x0E, 0x78, 0x1E, 0x78, 0x1E, 0x38, 0x1C, 0x3C, 0x3F, 0xFC, 0x3F, 0xFC,
|
||||
0x3F, 0xFE, 0x78, 0x1E, 0x78, 0x0E, 0x70, 0x0F, 0xF0, 0x0F, 0xFF, 0x8F,
|
||||
0xFE, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF1, 0xEF, 0xFE, 0xFF, 0xCF,
|
||||
0xFF, 0xF0, 0xFF, 0x07, 0xF0, 0x7F, 0x0F, 0xFF, 0xFF, 0xFE, 0xFF, 0x80,
|
||||
0x07, 0xF0, 0xFF, 0xCF, 0xFE, 0x78, 0x27, 0x80, 0x3C, 0x03, 0xC0, 0x1E,
|
||||
0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x3E, 0x04, 0xFF,
|
||||
0xE3, 0xFF, 0x0F, 0xF0, 0xFF, 0x03, 0xFF, 0x8F, 0xFF, 0x3C, 0x7E, 0xF0,
|
||||
0x7B, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC,
|
||||
0x0F, 0xF0, 0x7B, 0xC3, 0xEF, 0xFF, 0x3F, 0xF8, 0xFF, 0x80, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFE, 0xFF, 0xBF, 0xEF, 0x03,
|
||||
0xC0, 0xF0, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFE, 0xFF, 0xBF, 0xEF, 0x03, 0xC0, 0xF0,
|
||||
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x00, 0x03, 0xF8, 0x3F, 0xF3, 0xFF, 0xCF,
|
||||
0x82, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x00, 0xF1, 0xFF, 0xC7, 0xFF,
|
||||
0x1F, 0xDC, 0x07, 0x78, 0x1D, 0xF0, 0x73, 0xFF, 0xC7, 0xFF, 0x0F, 0xF8,
|
||||
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0,
|
||||
0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3C, 0xFF, 0xFF, 0xF9, 0xC3, 0x87, 0x0E,
|
||||
0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x1F, 0x7F, 0xFE, 0x0F, 0x0F, 0x0F,
|
||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||
0x0F, 0x0F, 0x0F, 0x1E, 0xFE, 0xFC, 0xF8, 0xF0, 0x7F, 0xC1, 0xEF, 0x0F,
|
||||
0x3C, 0x78, 0xF3, 0xC3, 0xDE, 0x0F, 0x78, 0x3F, 0xC0, 0xFF, 0x03, 0xFE,
|
||||
0x0F, 0x3C, 0x3C, 0xF0, 0xF1, 0xE3, 0xC7, 0x8F, 0x0F, 0x3C, 0x1E, 0xF0,
|
||||
0x7C, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0,
|
||||
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8,
|
||||
0x07, 0xFE, 0x01, 0xFF, 0xC0, 0xFF, 0xF0, 0x3F, 0xFC, 0x0F, 0xFB, 0x87,
|
||||
0x7E, 0xE1, 0xDF, 0xB8, 0x77, 0xE7, 0x39, 0xF9, 0xCE, 0x7E, 0x73, 0x9F,
|
||||
0x8D, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3E, 0x1F, 0x87, 0x87, 0xE1,
|
||||
0xE1, 0xC0, 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0xFD,
|
||||
0xE1, 0xFB, 0xC3, 0xF3, 0xC7, 0xE3, 0x8F, 0xC7, 0x9F, 0x87, 0xBF, 0x0F,
|
||||
0x7E, 0x0F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF0, 0x1F, 0xE0, 0x3E, 0x07, 0xF0,
|
||||
0x1F, 0xF8, 0x3F, 0xFE, 0x7C, 0x3E, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F,
|
||||
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0F, 0x78, 0x0F,
|
||||
0x7C, 0x1E, 0x3F, 0xFE, 0x1F, 0xFC, 0x0F, 0xF0, 0xFF, 0x0F, 0xFC, 0xFF,
|
||||
0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1E, 0xFF, 0xEF, 0xFC, 0xFF,
|
||||
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x07, 0xF0,
|
||||
0x1F, 0xF8, 0x3F, 0xFE, 0x7C, 0x3E, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F,
|
||||
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0F, 0x78, 0x0F,
|
||||
0x7C, 0x1E, 0x3F, 0xFE, 0x1F, 0xFC, 0x0F, 0xF0, 0x00, 0x78, 0x00, 0x3C,
|
||||
0x00, 0x3E, 0x00, 0x1F, 0xFF, 0x07, 0xFE, 0x3F, 0xF9, 0xE3, 0xCF, 0x0F,
|
||||
0x78, 0x7B, 0xC3, 0xDE, 0x3C, 0xFF, 0xC7, 0xFC, 0x3F, 0xE1, 0xE7, 0x8F,
|
||||
0x1E, 0x78, 0xF3, 0xC3, 0xDE, 0x1E, 0xF0, 0x78, 0x1F, 0x87, 0xFD, 0xFF,
|
||||
0x78, 0x2F, 0x01, 0xE0, 0x1E, 0x03, 0xF0, 0x3F, 0x81, 0xF8, 0x0F, 0x80,
|
||||
0xF0, 0x0F, 0x83, 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C,
|
||||
0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
|
||||
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03,
|
||||
0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xE1,
|
||||
0xE7, 0xFF, 0x8F, 0xFC, 0x1F, 0xE0, 0xF0, 0x0F, 0xE0, 0x3D, 0xC0, 0x7B,
|
||||
0xC0, 0xE7, 0x83, 0xC7, 0x07, 0x0F, 0x0E, 0x1E, 0x3C, 0x1C, 0x70, 0x3C,
|
||||
0xE0, 0x7B, 0xC0, 0x77, 0x00, 0xEE, 0x01, 0xFC, 0x01, 0xF0, 0x03, 0xE0,
|
||||
0x03, 0xC0, 0xF0, 0x38, 0x1F, 0xE0, 0xF0, 0x39, 0xC1, 0xF0, 0x73, 0x83,
|
||||
0xE1, 0xE7, 0x87, 0xC3, 0xCF, 0x1D, 0x87, 0x0E, 0x3B, 0x8E, 0x1C, 0x77,
|
||||
0x3C, 0x38, 0xEE, 0x78, 0x7B, 0x9C, 0xE0, 0x77, 0x1D, 0xC0, 0xEE, 0x3B,
|
||||
0x81, 0xD8, 0x7F, 0x03, 0xF0, 0xFC, 0x03, 0xE0, 0xF8, 0x07, 0xC1, 0xF0,
|
||||
0x0F, 0x03, 0xE0, 0xF8, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x1C, 0x78, 0x1E,
|
||||
0x78, 0x0F, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0F,
|
||||
0xE0, 0x0E, 0xF0, 0x1E, 0x78, 0x3C, 0x78, 0x3C, 0x3C, 0x78, 0x1E, 0xF0,
|
||||
0x1F, 0xF0, 0x1E, 0xF0, 0x79, 0xE0, 0xE1, 0xE3, 0xC3, 0xC7, 0x03, 0xDE,
|
||||
0x07, 0xB8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x1C, 0x00,
|
||||
0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x1E, 0x01, 0xC0, 0x3C, 0x07, 0x80, 0x70, 0x0F, 0x01, 0xE0,
|
||||
0x3C, 0x03, 0xC0, 0x78, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF,
|
||||
0xFF, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3F, 0xFF,
|
||||
0x80, 0xF0, 0x1C, 0x07, 0x01, 0xE0, 0x38, 0x0E, 0x03, 0xC0, 0x70, 0x1C,
|
||||
0x03, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xC0, 0x78, 0x0E, 0x03, 0xC0, 0xFF,
|
||||
0xFE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xFF, 0xFF,
|
||||
0x80, 0x0C, 0x00, 0xE0, 0x1E, 0x01, 0xF0, 0x1B, 0x83, 0xB8, 0x31, 0xC7,
|
||||
0x1C, 0x60, 0xEE, 0x0E, 0xC0, 0x70, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0x70,
|
||||
0x70, 0x1F, 0x8F, 0xFC, 0xFF, 0x80, 0x70, 0x0E, 0x3F, 0xDF, 0xFF, 0xC7,
|
||||
0xF0, 0xFE, 0x1F, 0xEF, 0xFF, 0xF7, 0xE6, 0xE0, 0x0E, 0x00, 0xE0, 0x0E,
|
||||
0x00, 0xE0, 0x0E, 0x78, 0xFF, 0xCF, 0xFE, 0xF1, 0xEE, 0x0F, 0xE0, 0xFE,
|
||||
0x0F, 0xE0, 0xFE, 0x0F, 0xF1, 0xEF, 0xFE, 0xFF, 0xCE, 0xF8, 0x0F, 0xCF,
|
||||
0xF7, 0xFD, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E, 0x17, 0xFC,
|
||||
0xFF, 0x1F, 0xC0, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x71, 0xE7,
|
||||
0x3F, 0x77, 0xFF, 0xF8, 0xFF, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
|
||||
0xF0, 0xF7, 0xFF, 0x7F, 0x73, 0xF7, 0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x0F,
|
||||
0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x07, 0x00, 0x7C, 0xE3, 0xFE,
|
||||
0x1F, 0xE0, 0x0F, 0xC7, 0xF1, 0xF8, 0xF0, 0x3C, 0x0F, 0xEF, 0xFB, 0xFE,
|
||||
0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
|
||||
0x00, 0x1E, 0x73, 0xF7, 0x7F, 0xF7, 0x8F, 0xF0, 0x7F, 0x07, 0xF0, 0x7F,
|
||||
0x07, 0xF0, 0x7F, 0x0F, 0x7F, 0xF7, 0xF7, 0x3F, 0x70, 0x07, 0x00, 0xF6,
|
||||
0x1F, 0x7F, 0xE7, 0xFC, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0xE0, 0x0E, 0x7C, 0xFF, 0xEF, 0xFE, 0xF0, 0xFF, 0x0F, 0xE0, 0xFE, 0x0F,
|
||||
0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xFF, 0xA1, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFC, 0x1C, 0x71, 0xC2, 0x00, 0x71, 0xC7, 0x1C, 0x71,
|
||||
0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x3F, 0xFF, 0x98, 0xE0, 0x07,
|
||||
0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x7B, 0x87, 0x9C, 0x78, 0xE7,
|
||||
0x87, 0x78, 0x3B, 0x81, 0xFE, 0x0F, 0xF0, 0x7B, 0xC3, 0x8F, 0x1C, 0x3C,
|
||||
0xE1, 0xE7, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEF,
|
||||
0x8F, 0x9F, 0xFF, 0xFB, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0x0F, 0x0F, 0xC1,
|
||||
0xC1, 0xF8, 0x38, 0x3F, 0x07, 0x07, 0xE0, 0xE0, 0xFC, 0x1C, 0x1F, 0x83,
|
||||
0x83, 0xF0, 0x70, 0x7E, 0x0E, 0x0E, 0xE7, 0xCF, 0xFE, 0xFF, 0xEF, 0x0F,
|
||||
0xF0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F,
|
||||
0xE0, 0xF0, 0x1F, 0x81, 0xFF, 0x1F, 0xF8, 0xE1, 0xEF, 0x07, 0x78, 0x3B,
|
||||
0xC1, 0xFE, 0x0F, 0xF0, 0x73, 0x87, 0x9F, 0xFC, 0x7F, 0xC1, 0xFC, 0x00,
|
||||
0xE7, 0x8F, 0xFC, 0xFF, 0xEF, 0x1E, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F,
|
||||
0xE0, 0xFF, 0x1E, 0xFF, 0xEF, 0xFC, 0xEF, 0x8E, 0x00, 0xE0, 0x0E, 0x00,
|
||||
0xE0, 0x0E, 0x00, 0xE0, 0x00, 0x1E, 0x73, 0xF7, 0x7F, 0xFF, 0x8F, 0xF0,
|
||||
0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x0F, 0x7F, 0xF7, 0xF7, 0x3F,
|
||||
0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0xE7, 0xEF,
|
||||
0xFF, 0xF8, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x3F,
|
||||
0x9F, 0xFF, 0xBB, 0xC0, 0xF8, 0x1F, 0x83, 0xF8, 0x3E, 0x03, 0xC0, 0xFF,
|
||||
0x7F, 0xFE, 0xFF, 0x00, 0x38, 0x38, 0x38, 0x7F, 0xFF, 0xFF, 0x78, 0x78,
|
||||
0x78, 0x78, 0x78, 0x78, 0x78, 0x7F, 0x3F, 0x1F, 0xE0, 0xFE, 0x0F, 0xE0,
|
||||
0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFF, 0x1F, 0xFF,
|
||||
0xFF, 0xFF, 0x7E, 0x70, 0xF0, 0x3B, 0x83, 0xDC, 0x1E, 0xF0, 0xE3, 0x8F,
|
||||
0x1C, 0x70, 0xF3, 0x83, 0xBC, 0x1D, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x00,
|
||||
0x78, 0x00, 0xF0, 0xF0, 0xF7, 0x0F, 0x0F, 0x70, 0xF8, 0xE7, 0x9F, 0x8E,
|
||||
0x79, 0xF9, 0xE3, 0x99, 0x9C, 0x39, 0x9D, 0xC3, 0xF9, 0xDC, 0x1F, 0x9F,
|
||||
0x81, 0xF0, 0xF8, 0x1F, 0x0F, 0x81, 0xF0, 0xF8, 0x0F, 0x0F, 0x00, 0xF8,
|
||||
0x7B, 0xC7, 0x8F, 0x3C, 0x3B, 0xC1, 0xFC, 0x07, 0xE0, 0x3E, 0x01, 0xF8,
|
||||
0x1F, 0xC1, 0xEF, 0x0F, 0x3C, 0xF0, 0xEF, 0x07, 0x80, 0xF0, 0x3B, 0x83,
|
||||
0xDE, 0x1E, 0xF0, 0xE3, 0x8F, 0x1E, 0x70, 0x73, 0x83, 0xBC, 0x1D, 0xC0,
|
||||
0x7E, 0x03, 0xF0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0x7E,
|
||||
0x03, 0xE0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x0F, 0x03, 0x81,
|
||||
0xE0, 0xF0, 0x78, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0x0F, 0x1F,
|
||||
0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0xF0, 0xFC, 0x1C, 0x1C, 0x1C,
|
||||
0x1C, 0x1C, 0x1E, 0x1F, 0x0F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xF8, 0xE0, 0xF0, 0xF8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3C,
|
||||
0x1F, 0x07, 0x3F, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0xF8, 0xF0, 0xC0,
|
||||
0x7C, 0x3F, 0xFF, 0x3F, 0xC0, 0xC0 };
|
||||
|
||||
const GFXglyph NotoSans_Bold12pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 4, 17, 7, 1, -16 }, // 0x21 '!'
|
||||
{ 10, 9, 6, 11, 1, -16 }, // 0x22 '"'
|
||||
{ 17, 14, 17, 15, 1, -16 }, // 0x23 '#'
|
||||
{ 47, 12, 19, 13, 1, -17 }, // 0x24 '$'
|
||||
{ 76, 19, 17, 21, 1, -16 }, // 0x25 '%'
|
||||
{ 117, 17, 17, 18, 1, -16 }, // 0x26 '&'
|
||||
{ 154, 4, 6, 6, 1, -16 }, // 0x27 '''
|
||||
{ 157, 6, 21, 8, 1, -16 }, // 0x28 '('
|
||||
{ 173, 6, 21, 8, 1, -16 }, // 0x29 ')'
|
||||
{ 189, 11, 11, 13, 1, -17 }, // 0x2A '*'
|
||||
{ 205, 11, 11, 13, 1, -13 }, // 0x2B '+'
|
||||
{ 221, 4, 6, 7, 1, -2 }, // 0x2C ','
|
||||
{ 224, 6, 3, 8, 1, -7 }, // 0x2D '-'
|
||||
{ 227, 4, 4, 7, 1, -3 }, // 0x2E '.'
|
||||
{ 229, 10, 17, 10, 0, -16 }, // 0x2F '/'
|
||||
{ 251, 12, 17, 13, 1, -16 }, // 0x30 '0'
|
||||
{ 277, 9, 17, 13, 1, -16 }, // 0x31 '1'
|
||||
{ 297, 12, 17, 13, 1, -16 }, // 0x32 '2'
|
||||
{ 323, 12, 17, 13, 1, -16 }, // 0x33 '3'
|
||||
{ 349, 13, 17, 13, 0, -16 }, // 0x34 '4'
|
||||
{ 377, 11, 17, 13, 1, -16 }, // 0x35 '5'
|
||||
{ 401, 12, 17, 13, 1, -16 }, // 0x36 '6'
|
||||
{ 427, 12, 17, 13, 1, -16 }, // 0x37 '7'
|
||||
{ 453, 12, 17, 13, 1, -16 }, // 0x38 '8'
|
||||
{ 479, 12, 17, 13, 1, -16 }, // 0x39 '9'
|
||||
{ 505, 4, 13, 7, 1, -12 }, // 0x3A ':'
|
||||
{ 512, 4, 16, 7, 1, -12 }, // 0x3B ';'
|
||||
{ 520, 11, 13, 13, 1, -14 }, // 0x3C '<'
|
||||
{ 538, 11, 7, 13, 1, -11 }, // 0x3D '='
|
||||
{ 548, 11, 13, 13, 1, -14 }, // 0x3E '>'
|
||||
{ 566, 11, 17, 11, 0, -16 }, // 0x3F '?'
|
||||
{ 590, 19, 19, 21, 1, -16 }, // 0x40 '@'
|
||||
{ 636, 16, 17, 16, 0, -16 }, // 0x41 'A'
|
||||
{ 670, 12, 17, 16, 2, -16 }, // 0x42 'B'
|
||||
{ 696, 13, 17, 15, 1, -16 }, // 0x43 'C'
|
||||
{ 724, 14, 17, 17, 2, -16 }, // 0x44 'D'
|
||||
{ 754, 10, 17, 13, 2, -16 }, // 0x45 'E'
|
||||
{ 776, 10, 17, 13, 2, -16 }, // 0x46 'F'
|
||||
{ 798, 14, 17, 17, 1, -16 }, // 0x47 'G'
|
||||
{ 828, 14, 17, 18, 2, -16 }, // 0x48 'H'
|
||||
{ 858, 7, 17, 9, 1, -16 }, // 0x49 'I'
|
||||
{ 873, 8, 22, 8, -2, -16 }, // 0x4A 'J'
|
||||
{ 895, 14, 17, 16, 2, -16 }, // 0x4B 'K'
|
||||
{ 925, 10, 17, 13, 2, -16 }, // 0x4C 'L'
|
||||
{ 947, 18, 17, 22, 2, -16 }, // 0x4D 'M'
|
||||
{ 986, 15, 17, 19, 2, -16 }, // 0x4E 'N'
|
||||
{ 1018, 16, 17, 19, 1, -16 }, // 0x4F 'O'
|
||||
{ 1052, 12, 17, 15, 2, -16 }, // 0x50 'P'
|
||||
{ 1078, 16, 21, 19, 1, -16 }, // 0x51 'Q'
|
||||
{ 1120, 13, 17, 15, 2, -16 }, // 0x52 'R'
|
||||
{ 1148, 11, 17, 13, 1, -16 }, // 0x53 'S'
|
||||
{ 1172, 13, 17, 14, 0, -16 }, // 0x54 'T'
|
||||
{ 1200, 14, 17, 18, 2, -16 }, // 0x55 'U'
|
||||
{ 1230, 15, 17, 15, 0, -16 }, // 0x56 'V'
|
||||
{ 1262, 23, 17, 23, 0, -16 }, // 0x57 'W'
|
||||
{ 1311, 16, 17, 16, 0, -16 }, // 0x58 'X'
|
||||
{ 1345, 15, 17, 15, 0, -16 }, // 0x59 'Y'
|
||||
{ 1377, 12, 17, 14, 1, -16 }, // 0x5A 'Z'
|
||||
{ 1403, 5, 21, 8, 2, -16 }, // 0x5B '['
|
||||
{ 1417, 10, 17, 10, 0, -16 }, // 0x5C '\'
|
||||
{ 1439, 5, 21, 8, 1, -16 }, // 0x5D ']'
|
||||
{ 1453, 12, 11, 13, 1, -16 }, // 0x5E '^'
|
||||
{ 1470, 10, 2, 10, 0, 3 }, // 0x5F '_'
|
||||
{ 1473, 7, 4, 9, 1, -17 }, // 0x60 '`'
|
||||
{ 1477, 11, 13, 14, 1, -12 }, // 0x61 'a'
|
||||
{ 1495, 12, 18, 15, 2, -17 }, // 0x62 'b'
|
||||
{ 1522, 10, 13, 12, 1, -12 }, // 0x63 'c'
|
||||
{ 1539, 12, 18, 15, 1, -17 }, // 0x64 'd'
|
||||
{ 1566, 12, 13, 14, 1, -12 }, // 0x65 'e'
|
||||
{ 1586, 10, 18, 9, 0, -17 }, // 0x66 'f'
|
||||
{ 1609, 12, 19, 15, 1, -12 }, // 0x67 'g'
|
||||
{ 1638, 12, 18, 15, 2, -17 }, // 0x68 'h'
|
||||
{ 1665, 3, 18, 7, 2, -17 }, // 0x69 'i'
|
||||
{ 1672, 6, 24, 7, -1, -17 }, // 0x6A 'j'
|
||||
{ 1690, 13, 18, 15, 2, -17 }, // 0x6B 'k'
|
||||
{ 1720, 3, 18, 7, 2, -17 }, // 0x6C 'l'
|
||||
{ 1727, 19, 13, 23, 2, -12 }, // 0x6D 'm'
|
||||
{ 1758, 12, 13, 15, 2, -12 }, // 0x6E 'n'
|
||||
{ 1778, 13, 13, 15, 1, -12 }, // 0x6F 'o'
|
||||
{ 1800, 12, 19, 15, 2, -12 }, // 0x70 'p'
|
||||
{ 1829, 12, 19, 15, 1, -12 }, // 0x71 'q'
|
||||
{ 1858, 8, 13, 11, 2, -12 }, // 0x72 'r'
|
||||
{ 1871, 10, 13, 12, 1, -12 }, // 0x73 's'
|
||||
{ 1888, 8, 16, 10, 1, -15 }, // 0x74 't'
|
||||
{ 1904, 12, 13, 15, 2, -12 }, // 0x75 'u'
|
||||
{ 1924, 13, 13, 13, 0, -12 }, // 0x76 'v'
|
||||
{ 1946, 20, 13, 20, 0, -12 }, // 0x77 'w'
|
||||
{ 1979, 13, 13, 14, 0, -12 }, // 0x78 'x'
|
||||
{ 2001, 13, 19, 13, 0, -12 }, // 0x79 'y'
|
||||
{ 2032, 10, 13, 12, 1, -12 }, // 0x7A 'z'
|
||||
{ 2049, 8, 21, 9, 0, -16 }, // 0x7B '{'
|
||||
{ 2070, 3, 23, 13, 5, -17 }, // 0x7C '|'
|
||||
{ 2079, 8, 21, 9, 1, -16 }, // 0x7D '}'
|
||||
{ 2100, 11, 4, 13, 1, -9 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Bold12pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Bold12pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Bold12pt7bGlyphs,
|
||||
0x20, 0x7E, 32 };
|
||||
|
||||
// Approx. 2778 bytes
|
||||
|
||||
#endif // NOTOSANSBOLD12PT7B_H
|
||||
@@ -0,0 +1,498 @@
|
||||
#ifndef NOTOSANSBOLD18PT7B_H
|
||||
#define NOTOSANSBOLD18PT7B_H
|
||||
const uint8_t NotoSans_Bold18pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x79, 0xE7,
|
||||
0x9E, 0x78, 0x00, 0x00, 0x7B, 0xFF, 0xFF, 0x78, 0xF8, 0xFF, 0xC7, 0xFE,
|
||||
0x3F, 0xF1, 0xE7, 0x8F, 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0xF0, 0x01,
|
||||
0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x80, 0x3C, 0x38,
|
||||
0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x0F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFB, 0xFF,
|
||||
0xFF, 0xC1, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x83,
|
||||
0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x83, 0xC7,
|
||||
0x80, 0x1C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03,
|
||||
0xC7, 0x80, 0x1C, 0x38, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x01,
|
||||
0xFF, 0x83, 0xFF, 0xF3, 0xFF, 0xFB, 0xFF, 0xFD, 0xFB, 0x1C, 0xF9, 0x80,
|
||||
0x7C, 0xC0, 0x3F, 0x60, 0x1F, 0xF0, 0x07, 0xFC, 0x01, 0xFF, 0xC0, 0x7F,
|
||||
0xF0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0xDF, 0xC0, 0x67, 0xE0, 0x31, 0xFC,
|
||||
0x19, 0xFF, 0xFF, 0xFB, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xF8, 0x01, 0xE0,
|
||||
0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7E,
|
||||
0x00, 0x7C, 0x03, 0xFC, 0x01, 0xE0, 0x1F, 0xF8, 0x0F, 0x00, 0x79, 0xE0,
|
||||
0x3C, 0x03, 0xE3, 0xC1, 0xE0, 0x0F, 0x0F, 0x07, 0x80, 0x3C, 0x3C, 0x3C,
|
||||
0x00, 0xF0, 0xF1, 0xF0, 0x03, 0xC3, 0xC7, 0x80, 0x0F, 0x0F, 0x3E, 0x00,
|
||||
0x3E, 0x7C, 0xF3, 0xF8, 0x79, 0xE7, 0x9F, 0xF1, 0xFF, 0x9E, 0x7F, 0xE3,
|
||||
0xFC, 0xF3, 0xE7, 0x87, 0xE3, 0xCF, 0x1E, 0x00, 0x1E, 0x3C, 0x7C, 0x00,
|
||||
0xF8, 0xF0, 0xF0, 0x03, 0xC3, 0xC3, 0xC0, 0x1F, 0x0F, 0x0F, 0x00, 0x78,
|
||||
0x3C, 0x7C, 0x03, 0xC0, 0xF1, 0xE0, 0x0F, 0x03, 0xE7, 0x80, 0x78, 0x07,
|
||||
0xFE, 0x01, 0xE0, 0x0F, 0xF0, 0x0F, 0x00, 0x1F, 0x80, 0x00, 0x60, 0x00,
|
||||
0x03, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0xF8, 0x7C, 0x00, 0x78, 0x3E, 0x00, 0x3E, 0x1F, 0x00, 0x1F, 0x1F,
|
||||
0x00, 0x0F, 0xDF, 0x80, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF,
|
||||
0x81, 0xF0, 0xFF, 0xC0, 0xF8, 0xFF, 0xF0, 0xFC, 0xFF, 0xFC, 0x7C, 0x7E,
|
||||
0x7F, 0x7E, 0x3E, 0x1F, 0xFF, 0x3F, 0x07, 0xFF, 0x1F, 0x81, 0xFF, 0x07,
|
||||
0xC0, 0x7F, 0x83, 0xF8, 0x7F, 0xC1, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC,
|
||||
0x1F, 0xFF, 0x7F, 0x03, 0xFE, 0x1F, 0xC0, 0xFF, 0xFF, 0xF7, 0xBD, 0xEF,
|
||||
0x78, 0x07, 0xC3, 0xE0, 0xF0, 0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xF0, 0x7C,
|
||||
0x1F, 0x07, 0x81, 0xE0, 0x78, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07,
|
||||
0x81, 0xE0, 0x7C, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x0F, 0x81, 0xE0, 0x7C,
|
||||
0x0F, 0x81, 0xE0, 0x3C, 0xF8, 0x1F, 0x03, 0xC0, 0xF8, 0x1E, 0x07, 0xC1,
|
||||
0xF0, 0x3C, 0x0F, 0x83, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x1F,
|
||||
0x07, 0xC1, 0xE0, 0x78, 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x3C, 0x1F, 0x07,
|
||||
0xC3, 0xE0, 0xF8, 0x7C, 0x1E, 0x0F, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00,
|
||||
0x78, 0x00, 0x38, 0x00, 0x1C, 0x03, 0x0E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x83, 0xF8, 0x01, 0xFC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF9,
|
||||
0xE0, 0xF8, 0xF8, 0x1C, 0x30, 0x04, 0x10, 0x00, 0x03, 0xC0, 0x01, 0xE0,
|
||||
0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x01, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00,
|
||||
0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0x3E, 0x7D, 0xF3,
|
||||
0xE7, 0xCF, 0x1E, 0x78, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7B,
|
||||
0xFF, 0xFF, 0x78, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0x80, 0x3E, 0x00, 0xF8,
|
||||
0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x03, 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0,
|
||||
0x07, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF0,
|
||||
0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x00, 0x00,
|
||||
0x40, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0xFF, 0xF8, 0x3F, 0xFF, 0x1F, 0x87,
|
||||
0xE7, 0xC0, 0xF9, 0xF0, 0x3E, 0x7C, 0x0F, 0xBF, 0x03, 0xFF, 0xC0, 0xFF,
|
||||
0xF0, 0x1F, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x3F, 0xFC,
|
||||
0x0F, 0xDF, 0x03, 0xF7, 0xC0, 0xF9, 0xF0, 0x3E, 0x7E, 0x0F, 0x8F, 0x87,
|
||||
0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xFE, 0x01, 0xFE, 0x00, 0x01, 0xF8,
|
||||
0x1F, 0xC1, 0xFE, 0x1F, 0xF3, 0xFF, 0xBF, 0xFF, 0xF7, 0xEF, 0x3F, 0x31,
|
||||
0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F,
|
||||
0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0,
|
||||
0x3F, 0x01, 0xF8, 0x00, 0x40, 0x03, 0xFF, 0x03, 0xFF, 0xE1, 0xFF, 0xFC,
|
||||
0xFF, 0xFF, 0x8F, 0x07, 0xE3, 0x80, 0xF8, 0x40, 0x3E, 0x00, 0x0F, 0x80,
|
||||
0x03, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F,
|
||||
0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00,
|
||||
0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xF0, 0x00, 0xC0, 0x07, 0xFF, 0x07, 0xFF, 0xE3, 0xFF, 0xFC, 0x7F,
|
||||
0xFF, 0x8E, 0x07, 0xE2, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07,
|
||||
0xC0, 0x03, 0xF0, 0x3F, 0xF0, 0x0F, 0xF0, 0x03, 0xFF, 0x00, 0xFF, 0xF0,
|
||||
0x00, 0xFE, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x80,
|
||||
0x0F, 0xF8, 0x0F, 0xEF, 0xFF, 0xFB, 0xFF, 0xFC, 0xFF, 0xFE, 0x0F, 0xFE,
|
||||
0x00, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x7F, 0x80, 0x1F,
|
||||
0xF0, 0x03, 0xFE, 0x00, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xBF, 0x01, 0xE7,
|
||||
0xE0, 0x7C, 0xFC, 0x0F, 0x1F, 0x83, 0xC3, 0xF0, 0xF8, 0x7E, 0x1E, 0x0F,
|
||||
0xC7, 0x81, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F,
|
||||
0x00, 0x7F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x8F, 0xFF, 0xC7, 0xC0, 0x03,
|
||||
0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7F, 0xF8, 0x3F, 0xFF,
|
||||
0x1F, 0xFF, 0xCF, 0xFF, 0xF1, 0x87, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00,
|
||||
0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xD0, 0x07, 0xEE, 0x07, 0xF7, 0xFF, 0xF3,
|
||||
0xFF, 0xF9, 0xFF, 0xF0, 0x7F, 0xF0, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0xC0,
|
||||
0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x01, 0xF0,
|
||||
0x00, 0x7C, 0x00, 0x1E, 0x7F, 0x8F, 0xBF, 0xF3, 0xFF, 0xFE, 0xFF, 0xFF,
|
||||
0xBF, 0x83, 0xFF, 0xC0, 0xFF, 0xF0, 0x1F, 0xFC, 0x07, 0xFF, 0x01, 0xF7,
|
||||
0xC0, 0x7D, 0xF0, 0x3F, 0x7E, 0x1F, 0x8F, 0xFF, 0xE1, 0xFF, 0xF0, 0x3F,
|
||||
0xF8, 0x07, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F,
|
||||
0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3F, 0x00,
|
||||
0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F,
|
||||
0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x0F, 0xFC, 0x07, 0xFF, 0x83, 0xFF, 0xF1, 0xFC, 0xFE, 0x7C, 0x0F,
|
||||
0x9F, 0x03, 0xE7, 0xC0, 0xF9, 0xF0, 0x3E, 0x3E, 0x1F, 0x0F, 0xFF, 0xC1,
|
||||
0xFF, 0xE0, 0x3F, 0xE0, 0x0F, 0xFC, 0x07, 0xFF, 0x83, 0xF3, 0xF1, 0xF8,
|
||||
0x7E, 0x7C, 0x0F, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F,
|
||||
0xDF, 0xFF, 0xE7, 0xFF, 0xF8, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0x0F, 0xF8,
|
||||
0x07, 0xFF, 0x03, 0xFF, 0xE1, 0xFF, 0xFC, 0x7E, 0x1F, 0xBF, 0x03, 0xEF,
|
||||
0x80, 0xFB, 0xE0, 0x3F, 0xF8, 0x07, 0xFE, 0x03, 0xFF, 0xC0, 0xFD, 0xF8,
|
||||
0x7F, 0x7F, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0x7C, 0x3F, 0x9E, 0x00, 0x07,
|
||||
0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x7F, 0x0F, 0xFF, 0x83,
|
||||
0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0, 0x00, 0x33, 0xFF, 0xFF, 0xFD, 0xE0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xDE, 0x18, 0xFD,
|
||||
0xFB, 0xF7, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x7D, 0xF3, 0xE7, 0xCF, 0x1E, 0x78, 0xF0, 0x00, 0x00, 0x80, 0x01,
|
||||
0xC0, 0x03, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0x80, 0x7F,
|
||||
0x00, 0xFE, 0x00, 0x7C, 0x00, 0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x00,
|
||||
0x3F, 0xE0, 0x07, 0xFE, 0x00, 0x7F, 0x00, 0x0F, 0x80, 0x01, 0xC0, 0x00,
|
||||
0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xE0, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x0F, 0xF8, 0x00,
|
||||
0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xC0, 0x1F,
|
||||
0xE0, 0x3F, 0xC0, 0xFF, 0x81, 0xFF, 0x03, 0xFE, 0x01, 0xF8, 0x00, 0xF0,
|
||||
0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xF8, 0xFF, 0xFC,
|
||||
0x7F, 0xFE, 0x7F, 0xFF, 0x30, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
|
||||
0x00, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xC0,
|
||||
0x07, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x07, 0xC0, 0x00, 0x7F,
|
||||
0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0xFE, 0x01, 0xF8,
|
||||
0x1F, 0x80, 0x07, 0xC3, 0xE0, 0x00, 0x3C, 0x3C, 0x0F, 0xC1, 0xE7, 0x83,
|
||||
0xFF, 0x9E, 0x78, 0x7F, 0xF8, 0xFF, 0x0F, 0xCF, 0x8F, 0xF1, 0xF0, 0x78,
|
||||
0xFF, 0x1E, 0x07, 0x8F, 0xF1, 0xE0, 0xF0, 0xFF, 0x1E, 0x0F, 0x0F, 0xF1,
|
||||
0xE0, 0xF0, 0xFF, 0x1E, 0x0F, 0x0F, 0xF1, 0xE0, 0xF1, 0xEF, 0x1F, 0x1F,
|
||||
0x9E, 0xF0, 0xFF, 0xFF, 0xCF, 0x0F, 0xFB, 0xF8, 0x78, 0x3E, 0x1F, 0x07,
|
||||
0xC0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xF0, 0x00, 0xC0, 0x1F, 0xFB,
|
||||
0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x80,
|
||||
0x01, 0xFF, 0x80, 0x01, 0xF7, 0xC0, 0x03, 0xE7, 0xC0, 0x03, 0xE7, 0xC0,
|
||||
0x03, 0xE7, 0xE0, 0x07, 0xE3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC3, 0xF0,
|
||||
0x0F, 0xC1, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF8, 0x1F, 0xFF, 0xF8,
|
||||
0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x00, 0x7C,
|
||||
0x3E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7C, 0x00, 0x3F,
|
||||
0xFC, 0x00, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF,
|
||||
0xEF, 0x81, 0xFD, 0xF0, 0x1F, 0xBE, 0x03, 0xF7, 0xC0, 0x7E, 0xF8, 0x0F,
|
||||
0xDF, 0x03, 0xF3, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF,
|
||||
0x3E, 0x07, 0xF7, 0xC0, 0x3E, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F,
|
||||
0xFC, 0x07, 0xEF, 0x81, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xE7, 0xFF, 0xF8,
|
||||
0xFF, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xF0, 0xFF,
|
||||
0xFE, 0x1F, 0xFF, 0xE3, 0xF8, 0x1C, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0x7C,
|
||||
0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F,
|
||||
0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x7C, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x23, 0xFC, 0x1E, 0x3F, 0xFF,
|
||||
0xE1, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xF8, 0xFF, 0xF8, 0x07, 0xFF,
|
||||
0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0x83, 0xFE, 0x7C, 0x03, 0xF3,
|
||||
0xE0, 0x0F, 0xDF, 0x00, 0x7E, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00,
|
||||
0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF,
|
||||
0x00, 0x3F, 0xF8, 0x01, 0xF7, 0xC0, 0x1F, 0xBE, 0x01, 0xFD, 0xF0, 0x1F,
|
||||
0xCF, 0x87, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF,
|
||||
0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F,
|
||||
0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xFF, 0xF7, 0xFF,
|
||||
0xEF, 0xFF, 0xDF, 0xFF, 0xBF, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03,
|
||||
0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00,
|
||||
0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xFF, 0xEF,
|
||||
0xFF, 0xDF, 0xFF, 0xBF, 0xFF, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0,
|
||||
0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x00,
|
||||
0x00, 0x04, 0x00, 0x0F, 0xFF, 0x01, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFF,
|
||||
0xFF, 0x1F, 0xE0, 0x30, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x07,
|
||||
0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC1, 0xFF, 0xFE, 0x0F,
|
||||
0xFF, 0xF0, 0x7F, 0xFF, 0x83, 0xFF, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xDF,
|
||||
0x00, 0x7E, 0xFC, 0x03, 0xF7, 0xF0, 0x1F, 0x9F, 0xE0, 0xFC, 0x7F, 0xFF,
|
||||
0xE1, 0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFC, 0x01, 0xFF,
|
||||
0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x1F, 0xFE, 0x00,
|
||||
0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07,
|
||||
0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8,
|
||||
0x03, 0xFF, 0xC0, 0x1F, 0xFE, 0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x3F,
|
||||
0xFC, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFC, 0x1F, 0x81, 0xF8,
|
||||
0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8,
|
||||
0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x87, 0xFE,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03,
|
||||
0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03,
|
||||
0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03,
|
||||
0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x7E, 0xFF,
|
||||
0xEF, 0xFC, 0xFF, 0x8F, 0xF0, 0xFC, 0x03, 0xFF, 0xC0, 0x7E, 0xFC, 0x0F,
|
||||
0xCF, 0xC1, 0xF8, 0xFC, 0x1F, 0x8F, 0xC3, 0xF0, 0xFC, 0x7E, 0x0F, 0xCF,
|
||||
0xC0, 0xFC, 0xFC, 0x0F, 0xDF, 0x80, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF,
|
||||
0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xFC, 0x0F, 0xCF, 0xC0, 0xFC, 0x7E, 0x0F,
|
||||
0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC1, 0xF8, 0xFC, 0x0F, 0xCF, 0xC0, 0xFC,
|
||||
0xFC, 0x07, 0xEF, 0xC0, 0x7E, 0xFC, 0x03, 0xF0, 0xF8, 0x00, 0xF8, 0x00,
|
||||
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||
0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF,
|
||||
0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFE, 0x03,
|
||||
0xDF, 0xFB, 0xC0, 0x7B, 0xFF, 0x78, 0x0F, 0x7F, 0xEF, 0x83, 0xEF, 0xFC,
|
||||
0xF0, 0x79, 0xFF, 0x9E, 0x0F, 0x3F, 0xF3, 0xE3, 0xE7, 0xFE, 0x3C, 0x78,
|
||||
0xFF, 0xC7, 0x8F, 0x1F, 0xF8, 0xFB, 0xE3, 0xFF, 0x0F, 0x78, 0x7F, 0xE1,
|
||||
0xEF, 0x0F, 0xFC, 0x3F, 0xE1, 0xFF, 0x87, 0xF8, 0x3F, 0xF0, 0x7F, 0x07,
|
||||
0xFE, 0x0F, 0xE0, 0xFF, 0xC1, 0xF8, 0x1F, 0xF8, 0x1F, 0x03, 0xE0, 0xFE,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0,
|
||||
0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x03, 0xFE, 0xF8, 0x0F, 0xFB, 0xF0, 0x3F,
|
||||
0xE7, 0xE0, 0xFF, 0x9F, 0x83, 0xFE, 0x3F, 0x0F, 0xF8, 0x7C, 0x3F, 0xE1,
|
||||
0xF8, 0xFF, 0x83, 0xE3, 0xFE, 0x0F, 0xCF, 0xF8, 0x1F, 0xBF, 0xE0, 0x7E,
|
||||
0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x0F, 0xFF,
|
||||
0x80, 0x3F, 0xFE, 0x00, 0x7F, 0xF8, 0x01, 0xFC, 0x00, 0x18, 0x00, 0x03,
|
||||
0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F,
|
||||
0x81, 0xFC, 0x7F, 0x00, 0xFE, 0x7E, 0x00, 0x7E, 0x7C, 0x00, 0x7E, 0xFC,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0xFC, 0x3F,
|
||||
0xC3, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01,
|
||||
0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0xFF, 0xDF, 0xFF, 0xEF, 0x83,
|
||||
0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE,
|
||||
0x07, 0xFF, 0x1F, 0xFF, 0xFF, 0xF7, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0xE0,
|
||||
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||
0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03,
|
||||
0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F,
|
||||
0x81, 0xFC, 0x7F, 0x00, 0xFE, 0x7E, 0x00, 0x7E, 0x7C, 0x00, 0x7E, 0xFC,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0xFC, 0x3F,
|
||||
0xC3, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01,
|
||||
0xFF, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF,
|
||||
0xE0, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0xF8, 0x3F, 0x8F, 0x80, 0xF8, 0xF8,
|
||||
0x0F, 0xCF, 0x80, 0xFC, 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F,
|
||||
0xFF, 0xF0, 0xFF, 0xFE, 0x0F, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0x8F, 0xC0,
|
||||
0xF8, 0x7E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0x0F, 0x81, 0xF8, 0xF8, 0x1F,
|
||||
0x8F, 0x80, 0xFC, 0xF8, 0x07, 0xEF, 0x80, 0x7E, 0xF8, 0x03, 0xF0, 0x00,
|
||||
0x80, 0x0F, 0xFC, 0x3F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, 0xFC, 0x0E, 0xF8,
|
||||
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x3F,
|
||||
0xF0, 0x1F, 0xF8, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00,
|
||||
0x1F, 0x00, 0x1F, 0x80, 0x3F, 0xF0, 0x7F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF,
|
||||
0xF8, 0x7F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
|
||||
0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
||||
0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0,
|
||||
0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80,
|
||||
0x03, 0xF0, 0x00, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0,
|
||||
0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F,
|
||||
0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80,
|
||||
0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF8, 0x01, 0xFF,
|
||||
0xE0, 0x0F, 0xFF, 0x00, 0x7C, 0xF8, 0x07, 0xE7, 0xF0, 0x7F, 0x1F, 0xFF,
|
||||
0xF0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x07, 0xFE, 0x00, 0xFC, 0x00, 0x7E,
|
||||
0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF3, 0xF0, 0x07, 0xE3, 0xE0, 0x0F, 0x87,
|
||||
0xC0, 0x1F, 0x0F, 0x80, 0x7E, 0x0F, 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E,
|
||||
0x07, 0xE0, 0x3E, 0x0F, 0x80, 0x7C, 0x1F, 0x00, 0xF8, 0x7E, 0x00, 0xF8,
|
||||
0xF8, 0x01, 0xF1, 0xF0, 0x03, 0xE3, 0xE0, 0x03, 0xEF, 0x80, 0x07, 0xDF,
|
||||
0x00, 0x0F, 0xBE, 0x00, 0x0F, 0x78, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0xF8, 0x03, 0xF0,
|
||||
0x07, 0xFF, 0x00, 0xFC, 0x03, 0xF7, 0xC0, 0x3F, 0x00, 0xF9, 0xF0, 0x0F,
|
||||
0xE0, 0x3E, 0x7C, 0x07, 0xF8, 0x0F, 0x9F, 0x81, 0xFE, 0x07, 0xE3, 0xE0,
|
||||
0x7F, 0x81, 0xF0, 0xF8, 0x1F, 0xF0, 0x7C, 0x3E, 0x0F, 0xFC, 0x1F, 0x0F,
|
||||
0xC3, 0xCF, 0x07, 0xC1, 0xF0, 0xF3, 0xC3, 0xE0, 0x7C, 0x7C, 0xF8, 0xF8,
|
||||
0x1F, 0x1F, 0x3E, 0x3E, 0x07, 0xC7, 0x87, 0x8F, 0x80, 0xF9, 0xE1, 0xE7,
|
||||
0xC0, 0x3E, 0xF8, 0x7D, 0xF0, 0x0F, 0xBE, 0x1F, 0x7C, 0x01, 0xEF, 0x03,
|
||||
0xDF, 0x00, 0x7B, 0xC0, 0xF7, 0x80, 0x1F, 0xF0, 0x3F, 0xE0, 0x07, 0xFC,
|
||||
0x0F, 0xF8, 0x00, 0xFE, 0x01, 0xFE, 0x00, 0x3F, 0x80, 0x7F, 0x00, 0x0F,
|
||||
0xE0, 0x1F, 0xC0, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0xFE, 0x7E,
|
||||
0x01, 0xF8, 0xFC, 0x07, 0xE0, 0xFC, 0x0F, 0xC0, 0xF8, 0x3F, 0x01, 0xF8,
|
||||
0xFC, 0x01, 0xF9, 0xF8, 0x01, 0xF7, 0xE0, 0x03, 0xFF, 0x80, 0x03, 0xFF,
|
||||
0x00, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xE0,
|
||||
0x00, 0x7F, 0xC0, 0x01, 0xFF, 0xC0, 0x03, 0xEF, 0xC0, 0x0F, 0xCF, 0x80,
|
||||
0x3F, 0x1F, 0x80, 0x7E, 0x1F, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x3F, 0x0F,
|
||||
0xC0, 0x3F, 0x3F, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0xFD, 0xF8,
|
||||
0x07, 0xE7, 0xE0, 0x1F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x1F,
|
||||
0x80, 0xF8, 0x7C, 0x03, 0xF3, 0xF0, 0x07, 0xCF, 0x80, 0x1F, 0xFE, 0x00,
|
||||
0x3F, 0xF0, 0x00, 0xFF, 0xC0, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x0F,
|
||||
0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x3F, 0x00, 0x00, 0xFC, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF,
|
||||
0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x01, 0xF0,
|
||||
0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00,
|
||||
0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00,
|
||||
0xFC, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x87, 0xC3,
|
||||
0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8,
|
||||
0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F,
|
||||
0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x00, 0x3E,
|
||||
0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x01,
|
||||
0xE0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0,
|
||||
0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x7C,
|
||||
0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||
0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x00, 0x78, 0x00,
|
||||
0x3E, 0x00, 0x0F, 0xC0, 0x07, 0xF0, 0x01, 0xDE, 0x00, 0xF7, 0x80, 0x3C,
|
||||
0xF0, 0x1E, 0x3C, 0x07, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0x3C, 0x78, 0x0F,
|
||||
0x9E, 0x01, 0xE7, 0x80, 0x7F, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF8, 0xFE, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x70, 0x00, 0x60, 0x03,
|
||||
0xFF, 0x83, 0xFF, 0xF0, 0x7F, 0xFE, 0x1F, 0x1F, 0x82, 0x03, 0xE0, 0x00,
|
||||
0xFC, 0x00, 0x3F, 0x03, 0xFF, 0xC7, 0xFF, 0xF3, 0xFF, 0xFD, 0xFC, 0x3F,
|
||||
0x7C, 0x0F, 0xFF, 0x03, 0xFF, 0xC0, 0xFF, 0xF0, 0x7F, 0x7F, 0xFF, 0xDF,
|
||||
0xFF, 0xF3, 0xFF, 0x7C, 0x7F, 0x0F, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80,
|
||||
0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x80,
|
||||
0xF9, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFC, 0x1F, 0xBE,
|
||||
0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80,
|
||||
0xFF, 0xE0, 0x3E, 0xF8, 0x0F, 0xBF, 0x07, 0xEF, 0xE3, 0xFB, 0xFF, 0xFC,
|
||||
0xFF, 0xFF, 0x3D, 0xFF, 0x8F, 0x1F, 0xC0, 0x00, 0xC0, 0x1F, 0xFC, 0x7F,
|
||||
0xF9, 0xFF, 0xF7, 0xFF, 0xCF, 0xC0, 0xBF, 0x00, 0x7C, 0x00, 0xF8, 0x01,
|
||||
0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80, 0x3F, 0x00, 0x3F,
|
||||
0x07, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF8, 0x3F, 0xE0, 0x00, 0x0F, 0xC0,
|
||||
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
|
||||
0xFC, 0x0C, 0x3F, 0x1F, 0xEF, 0xCF, 0xFD, 0xF7, 0xFF, 0xFD, 0xFF, 0xFF,
|
||||
0xFE, 0x1F, 0xFF, 0x03, 0xFF, 0x80, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
|
||||
0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x0F, 0xFF, 0x03, 0xFF, 0xE1,
|
||||
0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFD, 0xF0, 0xFC, 0x7C, 0x00, 0xC0,
|
||||
0x07, 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE7, 0xE3, 0xF3, 0xE0, 0x7F, 0xF0,
|
||||
0x3F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x02, 0x7F, 0xFF, 0x1F, 0xFF,
|
||||
0x87, 0xFF, 0xC0, 0xFF, 0xC0, 0x03, 0xF8, 0x3F, 0xF1, 0xFF, 0xC7, 0xFE,
|
||||
0x1F, 0x88, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x7F, 0xF3, 0xFF, 0xCF, 0xFF,
|
||||
0x3F, 0xFC, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C,
|
||||
0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F,
|
||||
0x00, 0x7C, 0x01, 0xF0, 0x00, 0x03, 0x00, 0x07, 0xF9, 0xF3, 0xFF, 0x7D,
|
||||
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF8,
|
||||
0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x03,
|
||||
0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0x7F, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC,
|
||||
0x3F, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF9, 0x80, 0x7E, 0x7F,
|
||||
0xFF, 0x9F, 0xFF, 0xC7, 0xFF, 0xE1, 0xFF, 0xE0, 0xF8, 0x00, 0x7C, 0x00,
|
||||
0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0,
|
||||
0x60, 0xF9, 0xFE, 0x7F, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF,
|
||||
0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03,
|
||||
0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8,
|
||||
0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xE0, 0x39, 0xFF, 0xFF, 0x7C, 0x00, 0x00,
|
||||
0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF,
|
||||
0x7D, 0xF7, 0xC0, 0x03, 0x81, 0xF0, 0xFC, 0x3F, 0x07, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07,
|
||||
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
||||
0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xFF, 0xFF, 0xFF, 0xBF, 0xCF, 0xE0, 0xF8,
|
||||
0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0,
|
||||
0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xDF, 0x03, 0xF3, 0xE0,
|
||||
0xFC, 0x7C, 0x3F, 0x0F, 0x8F, 0xC1, 0xF3, 0xF0, 0x3E, 0xFC, 0x07, 0xDF,
|
||||
0x00, 0xFF, 0xE0, 0x1F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xCF,
|
||||
0xC1, 0xF0, 0xFC, 0x3E, 0x0F, 0xC7, 0xC1, 0xF8, 0xF8, 0x1F, 0x9F, 0x01,
|
||||
0xFB, 0xE0, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x20, 0x06,
|
||||
0x07, 0x9F, 0xF1, 0xFE, 0x3D, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF,
|
||||
0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xE0, 0xFF, 0xF0, 0x7F, 0x07, 0xFF, 0x03,
|
||||
0xF0, 0x3F, 0xF8, 0x0F, 0x80, 0xFF, 0xC0, 0x7C, 0x07, 0xFE, 0x03, 0xE0,
|
||||
0x3F, 0xF0, 0x1F, 0x01, 0xFF, 0x80, 0xF8, 0x0F, 0xFC, 0x07, 0xC0, 0x7F,
|
||||
0xE0, 0x3E, 0x03, 0xFF, 0x01, 0xF0, 0x1F, 0xF8, 0x0F, 0x80, 0xFF, 0xC0,
|
||||
0x7C, 0x07, 0xFE, 0x03, 0xE0, 0x3F, 0xF0, 0x1F, 0x01, 0xF0, 0x00, 0x20,
|
||||
0x79, 0xFF, 0x3D, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xF0,
|
||||
0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF,
|
||||
0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07,
|
||||
0xFE, 0x03, 0xFF, 0x01, 0xF0, 0x00, 0xE0, 0x03, 0xFF, 0x01, 0xFF, 0xE0,
|
||||
0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x03, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8,
|
||||
0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
|
||||
0xFF, 0xC0, 0xFD, 0xF8, 0x7E, 0x7F, 0xFF, 0x8F, 0xFF, 0xC1, 0xFF, 0xE0,
|
||||
0x1F, 0xE0, 0x00, 0x30, 0x3C, 0x7F, 0x0F, 0x7F, 0xE3, 0xFF, 0xFC, 0xFF,
|
||||
0xFF, 0xBF, 0x07, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xFE, 0x03,
|
||||
0xFF, 0x80, 0xFF, 0xE0, 0x3F, 0xF8, 0x0F, 0xBE, 0x03, 0xEF, 0xC1, 0xFB,
|
||||
0xF8, 0xFE, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xE7, 0xF0, 0xF8,
|
||||
0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00,
|
||||
0x0F, 0x80, 0x03, 0xE0, 0x00, 0x03, 0x00, 0x07, 0xF9, 0xF3, 0xFF, 0x7D,
|
||||
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF8,
|
||||
0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x03,
|
||||
0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0x7F, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC,
|
||||
0x3F, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00,
|
||||
0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x3F, 0x1F, 0xF3,
|
||||
0xFF, 0x7F, 0xFF, 0xFF, 0xF9, 0xFC, 0x0F, 0xC0, 0xF8, 0x0F, 0x80, 0xF8,
|
||||
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
|
||||
0x0F, 0x80, 0x03, 0x00, 0xFF, 0xE7, 0xFF, 0xFF, 0xFE, 0xF8, 0x3B, 0xE0,
|
||||
0x2F, 0x80, 0x3F, 0x80, 0xFF, 0x81, 0xFF, 0x83, 0xFF, 0x83, 0xFF, 0x01,
|
||||
0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xBF,
|
||||
0xF8, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80,
|
||||
0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0xF1, 0xFF, 0x87,
|
||||
0xFC, 0x1F, 0xE0, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F,
|
||||
0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F, 0xFC, 0x07, 0xFF,
|
||||
0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F, 0xFC, 0x07, 0xDF, 0x03, 0xF7, 0xE1,
|
||||
0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFC, 0xF1, 0xFE, 0x3C, 0xFC, 0x03,
|
||||
0xF7, 0xC0, 0x3E, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x3E, 0x07, 0xC3, 0xE0,
|
||||
0x7C, 0x1F, 0x0F, 0xC1, 0xF0, 0xF8, 0x1F, 0x0F, 0x80, 0xF9, 0xF0, 0x0F,
|
||||
0x9F, 0x00, 0xF9, 0xF0, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x03, 0xFE, 0x00,
|
||||
0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0xFC, 0x0F,
|
||||
0xC0, 0xFD, 0xF0, 0x3F, 0x03, 0xE7, 0xC0, 0xFE, 0x0F, 0x9F, 0x87, 0xF8,
|
||||
0x3E, 0x3E, 0x1F, 0xE1, 0xF0, 0xF8, 0x7B, 0x87, 0xC3, 0xE3, 0xCF, 0x1F,
|
||||
0x07, 0xCF, 0x3C, 0x7C, 0x1F, 0x3C, 0xF3, 0xE0, 0x7C, 0xF3, 0xCF, 0x81,
|
||||
0xF3, 0x87, 0xBE, 0x03, 0xDE, 0x1E, 0xF0, 0x0F, 0xF8, 0x7B, 0xC0, 0x3F,
|
||||
0xE1, 0xFF, 0x00, 0x7F, 0x83, 0xFC, 0x01, 0xFC, 0x0F, 0xE0, 0x07, 0xF0,
|
||||
0x3F, 0x80, 0x1F, 0xC0, 0xFE, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0xFE, 0x07,
|
||||
0xF3, 0xF0, 0x7E, 0x3F, 0x0F, 0xC1, 0xF8, 0xF8, 0x0F, 0x9F, 0x80, 0xFF,
|
||||
0xF0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x03,
|
||||
0xFE, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFD, 0xF8, 0x1F, 0x9F, 0x83,
|
||||
0xF0, 0xFC, 0x3F, 0x07, 0xE7, 0xE0, 0x7E, 0xFC, 0x03, 0xF0, 0xFC, 0x03,
|
||||
0xF7, 0xC0, 0x3E, 0x7E, 0x03, 0xE7, 0xE0, 0x7E, 0x3E, 0x07, 0xC3, 0xF0,
|
||||
0x7C, 0x1F, 0x0F, 0xC1, 0xF0, 0xF8, 0x1F, 0x0F, 0x80, 0xF9, 0xF0, 0x0F,
|
||||
0x9F, 0x00, 0x79, 0xF0, 0x07, 0xDE, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00,
|
||||
0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x80,
|
||||
0x01, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x07, 0xFE, 0x00, 0x7F, 0xC0,
|
||||
0x07, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFE, 0xFF, 0xFD, 0xFF, 0xFB,
|
||||
0xFF, 0xF0, 0x0F, 0xC0, 0x1F, 0x00, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x0F,
|
||||
0x80, 0x3F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xE0, 0xFC, 0x3F, 0x87, 0xF0,
|
||||
0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x81, 0xF1,
|
||||
0xFE, 0x3F, 0x07, 0xC0, 0xFE, 0x0F, 0xE0, 0x7C, 0x07, 0x80, 0xF0, 0x1E,
|
||||
0x03, 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x3F, 0x07, 0xF0, 0x7E, 0x07, 0xC0,
|
||||
0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x0F, 0xE0, 0xFF, 0x0F,
|
||||
0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01,
|
||||
0xF0, 0x0F, 0x80, 0xFF, 0x07, 0xF0, 0x3F, 0x0F, 0xF0, 0xFE, 0x1F, 0x81,
|
||||
0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x3F, 0x0F,
|
||||
0xF0, 0xFE, 0x0F, 0xC0, 0x80, 0x00, 0x7F, 0x00, 0xFF, 0xF1, 0xFF, 0xFF,
|
||||
0xFD, 0xFF, 0xF8, 0x0F, 0xF4, 0x00, 0x00 };
|
||||
|
||||
const GFXglyph NotoSans_Bold18pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 6, 25, 10, 2, -24 }, // 0x21 '!'
|
||||
{ 20, 13, 9, 17, 2, -24 }, // 0x22 '"'
|
||||
{ 35, 21, 25, 23, 1, -24 }, // 0x23 '#'
|
||||
{ 101, 17, 29, 20, 2, -26 }, // 0x24 '$'
|
||||
{ 163, 30, 26, 32, 1, -25 }, // 0x25 '%'
|
||||
{ 261, 25, 26, 26, 1, -25 }, // 0x26 '&'
|
||||
{ 343, 5, 9, 9, 2, -24 }, // 0x27 '''
|
||||
{ 349, 10, 31, 12, 1, -24 }, // 0x28 '('
|
||||
{ 388, 10, 31, 12, 1, -24 }, // 0x29 ')'
|
||||
{ 427, 17, 17, 19, 1, -26 }, // 0x2A '*'
|
||||
{ 464, 17, 17, 20, 2, -20 }, // 0x2B '+'
|
||||
{ 501, 7, 9, 10, 1, -3 }, // 0x2C ','
|
||||
{ 509, 9, 5, 11, 1, -11 }, // 0x2D '-'
|
||||
{ 515, 6, 5, 10, 2, -4 }, // 0x2E '.'
|
||||
{ 519, 14, 25, 15, 0, -24 }, // 0x2F '/'
|
||||
{ 563, 18, 26, 20, 1, -25 }, // 0x30 '0'
|
||||
{ 622, 13, 25, 20, 2, -24 }, // 0x31 '1'
|
||||
{ 663, 18, 26, 20, 1, -25 }, // 0x32 '2'
|
||||
{ 722, 18, 26, 20, 1, -25 }, // 0x33 '3'
|
||||
{ 781, 19, 25, 20, 1, -24 }, // 0x34 '4'
|
||||
{ 841, 17, 25, 20, 2, -24 }, // 0x35 '5'
|
||||
{ 895, 18, 25, 20, 1, -24 }, // 0x36 '6'
|
||||
{ 952, 18, 25, 20, 1, -24 }, // 0x37 '7'
|
||||
{ 1009, 18, 25, 20, 1, -24 }, // 0x38 '8'
|
||||
{ 1066, 18, 25, 20, 1, -24 }, // 0x39 '9'
|
||||
{ 1123, 6, 20, 10, 2, -19 }, // 0x3A ':'
|
||||
{ 1138, 7, 25, 10, 1, -19 }, // 0x3B ';'
|
||||
{ 1160, 17, 19, 20, 2, -21 }, // 0x3C '<'
|
||||
{ 1201, 17, 11, 20, 2, -17 }, // 0x3D '='
|
||||
{ 1225, 17, 19, 20, 2, -21 }, // 0x3E '>'
|
||||
{ 1266, 16, 26, 17, 0, -25 }, // 0x3F '?'
|
||||
{ 1318, 28, 28, 32, 2, -24 }, // 0x40 '@'
|
||||
{ 1416, 24, 25, 24, 0, -24 }, // 0x41 'A'
|
||||
{ 1491, 19, 25, 23, 3, -24 }, // 0x42 'B'
|
||||
{ 1551, 20, 26, 23, 2, -25 }, // 0x43 'C'
|
||||
{ 1616, 21, 25, 26, 3, -24 }, // 0x44 'D'
|
||||
{ 1682, 15, 25, 20, 3, -24 }, // 0x45 'E'
|
||||
{ 1729, 15, 25, 19, 3, -24 }, // 0x46 'F'
|
||||
{ 1776, 21, 26, 26, 2, -25 }, // 0x47 'G'
|
||||
{ 1845, 21, 25, 27, 3, -24 }, // 0x48 'H'
|
||||
{ 1911, 12, 25, 14, 1, -24 }, // 0x49 'I'
|
||||
{ 1949, 12, 32, 12, -3, -24 }, // 0x4A 'J'
|
||||
{ 1997, 20, 25, 23, 3, -24 }, // 0x4B 'K'
|
||||
{ 2060, 16, 25, 20, 3, -24 }, // 0x4C 'L'
|
||||
{ 2110, 27, 25, 33, 3, -24 }, // 0x4D 'M'
|
||||
{ 2195, 22, 25, 29, 3, -24 }, // 0x4E 'N'
|
||||
{ 2264, 24, 26, 28, 2, -25 }, // 0x4F 'O'
|
||||
{ 2342, 17, 25, 22, 3, -24 }, // 0x50 'P'
|
||||
{ 2396, 24, 32, 28, 2, -25 }, // 0x51 'Q'
|
||||
{ 2492, 20, 25, 23, 3, -24 }, // 0x52 'R'
|
||||
{ 2555, 16, 26, 19, 2, -25 }, // 0x53 'S'
|
||||
{ 2607, 19, 25, 20, 1, -24 }, // 0x54 'T'
|
||||
{ 2667, 21, 25, 27, 3, -24 }, // 0x55 'U'
|
||||
{ 2733, 23, 25, 23, 0, -24 }, // 0x56 'V'
|
||||
{ 2805, 34, 25, 34, 0, -24 }, // 0x57 'W'
|
||||
{ 2912, 23, 25, 24, 0, -24 }, // 0x58 'X'
|
||||
{ 2984, 22, 25, 22, 0, -24 }, // 0x59 'Y'
|
||||
{ 3053, 19, 25, 20, 1, -24 }, // 0x5A 'Z'
|
||||
{ 3113, 9, 31, 12, 2, -24 }, // 0x5B '['
|
||||
{ 3148, 14, 25, 15, 0, -24 }, // 0x5C '\'
|
||||
{ 3192, 8, 31, 12, 1, -24 }, // 0x5D ']'
|
||||
{ 3223, 18, 16, 20, 1, -24 }, // 0x5E '^'
|
||||
{ 3259, 15, 3, 14, 0, 4 }, // 0x5F '_'
|
||||
{ 3265, 10, 6, 13, 1, -26 }, // 0x60 '`'
|
||||
{ 3273, 18, 20, 21, 1, -19 }, // 0x61 'a'
|
||||
{ 3318, 18, 27, 22, 3, -26 }, // 0x62 'b'
|
||||
{ 3379, 15, 20, 18, 2, -19 }, // 0x63 'c'
|
||||
{ 3417, 18, 27, 22, 2, -26 }, // 0x64 'd'
|
||||
{ 3478, 17, 20, 21, 2, -19 }, // 0x65 'e'
|
||||
{ 3521, 14, 27, 14, 1, -26 }, // 0x66 'f'
|
||||
{ 3569, 18, 28, 22, 2, -19 }, // 0x67 'g'
|
||||
{ 3632, 17, 27, 23, 3, -26 }, // 0x68 'h'
|
||||
{ 3690, 6, 27, 11, 2, -26 }, // 0x69 'i'
|
||||
{ 3711, 10, 35, 11, -2, -26 }, // 0x6A 'j'
|
||||
{ 3755, 19, 27, 22, 3, -26 }, // 0x6B 'k'
|
||||
{ 3820, 5, 27, 11, 3, -26 }, // 0x6C 'l'
|
||||
{ 3837, 29, 20, 34, 3, -19 }, // 0x6D 'm'
|
||||
{ 3910, 17, 20, 23, 3, -19 }, // 0x6E 'n'
|
||||
{ 3953, 18, 20, 22, 2, -19 }, // 0x6F 'o'
|
||||
{ 3998, 18, 28, 22, 3, -19 }, // 0x70 'p'
|
||||
{ 4061, 18, 28, 22, 2, -19 }, // 0x71 'q'
|
||||
{ 4124, 12, 20, 16, 3, -19 }, // 0x72 'r'
|
||||
{ 4154, 14, 20, 18, 2, -19 }, // 0x73 's'
|
||||
{ 4189, 13, 23, 15, 1, -22 }, // 0x74 't'
|
||||
{ 4227, 18, 19, 23, 2, -18 }, // 0x75 'u'
|
||||
{ 4270, 20, 19, 20, 0, -18 }, // 0x76 'v'
|
||||
{ 4318, 30, 19, 30, 0, -18 }, // 0x77 'w'
|
||||
{ 4390, 20, 19, 20, 0, -18 }, // 0x78 'x'
|
||||
{ 4438, 20, 27, 20, 0, -18 }, // 0x79 'y'
|
||||
{ 4506, 15, 19, 17, 1, -18 }, // 0x7A 'z'
|
||||
{ 4542, 11, 31, 14, 1, -24 }, // 0x7B '{'
|
||||
{ 4585, 4, 35, 19, 8, -26 }, // 0x7C '|'
|
||||
{ 4603, 12, 31, 14, 1, -24 }, // 0x7D '}'
|
||||
{ 4650, 17, 6, 20, 2, -14 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Bold18pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Bold18pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Bold18pt7bGlyphs,
|
||||
0x20, 0x7E, 48 };
|
||||
|
||||
// Approx. 5335 bytes
|
||||
|
||||
#endif // NOTOSANSBOLD18PT7B_H
|
||||
@@ -0,0 +1,801 @@
|
||||
#ifndef NOTOSANSBOLD24PT7B_H
|
||||
#define NOTOSANSBOLD24PT7B_H
|
||||
const uint8_t NotoSans_Bold24pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
|
||||
0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x10,
|
||||
0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x0F, 0xDF, 0x87, 0xEF, 0xC3, 0xF7, 0xE1,
|
||||
0xFB, 0xF0, 0xFD, 0xF8, 0x7E, 0xFC, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF,
|
||||
0x83, 0xE7, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x03, 0xE1, 0xF0, 0x00,
|
||||
0x3E, 0x1F, 0x00, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0x1F, 0x00, 0x07, 0xC1,
|
||||
0xF0, 0x00, 0x7C, 0x1E, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x3E, 0x00,
|
||||
0x0F, 0x83, 0xE0, 0x3F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF,
|
||||
0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0x07, 0xC0,
|
||||
0x01, 0xF0, 0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3E,
|
||||
0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xE0, 0x7C, 0x1F, 0x00, 0x07,
|
||||
0xC1, 0xF0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x3E,
|
||||
0x00, 0x0F, 0x83, 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0x0F, 0x87, 0xC0, 0x00,
|
||||
0xF8, 0x7C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00,
|
||||
0x01, 0xC0, 0x00, 0x3F, 0xFE, 0x01, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F,
|
||||
0xFF, 0xFE, 0x7F, 0xFF, 0xF9, 0xFF, 0xF7, 0xF3, 0xFC, 0xE0, 0xE7, 0xF1,
|
||||
0xC0, 0x0F, 0xE3, 0x80, 0x1F, 0xE7, 0x00, 0x3F, 0xEE, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF,
|
||||
0x80, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1D, 0xFF,
|
||||
0x00, 0x38, 0xFE, 0x00, 0x71, 0xFE, 0x00, 0xE3, 0xFF, 0x81, 0xCF, 0xFF,
|
||||
0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0x7F,
|
||||
0xFF, 0xE0, 0x1F, 0xFE, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03,
|
||||
0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x1F,
|
||||
0x00, 0x0F, 0xF8, 0x00, 0x3F, 0x00, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0x3F,
|
||||
0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFE, 0x00, 0xFC, 0x00, 0x7E, 0x3F, 0x00,
|
||||
0xF8, 0x00, 0x7C, 0x3F, 0x01, 0xF8, 0x00, 0x7C, 0x1F, 0x01, 0xF0, 0x00,
|
||||
0xFC, 0x1F, 0x03, 0xF0, 0x00, 0xFC, 0x1F, 0x03, 0xE0, 0x00, 0xFC, 0x1F,
|
||||
0x07, 0xE0, 0x00, 0xFC, 0x1F, 0x0F, 0xC0, 0x00, 0xFC, 0x1F, 0x0F, 0xC0,
|
||||
0x00, 0x7C, 0x1F, 0x1F, 0x83, 0xC0, 0x7C, 0x3F, 0x1F, 0x0F, 0xF0, 0x7E,
|
||||
0x3F, 0x3F, 0x3F, 0xF8, 0x7F, 0xFE, 0x3E, 0x3F, 0xFC, 0x3F, 0xFE, 0x7E,
|
||||
0x7F, 0xFE, 0x1F, 0xFC, 0x7C, 0x7E, 0x7E, 0x0F, 0xF8, 0xFC, 0xFC, 0x3E,
|
||||
0x07, 0xF0, 0xF8, 0xFC, 0x3F, 0x00, 0x01, 0xF8, 0xFC, 0x3F, 0x00, 0x03,
|
||||
0xF0, 0xFC, 0x3F, 0x00, 0x03, 0xE0, 0xFC, 0x3F, 0x00, 0x07, 0xE0, 0xFC,
|
||||
0x3F, 0x00, 0x07, 0xC0, 0xFC, 0x3F, 0x00, 0x0F, 0xC0, 0xFC, 0x3F, 0x00,
|
||||
0x0F, 0x80, 0xFC, 0x3F, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x00, 0x1F, 0x00,
|
||||
0x7E, 0x7E, 0x00, 0x3F, 0x00, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x3F, 0xFC,
|
||||
0x00, 0x7C, 0x00, 0x1F, 0xF8, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x01, 0xFF,
|
||||
0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xBF, 0xE0, 0x00, 0x7F,
|
||||
0x07, 0xF0, 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x1F, 0x81, 0xFC, 0x00, 0x0F,
|
||||
0xC0, 0xFE, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x00,
|
||||
0xFE, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00,
|
||||
0x07, 0xFF, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0x0F, 0xFF, 0x80, 0x7F,
|
||||
0x0F, 0xFF, 0xE0, 0x3F, 0x8F, 0xFF, 0xF8, 0x3F, 0xC7, 0xF9, 0xFE, 0x1F,
|
||||
0xC7, 0xF8, 0x7F, 0x8F, 0xE3, 0xFC, 0x1F, 0xEF, 0xE1, 0xFC, 0x07, 0xFF,
|
||||
0xF0, 0xFE, 0x01, 0xFF, 0xF0, 0x7F, 0x00, 0x7F, 0xF8, 0x3F, 0xC0, 0x1F,
|
||||
0xF8, 0x1F, 0xF0, 0x0F, 0xFC, 0x07, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF,
|
||||
0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||
0xF1, 0xFF, 0x01, 0xFF, 0xE0, 0x7F, 0xC0, 0xFF, 0xFF, 0xF7, 0xEF, 0xDF,
|
||||
0xBF, 0x7E, 0xFC, 0xF9, 0xF3, 0xE7, 0xC0, 0x01, 0xF8, 0x1F, 0x81, 0xF8,
|
||||
0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xF0, 0x3F, 0x01, 0xF8, 0x1F,
|
||||
0xC0, 0xFC, 0x07, 0xE0, 0x3F, 0x03, 0xF8, 0x1F, 0x80, 0xFC, 0x07, 0xE0,
|
||||
0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07,
|
||||
0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F,
|
||||
0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFC,
|
||||
0x03, 0xF0, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x7E, 0x01, 0xF8, 0x0F, 0xE0,
|
||||
0x3F, 0x01, 0xF8, 0x07, 0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x01,
|
||||
0xF8, 0x0F, 0xC0, 0x7F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F,
|
||||
0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x07, 0xE0,
|
||||
0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0xFE, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F,
|
||||
0x81, 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0xFE, 0x00, 0x00, 0x7E, 0x00,
|
||||
0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00,
|
||||
0x0F, 0x80, 0x10, 0x1F, 0x00, 0xBC, 0x3E, 0x1E, 0x7F, 0xBD, 0xFE, 0xFF,
|
||||
0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xFE, 0x00, 0x1F,
|
||||
0xE0, 0x00, 0x7F, 0xE0, 0x01, 0xF7, 0xC0, 0x07, 0xEF, 0xC0, 0x0F, 0xCF,
|
||||
0xC0, 0x3F, 0x1F, 0xC0, 0xFE, 0x1F, 0x80, 0x78, 0x3E, 0x00, 0x30, 0x30,
|
||||
0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0,
|
||||
0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00,
|
||||
0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00,
|
||||
0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07,
|
||||
0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xCF, 0xE3, 0xF8,
|
||||
0xFC, 0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0x7E, 0x1F, 0x0F, 0xC0, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0xFE, 0xFF, 0xFF,
|
||||
0xFF, 0xFE, 0xFE, 0x10, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00,
|
||||
0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00,
|
||||
0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01,
|
||||
0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F,
|
||||
0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F,
|
||||
0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x03, 0xF8,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0,
|
||||
0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0xFF, 0xFF,
|
||||
0x83, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x1F, 0xE0, 0xFE, 0x3F, 0x80, 0xFE,
|
||||
0x7F, 0x01, 0xFD, 0xFC, 0x03, 0xFB, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF,
|
||||
0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0,
|
||||
0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x01,
|
||||
0xFE, 0xFE, 0x03, 0xF9, 0xFC, 0x07, 0xF3, 0xFC, 0x1F, 0xE3, 0xFC, 0x7F,
|
||||
0x87, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xC0,
|
||||
0x07, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0x01, 0xFF, 0x07,
|
||||
0xFF, 0x0F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7E,
|
||||
0x7F, 0x38, 0x7F, 0x10, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00,
|
||||
0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00,
|
||||
0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00,
|
||||
0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x01,
|
||||
0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x7F, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFF,
|
||||
0xFF, 0x9F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0x1E, 0x00, 0xFE, 0x18, 0x01,
|
||||
0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0,
|
||||
0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFC, 0x03, 0xFE, 0x00, 0x3F, 0xFF, 0x81, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF,
|
||||
0xC7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x08, 0x00, 0xFE,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xC0,
|
||||
0x00, 0x3F, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x07,
|
||||
0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xEF, 0xC0, 0xFF,
|
||||
0xDF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC0,
|
||||
0x7F, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFE,
|
||||
0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0xFF,
|
||||
0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0x3E,
|
||||
0xFE, 0x00, 0x3F, 0x7F, 0x00, 0x3F, 0x3F, 0x80, 0x1F, 0x1F, 0xC0, 0x1F,
|
||||
0x8F, 0xE0, 0x1F, 0x87, 0xF0, 0x0F, 0x83, 0xF8, 0x0F, 0xC1, 0xFC, 0x0F,
|
||||
0xC0, 0xFE, 0x07, 0xC0, 0x7F, 0x07, 0xE0, 0x3F, 0x87, 0xE0, 0x1F, 0xC3,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC1, 0xFF,
|
||||
0xFF, 0x83, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xC0, 0x00, 0x1F, 0x80,
|
||||
0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8,
|
||||
0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x78, 0x7F, 0xF0, 0x00, 0x1F, 0xE0,
|
||||
0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00,
|
||||
0x01, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF7, 0x00, 0x1F, 0xEF, 0xE1,
|
||||
0xFF, 0xDF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF,
|
||||
0xC0, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xF0, 0x07, 0xFF,
|
||||
0xE0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x07, 0xF8, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x03,
|
||||
0xF0, 0x00, 0x0F, 0xE1, 0xF8, 0x1F, 0x8F, 0xFC, 0x3F, 0x3F, 0xFC, 0x7E,
|
||||
0xFF, 0xFC, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB, 0xFE, 0x07, 0xFF, 0xF8,
|
||||
0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFD, 0xFC, 0x03, 0xFB, 0xFC, 0x0F,
|
||||
0xF3, 0xFC, 0x7F, 0xC7, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x07, 0xFF, 0xF8,
|
||||
0x07, 0xFF, 0xE0, 0x03, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC,
|
||||
0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x80,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0xC3,
|
||||
0xFF, 0xFF, 0x8F, 0xF8, 0xFF, 0x9F, 0xC0, 0x7F, 0x3F, 0x80, 0xFE, 0x7E,
|
||||
0x01, 0xFC, 0xFC, 0x03, 0xF9, 0xFC, 0x07, 0xF3, 0xFC, 0x1F, 0xC3, 0xFC,
|
||||
0x7F, 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, 0x03, 0xFF,
|
||||
0x80, 0x1F, 0xFF, 0x80, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0xC7, 0xF8, 0x7F,
|
||||
0xCF, 0xE0, 0x7F, 0xBF, 0x80, 0x3F, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x7F,
|
||||
0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x1F, 0xEF,
|
||||
0xFF, 0xFF, 0x9F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F,
|
||||
0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0x81, 0xFE, 0x7F,
|
||||
0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0xFF, 0x7F,
|
||||
0x80, 0xFF, 0x7F, 0xC3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF, 0x1F,
|
||||
0xFF, 0xBF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7E, 0x00,
|
||||
0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xFC, 0x00,
|
||||
0x03, 0xF8, 0x20, 0x1F, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x1F,
|
||||
0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7C, 0xFE, 0xFF, 0xFF,
|
||||
0xFF, 0xFE, 0xFE, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x10, 0x1F,
|
||||
0x0F, 0xE3, 0xFC, 0xFF, 0x3F, 0xCF, 0xE1, 0xF8, 0x38, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x07, 0xF3, 0xF8, 0xFE, 0x3F, 0x0F, 0xC3, 0xF1, 0xF8, 0x7E, 0x1F,
|
||||
0x87, 0xC3, 0xF0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00,
|
||||
0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x07, 0xFC,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF,
|
||||
0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F,
|
||||
0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0xFF,
|
||||
0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, 0x3F,
|
||||
0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xC0, 0x07, 0xFF,
|
||||
0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xE0, 0x07,
|
||||
0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x3C, 0x00, 0x00, 0x60,
|
||||
0x00, 0x00, 0x03, 0xFE, 0x00, 0xFF, 0xFE, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF,
|
||||
0xE7, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xF0, 0x0F, 0xE6, 0x00, 0x7F, 0x00,
|
||||
0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x7F,
|
||||
0x00, 0x07, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F,
|
||||
0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xF8, 0x00,
|
||||
0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xE0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x7F, 0x80, 0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0,
|
||||
0x00, 0x1F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xF0,
|
||||
0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x03, 0xF8, 0x00, 0x01, 0xF8,
|
||||
0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x7E, 0x03, 0xFF, 0x07, 0xE3, 0xF0, 0x3F,
|
||||
0xFF, 0x0F, 0x8F, 0x81, 0xFF, 0xFC, 0x3E, 0x3E, 0x0F, 0xFF, 0xF0, 0xFD,
|
||||
0xF8, 0x7F, 0x07, 0xC1, 0xF7, 0xC3, 0xF8, 0x1F, 0x07, 0xDF, 0x0F, 0xC0,
|
||||
0x7C, 0x1F, 0xFC, 0x3E, 0x01, 0xF0, 0x7F, 0xF0, 0xF8, 0x07, 0xC1, 0xFF,
|
||||
0x87, 0xE0, 0x1F, 0x07, 0xFE, 0x1F, 0x80, 0xFC, 0x1F, 0xF8, 0x7E, 0x03,
|
||||
0xF0, 0x7F, 0xE0, 0xF8, 0x0F, 0xC3, 0xEF, 0x83, 0xE0, 0x3F, 0x0F, 0xBF,
|
||||
0x0F, 0xC1, 0xFC, 0x7E, 0x7C, 0x3F, 0xDF, 0xFB, 0xF1, 0xF0, 0x7F, 0xFF,
|
||||
0xFF, 0x87, 0xC0, 0xFF, 0xE7, 0xFE, 0x1F, 0x81, 0xFF, 0x0F, 0xF0, 0x3F,
|
||||
0x01, 0xF0, 0x0E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x01, 0x00, 0x0F, 0xF8, 0x00, 0x7C, 0x00, 0x1F,
|
||||
0xFF, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00,
|
||||
0x0F, 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00,
|
||||
0x03, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xE0, 0x00,
|
||||
0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00,
|
||||
0x00, 0x3F, 0x3F, 0x80, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x1F, 0xC7, 0xF0,
|
||||
0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x0F, 0xE1, 0xFC, 0x00, 0x07, 0xF0, 0x7F,
|
||||
0x00, 0x07, 0xF8, 0x3F, 0x80, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0xFC, 0x07,
|
||||
0xF0, 0x01, 0xFE, 0x03, 0xF8, 0x00, 0xFE, 0x01, 0xFC, 0x00, 0x7F, 0xFF,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF,
|
||||
0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xF0,
|
||||
0x00, 0xFF, 0x07, 0xF8, 0x00, 0x3F, 0x83, 0xFC, 0x00, 0x1F, 0xE1, 0xFC,
|
||||
0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x01, 0xFE, 0x7F,
|
||||
0x00, 0x00, 0xFF, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0xFF, 0xF0, 0x00, 0x7F,
|
||||
0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE7,
|
||||
0xFF, 0xFF, 0xF3, 0xF8, 0x0F, 0xFD, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFF,
|
||||
0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xDF, 0xC0, 0x1F, 0xEF, 0xE0, 0x0F,
|
||||
0xE7, 0xF0, 0x1F, 0xF3, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
|
||||
0xE0, 0x7F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x7F, 0xEF, 0xE0,
|
||||
0x0F, 0xF7, 0xF0, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x1F, 0xEF,
|
||||
0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8,
|
||||
0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x3F,
|
||||
0xFF, 0xC0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87,
|
||||
0xFF, 0xFF, 0xC3, 0xFF, 0x80, 0xF0, 0xFF, 0x80, 0x0C, 0x7F, 0xC0, 0x00,
|
||||
0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00,
|
||||
0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF,
|
||||
0xC0, 0x0C, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0,
|
||||
0x1F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0xFF, 0xF0,
|
||||
0x00, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0,
|
||||
0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFE, 0x07, 0xFF, 0x8F, 0xE0,
|
||||
0x0F, 0xFC, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x03, 0xFE, 0xFE, 0x00, 0x1F,
|
||||
0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00,
|
||||
0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF,
|
||||
0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00,
|
||||
0x3F, 0xEF, 0xE0, 0x03, 0xFC, 0xFE, 0x00, 0xFF, 0xCF, 0xE0, 0x3F, 0xF8,
|
||||
0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF,
|
||||
0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xEF, 0xFF,
|
||||
0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xE0, 0x00, 0xFE,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F,
|
||||
0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00,
|
||||
0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03,
|
||||
0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07,
|
||||
0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0F,
|
||||
0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC,
|
||||
0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0x00, 0xE1, 0xFF, 0x80, 0x04, 0x3F, 0xC0,
|
||||
0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F,
|
||||
0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x1F,
|
||||
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF,
|
||||
0x01, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x03,
|
||||
0xFF, 0xF8, 0x00, 0x7F, 0x7F, 0x80, 0x0F, 0xEF, 0xF0, 0x01, 0xFD, 0xFF,
|
||||
0x00, 0x3F, 0x9F, 0xF0, 0x07, 0xF1, 0xFF, 0xE7, 0xFE, 0x3F, 0xFF, 0xFF,
|
||||
0xC3, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0xE0, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07,
|
||||
0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00,
|
||||
0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF,
|
||||
0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0,
|
||||
0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07,
|
||||
0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE,
|
||||
0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00,
|
||||
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x1F,
|
||||
0xFC, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07,
|
||||
0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07,
|
||||
0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07,
|
||||
0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x0F, 0xF8, 0x7F,
|
||||
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0x07,
|
||||
0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01,
|
||||
0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0,
|
||||
0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0,
|
||||
0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC,
|
||||
0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F,
|
||||
0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xBF, 0xFE, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC,
|
||||
0x3F, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFB, 0xF8, 0x00, 0xFF,
|
||||
0x7F, 0x00, 0x3F, 0xCF, 0xE0, 0x0F, 0xF1, 0xFC, 0x03, 0xFC, 0x3F, 0x80,
|
||||
0xFF, 0x07, 0xF0, 0x1F, 0xE0, 0xFE, 0x07, 0xF8, 0x1F, 0xC1, 0xFE, 0x03,
|
||||
0xF8, 0x7F, 0x80, 0x7F, 0x1F, 0xE0, 0x0F, 0xE3, 0xFC, 0x01, 0xFC, 0xFF,
|
||||
0x00, 0x3F, 0xBF, 0xC0, 0x07, 0xF7, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F,
|
||||
0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x0F, 0xF9, 0xFE,
|
||||
0x01, 0xFE, 0x3F, 0xC0, 0x3F, 0x83, 0xFC, 0x07, 0xF0, 0x3F, 0xC0, 0xFE,
|
||||
0x07, 0xF8, 0x1F, 0xC0, 0x7F, 0x83, 0xF8, 0x0F, 0xF0, 0x7F, 0x00, 0xFF,
|
||||
0x0F, 0xE0, 0x0F, 0xF1, 0xFC, 0x01, 0xFE, 0x3F, 0x80, 0x1F, 0xE7, 0xF0,
|
||||
0x01, 0xFE, 0xFE, 0x00, 0x3F, 0xDF, 0xC0, 0x03, 0xFC, 0xFE, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F,
|
||||
0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00,
|
||||
0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC,
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC0, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x03, 0xFF,
|
||||
0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00,
|
||||
0x7F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x0F, 0xFF, 0xFD, 0xF0, 0x00, 0xFB, 0xFF, 0xDF, 0x80, 0x1F, 0xBF,
|
||||
0xFD, 0xF8, 0x01, 0xFB, 0xFF, 0xCF, 0x80, 0x1F, 0x3F, 0xFC, 0xFC, 0x03,
|
||||
0xF3, 0xFF, 0xCF, 0xC0, 0x3F, 0x3F, 0xFC, 0xFC, 0x03, 0xE3, 0xFF, 0xE7,
|
||||
0xE0, 0x7E, 0x7F, 0xFE, 0x7E, 0x07, 0xE7, 0xFF, 0xE7, 0xE0, 0x7C, 0x7F,
|
||||
0xFE, 0x3E, 0x0F, 0xC7, 0xFF, 0xE3, 0xF0, 0xFC, 0x7F, 0xFE, 0x3F, 0x0F,
|
||||
0x87, 0xFF, 0xE1, 0xF1, 0xF8, 0x7F, 0xFE, 0x1F, 0x9F, 0x87, 0xFF, 0xE1,
|
||||
0xF9, 0xF0, 0x7F, 0xFE, 0x1F, 0x9F, 0x07, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F,
|
||||
0xFE, 0x0F, 0xFE, 0x07, 0xFF, 0xE0, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFE,
|
||||
0x07, 0xFF, 0xE0, 0x7F, 0xC0, 0x7F, 0xFE, 0x07, 0xFC, 0x07, 0xFF, 0xE0,
|
||||
0x3F, 0xC0, 0x7F, 0xFE, 0x03, 0xF8, 0x07, 0xFF, 0xE0, 0x3F, 0x80, 0x7F,
|
||||
0xFF, 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF,
|
||||
0xF8, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF,
|
||||
0x80, 0x0F, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xF7, 0xF0,
|
||||
0x03, 0xFF, 0xDF, 0xE0, 0x0F, 0xFF, 0x3F, 0xC0, 0x3F, 0xFC, 0x7F, 0x00,
|
||||
0xFF, 0xF1, 0xFE, 0x03, 0xFF, 0xC3, 0xF8, 0x0F, 0xFF, 0x0F, 0xF0, 0x3F,
|
||||
0xFE, 0x1F, 0xE0, 0xFF, 0xF8, 0x7F, 0x83, 0xFF, 0xE0, 0xFF, 0x0F, 0xFF,
|
||||
0x81, 0xFC, 0x3F, 0xFE, 0x07, 0xF8, 0xFF, 0xF8, 0x0F, 0xE3, 0xFF, 0xE0,
|
||||
0x3F, 0xCF, 0xFF, 0x80, 0x7F, 0xBF, 0xFE, 0x01, 0xFE, 0xFF, 0xF8, 0x03,
|
||||
0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0x3F,
|
||||
0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF,
|
||||
0xFE, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF8, 0x00,
|
||||
0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0,
|
||||
0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF0, 0x3F, 0xF0, 0x1F, 0xF8,
|
||||
0x3F, 0xC0, 0x07, 0xFC, 0x7F, 0x80, 0x03, 0xFC, 0x7F, 0x80, 0x03, 0xFC,
|
||||
0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFE,
|
||||
0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE,
|
||||
0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF,
|
||||
0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE,
|
||||
0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x01, 0xFC,
|
||||
0x7F, 0x80, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xFC, 0x3F, 0xE0, 0x0F, 0xF8,
|
||||
0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0,
|
||||
0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFC, 0x00,
|
||||
0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F,
|
||||
0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xBF, 0x83, 0xFF, 0x7F, 0x01, 0xFF, 0xFE,
|
||||
0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0,
|
||||
0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0xFF, 0x03, 0xFE, 0xFF, 0xFF,
|
||||
0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC,
|
||||
0x1F, 0xFF, 0xC0, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F,
|
||||
0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC,
|
||||
0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF,
|
||||
0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||
0xFF, 0xF0, 0x3F, 0xF0, 0x1F, 0xF8, 0x3F, 0xC0, 0x07, 0xFC, 0x7F, 0x80,
|
||||
0x03, 0xFC, 0x7F, 0x80, 0x03, 0xFC, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00,
|
||||
0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00,
|
||||
0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00,
|
||||
0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00,
|
||||
0x01, 0xFE, 0x7F, 0x80, 0x01, 0xFE, 0x7F, 0x80, 0x03, 0xFC, 0x7F, 0xC0,
|
||||
0x07, 0xFC, 0x3F, 0xE0, 0x0F, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF,
|
||||
0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF,
|
||||
0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00,
|
||||
0x7F, 0xC0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00,
|
||||
0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
|
||||
0x03, 0xFE, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0,
|
||||
0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x3F, 0x81,
|
||||
0xFF, 0x87, 0xF0, 0x0F, 0xF0, 0xFE, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0xC3,
|
||||
0xF8, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x0F, 0xE0, 0x0F, 0xE1, 0xFC, 0x03,
|
||||
0xFC, 0x3F, 0x80, 0xFF, 0x07, 0xF0, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x1F,
|
||||
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC,
|
||||
0x01, 0xFC, 0x3F, 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x3F, 0x80, 0xFE,
|
||||
0x07, 0xF8, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xF0, 0x7F, 0x00, 0xFF,
|
||||
0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x01, 0xFE, 0x3F, 0x80, 0x1F, 0xE7, 0xF0,
|
||||
0x03, 0xFC, 0xFE, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xFC, 0x00, 0xFF, 0x80,
|
||||
0x1F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF9, 0xFF,
|
||||
0xFF, 0xE7, 0xF8, 0x0F, 0x1F, 0xC0, 0x04, 0x7F, 0x00, 0x01, 0xFC, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0xC0, 0x03,
|
||||
0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x80, 0x1F,
|
||||
0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F,
|
||||
0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFC,
|
||||
0x00, 0xFF, 0xFF, 0x9F, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF,
|
||||
0xF8, 0xFF, 0xFF, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFC, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00,
|
||||
0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07,
|
||||
0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00,
|
||||
0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF,
|
||||
0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00,
|
||||
0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF,
|
||||
0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F,
|
||||
0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE,
|
||||
0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFE, 0xFF, 0x00, 0x0F, 0xEF, 0xF0, 0x00,
|
||||
0xFE, 0x7F, 0x80, 0x1F, 0xE7, 0xFC, 0x03, 0xFC, 0x7F, 0xFF, 0xFF, 0xC3,
|
||||
0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x07, 0xFF,
|
||||
0xFC, 0x00, 0x1F, 0xFF, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x03,
|
||||
0xF9, 0xFC, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xE7, 0xF0, 0x00, 0x3F,
|
||||
0x87, 0xF0, 0x00, 0x7F, 0x0F, 0xE0, 0x01, 0xFE, 0x1F, 0xC0, 0x03, 0xF8,
|
||||
0x1F, 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x7F, 0x00, 0x3F, 0x80,
|
||||
0x7F, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xF8, 0x01,
|
||||
0xFC, 0x07, 0xF0, 0x03, 0xF8, 0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x07,
|
||||
0xF0, 0x7F, 0x00, 0x0F, 0xE0, 0xFC, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x1F,
|
||||
0xC7, 0xF0, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x7E,
|
||||
0x7F, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0x01, 0xFD, 0xF8, 0x00, 0x01, 0xFF,
|
||||
0xF0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xFF,
|
||||
0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xF0,
|
||||
0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xFF, 0xF0,
|
||||
0x00, 0xFE, 0x00, 0x1F, 0xDF, 0x80, 0x07, 0xF8, 0x00, 0xFE, 0xFE, 0x00,
|
||||
0x3F, 0xC0, 0x07, 0xF7, 0xF0, 0x03, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x1F,
|
||||
0xF0, 0x03, 0xF8, 0xFC, 0x00, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x07, 0xFE,
|
||||
0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xF0, 0x07, 0xE1, 0xFC, 0x03, 0xFF, 0x80,
|
||||
0x7F, 0x07, 0xE0, 0x1F, 0x7E, 0x03, 0xF8, 0x3F, 0x81, 0xFB, 0xF0, 0x1F,
|
||||
0xC1, 0xFC, 0x0F, 0xDF, 0x80, 0xFC, 0x0F, 0xE0, 0x7E, 0x7C, 0x0F, 0xE0,
|
||||
0x3F, 0x03, 0xF3, 0xF0, 0x7F, 0x01, 0xFC, 0x3F, 0x1F, 0x83, 0xF8, 0x0F,
|
||||
0xE1, 0xF8, 0xFC, 0x1F, 0x80, 0x7F, 0x0F, 0xC3, 0xF1, 0xFC, 0x01, 0xF8,
|
||||
0x7E, 0x1F, 0x8F, 0xE0, 0x0F, 0xC7, 0xE0, 0xFC, 0x7F, 0x00, 0x7F, 0x3F,
|
||||
0x07, 0xE3, 0xF0, 0x03, 0xF9, 0xF8, 0x1F, 0x1F, 0x80, 0x0F, 0xCF, 0xC0,
|
||||
0xFD, 0xFC, 0x00, 0x7E, 0x7C, 0x07, 0xEF, 0xE0, 0x03, 0xF7, 0xE0, 0x3F,
|
||||
0x7E, 0x00, 0x1F, 0xFF, 0x00, 0xFB, 0xF0, 0x00, 0x7F, 0xF8, 0x07, 0xDF,
|
||||
0x80, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x1F, 0xFC, 0x01, 0xFF, 0xC0,
|
||||
0x00, 0xFF, 0xE0, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00,
|
||||
0x1F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x07,
|
||||
0xFC, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0xFF, 0x00, 0x07,
|
||||
0xF8, 0xFF, 0x00, 0x1F, 0xE0, 0xFF, 0x00, 0x3F, 0xC1, 0xFE, 0x00, 0xFF,
|
||||
0x01, 0xFE, 0x03, 0xFC, 0x01, 0xFC, 0x07, 0xF8, 0x03, 0xFC, 0x1F, 0xE0,
|
||||
0x03, 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x00, 0x07, 0xF9, 0xFC, 0x00,
|
||||
0x07, 0xF7, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0x80, 0x00,
|
||||
0x0F, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00,
|
||||
0x3F, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x07,
|
||||
0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x3F, 0xBF, 0xC0, 0x00, 0xFF,
|
||||
0x3F, 0x80, 0x03, 0xFC, 0x7F, 0x80, 0x07, 0xF0, 0x7F, 0x80, 0x1F, 0xE0,
|
||||
0xFF, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0x01,
|
||||
0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x1F, 0xE0, 0x03, 0xFE, 0x7F, 0x80, 0x03,
|
||||
0xFD, 0xFE, 0x00, 0x03, 0xFC, 0xFF, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x3F,
|
||||
0xDF, 0xE0, 0x01, 0xFC, 0x7F, 0x00, 0x1F, 0xE3, 0xFC, 0x00, 0xFE, 0x0F,
|
||||
0xE0, 0x0F, 0xF0, 0x7F, 0x80, 0x7F, 0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0,
|
||||
0x3F, 0x80, 0x3F, 0x83, 0xFC, 0x01, 0xFE, 0x1F, 0xC0, 0x07, 0xF1, 0xFC,
|
||||
0x00, 0x3F, 0xCF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00,
|
||||
0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x0F,
|
||||
0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xE0,
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00,
|
||||
0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8,
|
||||
0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF,
|
||||
0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF,
|
||||
0xFB, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01,
|
||||
0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00,
|
||||
0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x7F, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00,
|
||||
0x3F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xE0, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00,
|
||||
0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E,
|
||||
0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1,
|
||||
0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00,
|
||||
0x3F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
|
||||
0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00,
|
||||
0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80,
|
||||
0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xC0,
|
||||
0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0,
|
||||
0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8,
|
||||
0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||
0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
|
||||
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
|
||||
0xFC, 0x1F, 0x83, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
||||
0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00,
|
||||
0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00,
|
||||
0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x01, 0xF8, 0xF8, 0x00, 0xF8, 0x7C,
|
||||
0x00, 0xFC, 0x1F, 0x00, 0x7C, 0x0F, 0x80, 0x3E, 0x03, 0xE0, 0x3E, 0x01,
|
||||
0xF0, 0x1F, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x8F, 0xC0,
|
||||
0x07, 0xC7, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE,
|
||||
0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x01, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x7F,
|
||||
0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F, 0x83, 0x00,
|
||||
0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x03, 0xFF,
|
||||
0xF8, 0x7F, 0xFF, 0xF1, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xF8, 0x3F,
|
||||
0xFF, 0x80, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x07, 0xFF,
|
||||
0xF0, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF,
|
||||
0xFF, 0x3F, 0x3F, 0xFC, 0x7E, 0x1F, 0xF0, 0x7C, 0xFF, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
|
||||
0x00, 0x00, 0xFE, 0x1F, 0xC0, 0xFE, 0x3F, 0xF0, 0xFE, 0xFF, 0xF8, 0xFE,
|
||||
0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0x81, 0xFE, 0xFF,
|
||||
0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF,
|
||||
0x80, 0xFF, 0xFF, 0xE3, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFE,
|
||||
0xFF, 0xF8, 0xFE, 0x7F, 0xF0, 0xFC, 0x3F, 0xE0, 0x00, 0x7F, 0xC0, 0x1F,
|
||||
0xFF, 0xC1, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1,
|
||||
0xFF, 0x00, 0x8F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xC0,
|
||||
0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F,
|
||||
0xE0, 0x00, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00,
|
||||
0x23, 0xFE, 0x1F, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC1, 0xFF, 0xFE, 0x07,
|
||||
0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x01,
|
||||
0xFC, 0x7F, 0x07, 0xFE, 0x7F, 0x0F, 0xFF, 0x7F, 0x1F, 0xFF, 0xFF, 0x3F,
|
||||
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0xC1, 0xFF, 0x7F, 0x80, 0xFF, 0x7F,
|
||||
0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE,
|
||||
0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF,
|
||||
0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x80, 0xFF, 0x7F,
|
||||
0xE3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xBF, 0x0F,
|
||||
0xFF, 0x3F, 0x03, 0xFC, 0x1F, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x0F,
|
||||
0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xC1, 0xFE, 0x7F,
|
||||
0x80, 0xFE, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F,
|
||||
0x00, 0x00, 0x7F, 0x80, 0x02, 0x3F, 0xE0, 0x1C, 0x3F, 0xFF, 0xFC, 0x1F,
|
||||
0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x00,
|
||||
0x7F, 0x80, 0x3F, 0xFC, 0x0F, 0xFF, 0x83, 0xFF, 0xE0, 0xFF, 0xFC, 0x1F,
|
||||
0xFF, 0x83, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x7F,
|
||||
0xFE, 0x3F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xFF,
|
||||
0xFC, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE,
|
||||
0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC,
|
||||
0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8,
|
||||
0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0,
|
||||
0x00, 0x01, 0xFC, 0x3F, 0x07, 0xFE, 0x3F, 0x0F, 0xFF, 0xBF, 0x1F, 0xFF,
|
||||
0xBF, 0x3F, 0xFF, 0xFF, 0x3F, 0xF7, 0xFF, 0x7F, 0x80, 0xFF, 0x7F, 0x80,
|
||||
0x7F, 0x7F, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0x00,
|
||||
0x3F, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x80,
|
||||
0xFF, 0x7F, 0xC1, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF,
|
||||
0xFF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x30, 0x01, 0xFF, 0x3F, 0x07,
|
||||
0xFE, 0x3F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF,
|
||||
0xF0, 0x0F, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x1F,
|
||||
0xE0, 0xFE, 0x7F, 0xF8, 0xFE, 0xFF, 0xFC, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF,
|
||||
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0x7F, 0x7E, 0x00,
|
||||
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x1F, 0x81, 0xFE, 0x0F, 0xF0, 0x7F,
|
||||
0x81, 0xFC, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x0F, 0xF0,
|
||||
0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
|
||||
0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
|
||||
0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1,
|
||||
0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF4, 0xFF,
|
||||
0xBF, 0xFD, 0xFF, 0xCF, 0xFE, 0x7F, 0xE3, 0xFC, 0x00, 0xFE, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00,
|
||||
0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00,
|
||||
0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xCF, 0xE0,
|
||||
0x1F, 0xE7, 0xF0, 0x1F, 0xE3, 0xF8, 0x1F, 0xE1, 0xFC, 0x1F, 0xE0, 0xFE,
|
||||
0x1F, 0xE0, 0x7F, 0x1F, 0xE0, 0x3F, 0x9F, 0xE0, 0x1F, 0xDF, 0xE0, 0x0F,
|
||||
0xCF, 0xE0, 0x07, 0xEF, 0xE0, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00,
|
||||
0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xC0, 0x3F, 0xEF, 0xF0, 0x1F, 0xC3, 0xFC,
|
||||
0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x7F, 0x83, 0xF8, 0x1F, 0xE1, 0xFC, 0x07,
|
||||
0xF8, 0xFE, 0x01, 0xFE, 0x7F, 0x00, 0xFF, 0x3F, 0x80, 0x3F, 0xDF, 0xC0,
|
||||
0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0x1F, 0xE1, 0xF8, 0xFF, 0xF0, 0xFF, 0xF3,
|
||||
0xFB, 0xFF, 0xF3, 0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0xFF, 0xEF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xE0, 0x7F,
|
||||
0xFF, 0xC0, 0x7F, 0xC0, 0x7F, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x01,
|
||||
0xFE, 0x01, 0xFF, 0xFC, 0x03, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xF8, 0x07,
|
||||
0xFF, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0xE0, 0x1F, 0xE0, 0x1F, 0xFF, 0xC0,
|
||||
0x3F, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0x00,
|
||||
0xFF, 0xFE, 0x01, 0xFE, 0x01, 0xFF, 0xFC, 0x03, 0xFC, 0x03, 0xFF, 0xF8,
|
||||
0x07, 0xF8, 0x07, 0xFF, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0xE0, 0x1F, 0xE0,
|
||||
0x1F, 0xFF, 0xC0, 0x3F, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFF,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFE, 0x01, 0xFC, 0xFC, 0x1F, 0xE0,
|
||||
0xFC, 0x7F, 0xF8, 0xFE, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
|
||||
0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xFE,
|
||||
0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE1, 0xFF, 0x1F, 0xF1, 0xFE, 0x03,
|
||||
0xFC, 0xFF, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0xBF, 0x80, 0x3F, 0xFF, 0xC0,
|
||||
0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8,
|
||||
0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0xDF,
|
||||
0xC0, 0x1F, 0xCF, 0xF0, 0x1F, 0xE3, 0xFC, 0x1F, 0xF0, 0xFF, 0xFF, 0xF0,
|
||||
0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xE0,
|
||||
0x00, 0xFC, 0x1F, 0xC0, 0xFE, 0x7F, 0xF0, 0xFE, 0xFF, 0xF8, 0xFE, 0xFF,
|
||||
0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0x81, 0xFF, 0xFF, 0x80,
|
||||
0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0x81,
|
||||
0xFF, 0xFF, 0xE3, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFE, 0xFF,
|
||||
0xF8, 0xFE, 0x7F, 0xF0, 0xFE, 0x3F, 0xE0, 0xFF, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x3F, 0x07, 0xFE, 0x3F, 0x0F, 0xFF,
|
||||
0x3F, 0x1F, 0xFF, 0xBF, 0x3F, 0xFF, 0xFF, 0x3F, 0xE7, 0xFF, 0x7F, 0x80,
|
||||
0xFF, 0x7F, 0x80, 0x7F, 0x7F, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
|
||||
0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00,
|
||||
0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00,
|
||||
0x7F, 0x7F, 0x80, 0xFF, 0x7F, 0xE1, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF,
|
||||
0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFC, 0x0F, 0xFE, 0x1F, 0xFF,
|
||||
0x1F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
|
||||
0xFF, 0x80, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8,
|
||||
0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F,
|
||||
0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00,
|
||||
0x7F, 0x80, 0x00, 0x03, 0xFE, 0x01, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF,
|
||||
0xFE, 0x7F, 0xFF, 0xCF, 0xF0, 0x3C, 0xFE, 0x00, 0x4F, 0xE0, 0x00, 0xFF,
|
||||
0x00, 0x0F, 0xFC, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x80,
|
||||
0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFF,
|
||||
0x00, 0x07, 0xF8, 0x00, 0x7F, 0xF0, 0x0F, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF,
|
||||
0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x83, 0xFF, 0xE0, 0x03, 0xC0, 0x01, 0xF0,
|
||||
0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xFF, 0xF3, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x1F,
|
||||
0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0,
|
||||
0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00,
|
||||
0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x30, 0xFF, 0xFC, 0x3F, 0xFF, 0x07,
|
||||
0xFF, 0xC0, 0xFF, 0xF0, 0x1F, 0xF8, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F,
|
||||
0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF,
|
||||
0xFF, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0x7F, 0xC7, 0xFF, 0x7F, 0xFF, 0xFF,
|
||||
0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF, 0x1F, 0xFF, 0x3F, 0x07, 0xFC, 0x3F,
|
||||
0xFE, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x7F, 0x3F, 0x80,
|
||||
0x1F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x0F, 0xE0, 0x1F, 0xE0,
|
||||
0xFE, 0x03, 0xF8, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0x3F, 0x83,
|
||||
0xF8, 0x07, 0xF0, 0x7F, 0x00, 0x7E, 0x1F, 0xC0, 0x0F, 0xE3, 0xF8, 0x01,
|
||||
0xFC, 0x7E, 0x00, 0x1F, 0x8F, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x3F, 0x7E,
|
||||
0x00, 0x07, 0xEF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x01,
|
||||
0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0,
|
||||
0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0xFF,
|
||||
0x00, 0x7E, 0x7F, 0x00, 0xFF, 0x80, 0xFE, 0x7F, 0x01, 0xFF, 0x80, 0xFE,
|
||||
0x3F, 0x81, 0xFF, 0x80, 0xFE, 0x3F, 0x81, 0xFF, 0x80, 0xFC, 0x3F, 0x81,
|
||||
0xFF, 0xC1, 0xFC, 0x1F, 0x83, 0xF7, 0xC1, 0xFC, 0x1F, 0xC3, 0xE7, 0xC1,
|
||||
0xF8, 0x1F, 0xC3, 0xE7, 0xC3, 0xF8, 0x1F, 0xC3, 0xE7, 0xC3, 0xF8, 0x0F,
|
||||
0xC7, 0xE3, 0xE3, 0xF8, 0x0F, 0xE7, 0xC3, 0xE3, 0xF0, 0x0F, 0xE7, 0xC3,
|
||||
0xE7, 0xF0, 0x0F, 0xE7, 0xC3, 0xE7, 0xF0, 0x07, 0xE7, 0xC3, 0xF7, 0xE0,
|
||||
0x07, 0xEF, 0x81, 0xF7, 0xE0, 0x07, 0xEF, 0x81, 0xF7, 0xE0, 0x03, 0xFF,
|
||||
0x81, 0xF7, 0xE0, 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0xFF,
|
||||
0xC0, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x01,
|
||||
0xFF, 0x00, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0xFE, 0x00,
|
||||
0x7F, 0x80, 0x7F, 0x80, 0x1F, 0xEF, 0xF0, 0x07, 0xF8, 0xFF, 0x01, 0xFE,
|
||||
0x0F, 0xF0, 0x3F, 0x81, 0xFE, 0x0F, 0xF0, 0x1F, 0xE3, 0xFC, 0x01, 0xFC,
|
||||
0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xFE, 0x00,
|
||||
0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF,
|
||||
0xC0, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00,
|
||||
0x7F, 0x7F, 0x00, 0x1F, 0xEF, 0xF0, 0x03, 0xF8, 0xFF, 0x00, 0xFF, 0x0F,
|
||||
0xE0, 0x3F, 0xC1, 0xFE, 0x07, 0xF0, 0x1F, 0xE1, 0xFE, 0x03, 0xFC, 0x7F,
|
||||
0x80, 0x3F, 0xDF, 0xE0, 0x03, 0xFC, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x03,
|
||||
0xF9, 0xFC, 0x00, 0x7F, 0x3F, 0xC0, 0x1F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F,
|
||||
0x00, 0x7F, 0x0F, 0xE0, 0x1F, 0xE0, 0xFE, 0x03, 0xF8, 0x1F, 0xC0, 0x7F,
|
||||
0x01, 0xFC, 0x0F, 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x7F, 0x00, 0x7E,
|
||||
0x0F, 0xC0, 0x0F, 0xE3, 0xF8, 0x00, 0xFC, 0x7F, 0x00, 0x1F, 0x8F, 0xC0,
|
||||
0x03, 0xFB, 0xF8, 0x00, 0x3F, 0x7E, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7F,
|
||||
0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00,
|
||||
0x03, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE,
|
||||
0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00,
|
||||
0x3F, 0x80, 0x01, 0x3F, 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80,
|
||||
0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F,
|
||||
0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
|
||||
0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x03,
|
||||
0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFE, 0x00,
|
||||
0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0,
|
||||
0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x00, 0xFF,
|
||||
0x01, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xF0, 0x03, 0xF0,
|
||||
0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0,
|
||||
0x03, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x0F, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0,
|
||||
0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xC0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xF0,
|
||||
0x07, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0,
|
||||
0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF8, 0x03, 0xFF, 0x03, 0xFF,
|
||||
0x03, 0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||
0x80, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xC0,
|
||||
0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
|
||||
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0,
|
||||
0x07, 0xFF, 0x03, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0x07, 0xFF,
|
||||
0x0F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0,
|
||||
0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x1F, 0xC0,
|
||||
0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0xFE, 0x00, 0x3F, 0xE0,
|
||||
0x02, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF8, 0x07, 0xFF, 0xA0, 0x03, 0xFE, 0x00 };
|
||||
|
||||
const GFXglyph NotoSans_Bold24pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 12, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 8, 35, 13, 3, -33 }, // 0x21 '!'
|
||||
{ 36, 17, 13, 23, 3, -33 }, // 0x22 '"'
|
||||
{ 64, 28, 34, 30, 1, -33 }, // 0x23 '#'
|
||||
{ 183, 23, 39, 27, 2, -35 }, // 0x24 '$'
|
||||
{ 296, 40, 34, 42, 1, -33 }, // 0x25 '%'
|
||||
{ 466, 33, 34, 35, 2, -33 }, // 0x26 '&'
|
||||
{ 607, 7, 13, 13, 3, -33 }, // 0x27 '''
|
||||
{ 619, 13, 41, 16, 2, -33 }, // 0x28 '('
|
||||
{ 686, 13, 41, 16, 1, -33 }, // 0x29 ')'
|
||||
{ 753, 23, 22, 25, 1, -35 }, // 0x2A '*'
|
||||
{ 817, 23, 23, 27, 2, -27 }, // 0x2B '+'
|
||||
{ 884, 10, 11, 13, 1, -4 }, // 0x2C ','
|
||||
{ 898, 13, 6, 15, 1, -15 }, // 0x2D '-'
|
||||
{ 908, 8, 8, 13, 3, -6 }, // 0x2E '.'
|
||||
{ 916, 19, 34, 20, 0, -33 }, // 0x2F '/'
|
||||
{ 997, 23, 34, 27, 2, -33 }, // 0x30 '0'
|
||||
{ 1095, 16, 34, 27, 3, -33 }, // 0x31 '1'
|
||||
{ 1163, 23, 34, 27, 2, -33 }, // 0x32 '2'
|
||||
{ 1261, 23, 34, 27, 2, -33 }, // 0x33 '3'
|
||||
{ 1359, 25, 34, 27, 1, -33 }, // 0x34 '4'
|
||||
{ 1466, 23, 34, 27, 2, -33 }, // 0x35 '5'
|
||||
{ 1564, 23, 34, 27, 2, -33 }, // 0x36 '6'
|
||||
{ 1662, 24, 34, 27, 1, -33 }, // 0x37 '7'
|
||||
{ 1764, 23, 34, 27, 2, -33 }, // 0x38 '8'
|
||||
{ 1862, 24, 34, 27, 1, -33 }, // 0x39 '9'
|
||||
{ 1964, 8, 27, 13, 3, -25 }, // 0x3A ':'
|
||||
{ 1991, 10, 32, 13, 1, -25 }, // 0x3B ';'
|
||||
{ 2031, 23, 24, 27, 2, -28 }, // 0x3C '<'
|
||||
{ 2100, 23, 14, 27, 2, -23 }, // 0x3D '='
|
||||
{ 2141, 23, 24, 27, 2, -28 }, // 0x3E '>'
|
||||
{ 2210, 21, 35, 22, 0, -33 }, // 0x3F '?'
|
||||
{ 2302, 38, 38, 42, 2, -33 }, // 0x40 '@'
|
||||
{ 2483, 33, 34, 33, 0, -33 }, // 0x41 'A'
|
||||
{ 2624, 25, 34, 31, 4, -33 }, // 0x42 'B'
|
||||
{ 2731, 26, 34, 30, 3, -33 }, // 0x43 'C'
|
||||
{ 2842, 28, 34, 34, 4, -33 }, // 0x44 'D'
|
||||
{ 2961, 20, 34, 26, 4, -33 }, // 0x45 'E'
|
||||
{ 3046, 19, 34, 26, 4, -33 }, // 0x46 'F'
|
||||
{ 3127, 27, 34, 34, 3, -33 }, // 0x47 'G'
|
||||
{ 3242, 28, 34, 36, 4, -33 }, // 0x48 'H'
|
||||
{ 3361, 16, 34, 18, 1, -33 }, // 0x49 'I'
|
||||
{ 3429, 14, 44, 16, -3, -33 }, // 0x4A 'J'
|
||||
{ 3506, 27, 34, 31, 4, -33 }, // 0x4B 'K'
|
||||
{ 3621, 21, 34, 26, 4, -33 }, // 0x4C 'L'
|
||||
{ 3711, 36, 34, 44, 4, -33 }, // 0x4D 'M'
|
||||
{ 3864, 30, 34, 38, 4, -33 }, // 0x4E 'N'
|
||||
{ 3992, 32, 34, 37, 3, -33 }, // 0x4F 'O'
|
||||
{ 4128, 23, 34, 29, 4, -33 }, // 0x50 'P'
|
||||
{ 4226, 32, 42, 37, 3, -33 }, // 0x51 'Q'
|
||||
{ 4394, 27, 34, 31, 4, -33 }, // 0x52 'R'
|
||||
{ 4509, 22, 34, 26, 2, -33 }, // 0x53 'S'
|
||||
{ 4603, 25, 34, 27, 1, -33 }, // 0x54 'T'
|
||||
{ 4710, 28, 34, 36, 4, -33 }, // 0x55 'U'
|
||||
{ 4829, 31, 34, 31, 0, -33 }, // 0x56 'V'
|
||||
{ 4961, 45, 34, 45, 0, -33 }, // 0x57 'W'
|
||||
{ 5153, 31, 34, 31, 0, -33 }, // 0x58 'X'
|
||||
{ 5285, 29, 34, 29, 0, -33 }, // 0x59 'Y'
|
||||
{ 5409, 25, 34, 27, 1, -33 }, // 0x5A 'Z'
|
||||
{ 5516, 11, 41, 16, 3, -33 }, // 0x5B '['
|
||||
{ 5573, 19, 34, 20, 0, -33 }, // 0x5C '\'
|
||||
{ 5654, 11, 41, 16, 1, -33 }, // 0x5D ']'
|
||||
{ 5711, 25, 22, 27, 1, -33 }, // 0x5E '^'
|
||||
{ 5780, 19, 3, 19, 0, 5 }, // 0x5F '_'
|
||||
{ 5788, 13, 8, 17, 2, -35 }, // 0x60 '`'
|
||||
{ 5801, 23, 26, 28, 2, -25 }, // 0x61 'a'
|
||||
{ 5876, 24, 36, 30, 3, -35 }, // 0x62 'b'
|
||||
{ 5984, 21, 26, 24, 2, -25 }, // 0x63 'c'
|
||||
{ 6053, 24, 36, 30, 2, -35 }, // 0x64 'd'
|
||||
{ 6161, 24, 26, 28, 2, -25 }, // 0x65 'e'
|
||||
{ 6239, 19, 36, 18, 1, -35 }, // 0x66 'f'
|
||||
{ 6325, 24, 37, 30, 2, -25 }, // 0x67 'g'
|
||||
{ 6436, 24, 36, 31, 3, -35 }, // 0x68 'h'
|
||||
{ 6544, 8, 36, 14, 3, -35 }, // 0x69 'i'
|
||||
{ 6580, 13, 47, 14, -2, -35 }, // 0x6A 'j'
|
||||
{ 6657, 25, 36, 29, 4, -35 }, // 0x6B 'k'
|
||||
{ 6770, 8, 36, 14, 3, -35 }, // 0x6C 'l'
|
||||
{ 6806, 39, 26, 46, 3, -25 }, // 0x6D 'm'
|
||||
{ 6933, 24, 26, 31, 3, -25 }, // 0x6E 'n'
|
||||
{ 7011, 25, 26, 29, 2, -25 }, // 0x6F 'o'
|
||||
{ 7093, 24, 37, 30, 3, -25 }, // 0x70 'p'
|
||||
{ 7204, 24, 37, 30, 2, -25 }, // 0x71 'q'
|
||||
{ 7315, 17, 26, 21, 3, -25 }, // 0x72 'r'
|
||||
{ 7371, 20, 26, 24, 2, -25 }, // 0x73 's'
|
||||
{ 7436, 18, 31, 20, 1, -30 }, // 0x74 't'
|
||||
{ 7506, 24, 26, 31, 3, -25 }, // 0x75 'u'
|
||||
{ 7584, 27, 26, 27, 0, -25 }, // 0x76 'v'
|
||||
{ 7672, 40, 26, 40, 0, -25 }, // 0x77 'w'
|
||||
{ 7802, 27, 26, 27, 0, -25 }, // 0x78 'x'
|
||||
{ 7890, 27, 37, 27, 0, -25 }, // 0x79 'y'
|
||||
{ 8015, 21, 26, 23, 1, -25 }, // 0x7A 'z'
|
||||
{ 8084, 16, 41, 19, 1, -33 }, // 0x7B '{'
|
||||
{ 8166, 5, 47, 26, 10, -35 }, // 0x7C '|'
|
||||
{ 8196, 16, 41, 19, 2, -33 }, // 0x7D '}'
|
||||
{ 8278, 23, 7, 27, 2, -19 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Bold24pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Bold24pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Bold24pt7bGlyphs,
|
||||
0x20, 0x7E, 64 };
|
||||
|
||||
// Approx. 8971 bytes
|
||||
|
||||
#endif // NOTOSANSBOLD24PT7B_H
|
||||
@@ -0,0 +1,171 @@
|
||||
#ifndef NOTOSANSBOLD7PT7B_H
|
||||
#define NOTOSANSBOLD7PT7B_H
|
||||
const uint8_t NotoSans_Bold7pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFC, 0xF0, 0xDE, 0xF7, 0xA0, 0x1A, 0x09, 0x04, 0x8F, 0xF3,
|
||||
0x61, 0xA3, 0xFC, 0x48, 0x2C, 0x36, 0x00, 0x23, 0xFE, 0x78, 0xF0, 0xF2,
|
||||
0xEB, 0xFC, 0x82, 0x00, 0x70, 0xC5, 0x98, 0xD9, 0x0D, 0xB0, 0x5A, 0xE7,
|
||||
0x6B, 0x05, 0xB0, 0xDB, 0x19, 0xB1, 0x8E, 0x78, 0x3E, 0x33, 0x0F, 0x87,
|
||||
0x87, 0xCF, 0x7D, 0x9E, 0xFF, 0x3F, 0xC0, 0xFF, 0x6B, 0x69, 0x24, 0xDB,
|
||||
0x30, 0xC6, 0x23, 0x33, 0x33, 0x33, 0x6E, 0x19, 0x27, 0xF9, 0xC2, 0xCD,
|
||||
0x80, 0x30, 0xCF, 0xFF, 0x30, 0xC0, 0x6D, 0x60, 0xFF, 0xF0, 0x0C, 0x61,
|
||||
0x84, 0x30, 0xC6, 0x18, 0x63, 0x00, 0x3C, 0xFD, 0x9B, 0x36, 0x7C, 0xD9,
|
||||
0xB3, 0x7E, 0x78, 0x1B, 0xFF, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0x7B, 0xF8,
|
||||
0xC3, 0x1C, 0x63, 0x18, 0xFF, 0xF0, 0x7B, 0xF0, 0xC3, 0x79, 0xF0, 0xC3,
|
||||
0xFF, 0xE0, 0x0C, 0x0C, 0x1C, 0x3C, 0x2C, 0x6C, 0xFF, 0xFF, 0x0C, 0x0C,
|
||||
0xFF, 0xFC, 0x30, 0xFA, 0x70, 0xC3, 0xFF, 0xE0, 0x1E, 0x7D, 0x83, 0x05,
|
||||
0xFC, 0xD9, 0xB3, 0x7E, 0x78, 0xFF, 0xFC, 0x18, 0x70, 0xC1, 0x86, 0x0C,
|
||||
0x30, 0x60, 0x3C, 0xFD, 0x9B, 0x33, 0xCF, 0x99, 0xE3, 0x66, 0xF8, 0x38,
|
||||
0xFD, 0x9E, 0x36, 0x6F, 0xCD, 0x83, 0x5C, 0xF0, 0xFC, 0x0F, 0x6D, 0x80,
|
||||
0x1B, 0x58, 0x04, 0x33, 0xB8, 0xC1, 0xE0, 0xC1, 0xFF, 0xF0, 0x3F, 0x83,
|
||||
0x07, 0x07, 0x1D, 0xCC, 0x20, 0x7B, 0xF0, 0xC3, 0x18, 0xC3, 0x00, 0x30,
|
||||
0xC0, 0x1F, 0x06, 0x31, 0x03, 0x6F, 0xA9, 0x37, 0x66, 0xEC, 0xD4, 0xFE,
|
||||
0xC0, 0x0C, 0x20, 0xFC, 0x00, 0x1C, 0x0E, 0x07, 0x86, 0xC3, 0x31, 0x99,
|
||||
0xFC, 0xFF, 0x61, 0xE0, 0xC0, 0xFD, 0xFF, 0x1E, 0x3F, 0xDF, 0xF1, 0xE3,
|
||||
0xFF, 0xF8, 0x3E, 0xFF, 0x86, 0x0C, 0x18, 0x30, 0x70, 0x7E, 0x7C, 0xF8,
|
||||
0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0xFF, 0xFC, 0x30,
|
||||
0xFF, 0xFC, 0x30, 0xFF, 0xF0, 0xFF, 0xFC, 0x30, 0xFF, 0xFC, 0x30, 0xC3,
|
||||
0x00, 0x1E, 0x7F, 0xE0, 0xC0, 0xCF, 0xCF, 0xC3, 0xE3, 0x7F, 0x3F, 0xC3,
|
||||
0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFB, 0xCC, 0x63,
|
||||
0x18, 0xC6, 0x77, 0xC0, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xE0, 0xC3,
|
||||
0xC6, 0xCC, 0xD8, 0xF8, 0xF8, 0xCC, 0xCE, 0xC6, 0xC7, 0xC3, 0x0C, 0x30,
|
||||
0xC3, 0x0C, 0x30, 0xFF, 0xF0, 0xE0, 0xFC, 0x3F, 0xC7, 0xF8, 0xBD, 0x37,
|
||||
0xB6, 0xF6, 0x9E, 0x73, 0xCE, 0x79, 0x8C, 0xE1, 0xF8, 0xFC, 0x7B, 0x3D,
|
||||
0x9E, 0x6F, 0x37, 0x8F, 0xC7, 0xE1, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C,
|
||||
0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xF9, 0xFB, 0x1E, 0x3C, 0xFF,
|
||||
0xBC, 0x60, 0xC1, 0x80, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, 0x07,
|
||||
0xC7, 0x7F, 0x1F, 0x01, 0x80, 0x70, 0xF8, 0xFE, 0xC6, 0xC6, 0xCE, 0xFC,
|
||||
0xCC, 0xCC, 0xC6, 0xC7, 0x7B, 0xFC, 0x30, 0xF0, 0xE1, 0xC3, 0xFF, 0xE0,
|
||||
0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC3, 0xC3,
|
||||
0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x7F, 0x3E, 0xC1, 0xE1, 0x98, 0xCC,
|
||||
0x66, 0x61, 0xB0, 0xD8, 0x68, 0x1C, 0x0E, 0x00, 0xC3, 0x1E, 0x38, 0xD9,
|
||||
0xC6, 0xCA, 0x66, 0x5B, 0x36, 0xD8, 0xB2, 0xC7, 0x14, 0x38, 0xE1, 0xC7,
|
||||
0x00, 0xE3, 0xB1, 0x8D, 0x87, 0xC1, 0xC0, 0xE0, 0xF8, 0x6C, 0x63, 0x71,
|
||||
0xC0, 0xC3, 0xB1, 0x99, 0x86, 0xC3, 0xC0, 0xE0, 0x60, 0x30, 0x18, 0x0C,
|
||||
0x00, 0xFE, 0xFE, 0x06, 0x0C, 0x18, 0x18, 0x30, 0x60, 0xFF, 0xFF, 0xFF,
|
||||
0x6D, 0xB6, 0xDB, 0x70, 0xC1, 0x06, 0x18, 0x30, 0xC3, 0x06, 0x18, 0x30,
|
||||
0xFF, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x10, 0x18, 0x38, 0x2C, 0x64, 0x46,
|
||||
0xC3, 0xFC, 0xCC, 0x80, 0x33, 0xF0, 0xCF, 0xFF, 0x3D, 0xFD, 0xC1, 0x83,
|
||||
0x67, 0xEC, 0x78, 0xF1, 0xE3, 0xFF, 0xF8, 0x39, 0xFC, 0x30, 0xC3, 0x0F,
|
||||
0x9E, 0x06, 0x0C, 0x9F, 0xFC, 0xF8, 0xF1, 0xE3, 0xFE, 0xEC, 0x30, 0xFB,
|
||||
0x37, 0xFF, 0xF8, 0x39, 0x3E, 0x3D, 0xC6, 0x3E, 0x61, 0x86, 0x18, 0x61,
|
||||
0x80, 0x21, 0xFF, 0x3E, 0x3C, 0x78, 0xFF, 0xBB, 0x07, 0x1B, 0xF0, 0xC1,
|
||||
0x83, 0x67, 0xFE, 0x78, 0xF1, 0xE3, 0xC7, 0x8C, 0xD3, 0xFF, 0xF0, 0x31,
|
||||
0x03, 0x33, 0x33, 0x33, 0x3B, 0xF0, 0xC0, 0xC0, 0xC2, 0xCC, 0xDC, 0xF8,
|
||||
0xF8, 0xDC, 0xCC, 0xC7, 0xFF, 0xFF, 0xF0, 0x18, 0xDF, 0xFF, 0x39, 0xE3,
|
||||
0x3C, 0x67, 0x8C, 0xF1, 0x9E, 0x33, 0x19, 0xFF, 0x9E, 0x3C, 0x78, 0xF1,
|
||||
0xE3, 0x31, 0xFB, 0x3E, 0x3C, 0x78, 0xFB, 0x3C, 0x19, 0xFB, 0x1E, 0x3C,
|
||||
0x78, 0xFF, 0xFE, 0xC1, 0x83, 0x00, 0x21, 0xFF, 0x3E, 0x3C, 0x78, 0xFF,
|
||||
0xBB, 0x06, 0x0C, 0x18, 0x1F, 0xF9, 0x8C, 0x63, 0x18, 0x77, 0xF1, 0xC7,
|
||||
0x8E, 0x7F, 0x21, 0x8F, 0x98, 0x61, 0x86, 0x1F, 0x3C, 0xC7, 0x8F, 0x1E,
|
||||
0x3C, 0x7F, 0xDF, 0x80, 0xC7, 0x66, 0x66, 0x2C, 0x3C, 0x3C, 0x18, 0xC6,
|
||||
0x76, 0xE6, 0x6F, 0x66, 0xB4, 0x29, 0xC3, 0x9C, 0x39, 0xC0, 0xE7, 0x3C,
|
||||
0x3C, 0x3C, 0x3C, 0x66, 0xE7, 0xC7, 0x66, 0x66, 0x2C, 0x3C, 0x3C, 0x18,
|
||||
0x18, 0x30, 0xF0, 0x7C, 0x31, 0x8C, 0x71, 0xFF, 0xC0, 0x19, 0xCC, 0x63,
|
||||
0x73, 0x86, 0x31, 0x8C, 0x70, 0xFF, 0xFF, 0xFF, 0xC0, 0xCC, 0x44, 0x67,
|
||||
0x76, 0x44, 0xCC, 0xE7, 0xF0 };
|
||||
|
||||
const GFXglyph NotoSans_Bold7pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 2, 10, 4, 1, -9 }, // 0x21 '!'
|
||||
{ 4, 5, 4, 7, 1, -9 }, // 0x22 '"'
|
||||
{ 7, 9, 10, 9, 0, -9 }, // 0x23 '#'
|
||||
{ 19, 6, 11, 8, 1, -9 }, // 0x24 '$'
|
||||
{ 28, 12, 10, 12, 0, -9 }, // 0x25 '%'
|
||||
{ 43, 9, 10, 10, 1, -9 }, // 0x26 '&'
|
||||
{ 55, 2, 4, 4, 1, -9 }, // 0x27 '''
|
||||
{ 56, 3, 12, 5, 1, -9 }, // 0x28 '('
|
||||
{ 61, 4, 12, 5, 0, -9 }, // 0x29 ')'
|
||||
{ 67, 7, 6, 7, 0, -9 }, // 0x2A '*'
|
||||
{ 73, 6, 6, 8, 1, -7 }, // 0x2B '+'
|
||||
{ 78, 3, 4, 4, 0, -1 }, // 0x2C ','
|
||||
{ 80, 4, 2, 4, 0, -4 }, // 0x2D '-'
|
||||
{ 81, 2, 2, 4, 1, -1 }, // 0x2E '.'
|
||||
{ 82, 6, 10, 6, 0, -9 }, // 0x2F '/'
|
||||
{ 90, 7, 10, 8, 0, -9 }, // 0x30 '0'
|
||||
{ 99, 5, 10, 8, 1, -9 }, // 0x31 '1'
|
||||
{ 106, 6, 10, 8, 1, -9 }, // 0x32 '2'
|
||||
{ 114, 6, 10, 8, 1, -9 }, // 0x33 '3'
|
||||
{ 122, 8, 10, 8, 0, -9 }, // 0x34 '4'
|
||||
{ 132, 6, 10, 8, 1, -9 }, // 0x35 '5'
|
||||
{ 140, 7, 10, 8, 0, -9 }, // 0x36 '6'
|
||||
{ 149, 7, 10, 8, 0, -9 }, // 0x37 '7'
|
||||
{ 158, 7, 10, 8, 0, -9 }, // 0x38 '8'
|
||||
{ 167, 7, 10, 8, 0, -9 }, // 0x39 '9'
|
||||
{ 176, 2, 8, 4, 1, -7 }, // 0x3A ':'
|
||||
{ 178, 3, 10, 4, 0, -7 }, // 0x3B ';'
|
||||
{ 182, 6, 8, 8, 1, -8 }, // 0x3C '<'
|
||||
{ 188, 6, 4, 8, 1, -6 }, // 0x3D '='
|
||||
{ 191, 6, 8, 8, 1, -8 }, // 0x3E '>'
|
||||
{ 197, 6, 10, 7, 0, -9 }, // 0x3F '?'
|
||||
{ 205, 11, 11, 12, 1, -9 }, // 0x40 '@'
|
||||
{ 221, 9, 10, 9, 0, -9 }, // 0x41 'A'
|
||||
{ 233, 7, 10, 9, 1, -9 }, // 0x42 'B'
|
||||
{ 242, 7, 10, 9, 1, -9 }, // 0x43 'C'
|
||||
{ 251, 8, 10, 10, 1, -9 }, // 0x44 'D'
|
||||
{ 261, 6, 10, 8, 1, -9 }, // 0x45 'E'
|
||||
{ 269, 6, 10, 8, 1, -9 }, // 0x46 'F'
|
||||
{ 277, 8, 10, 10, 1, -9 }, // 0x47 'G'
|
||||
{ 287, 8, 10, 10, 1, -9 }, // 0x48 'H'
|
||||
{ 297, 5, 10, 5, 0, -9 }, // 0x49 'I'
|
||||
{ 304, 4, 13, 5, -1, -9 }, // 0x4A 'J'
|
||||
{ 311, 8, 10, 9, 1, -9 }, // 0x4B 'K'
|
||||
{ 321, 6, 10, 8, 1, -9 }, // 0x4C 'L'
|
||||
{ 329, 11, 10, 13, 1, -9 }, // 0x4D 'M'
|
||||
{ 343, 9, 10, 11, 1, -9 }, // 0x4E 'N'
|
||||
{ 355, 9, 10, 11, 1, -9 }, // 0x4F 'O'
|
||||
{ 367, 7, 10, 9, 1, -9 }, // 0x50 'P'
|
||||
{ 376, 9, 12, 11, 1, -9 }, // 0x51 'Q'
|
||||
{ 390, 8, 10, 9, 1, -9 }, // 0x52 'R'
|
||||
{ 400, 6, 10, 8, 1, -9 }, // 0x53 'S'
|
||||
{ 408, 8, 10, 8, 0, -9 }, // 0x54 'T'
|
||||
{ 418, 8, 10, 10, 1, -9 }, // 0x55 'U'
|
||||
{ 428, 9, 10, 9, 0, -9 }, // 0x56 'V'
|
||||
{ 440, 13, 10, 13, 0, -9 }, // 0x57 'W'
|
||||
{ 457, 9, 10, 9, 0, -9 }, // 0x58 'X'
|
||||
{ 469, 9, 10, 9, 0, -9 }, // 0x59 'Y'
|
||||
{ 481, 8, 10, 8, 0, -9 }, // 0x5A 'Z'
|
||||
{ 491, 3, 12, 5, 1, -9 }, // 0x5B '['
|
||||
{ 496, 6, 10, 6, 0, -9 }, // 0x5C '\'
|
||||
{ 504, 4, 12, 5, 0, -9 }, // 0x5D ']'
|
||||
{ 510, 8, 7, 8, 0, -9 }, // 0x5E '^'
|
||||
{ 517, 6, 1, 6, 0, 2 }, // 0x5F '_'
|
||||
{ 518, 3, 3, 5, 1, -10 }, // 0x60 '`'
|
||||
{ 520, 6, 8, 8, 1, -7 }, // 0x61 'a'
|
||||
{ 526, 7, 10, 9, 1, -9 }, // 0x62 'b'
|
||||
{ 535, 6, 8, 7, 1, -7 }, // 0x63 'c'
|
||||
{ 541, 7, 10, 9, 1, -9 }, // 0x64 'd'
|
||||
{ 550, 7, 8, 8, 1, -7 }, // 0x65 'e'
|
||||
{ 557, 6, 10, 5, 0, -9 }, // 0x66 'f'
|
||||
{ 565, 7, 11, 9, 1, -7 }, // 0x67 'g'
|
||||
{ 575, 7, 10, 9, 1, -9 }, // 0x68 'h'
|
||||
{ 584, 2, 10, 4, 1, -9 }, // 0x69 'i'
|
||||
{ 587, 4, 13, 4, -1, -9 }, // 0x6A 'j'
|
||||
{ 594, 8, 10, 9, 1, -9 }, // 0x6B 'k'
|
||||
{ 604, 2, 10, 4, 1, -9 }, // 0x6C 'l'
|
||||
{ 607, 11, 8, 13, 1, -7 }, // 0x6D 'm'
|
||||
{ 618, 7, 8, 9, 1, -7 }, // 0x6E 'n'
|
||||
{ 625, 7, 8, 9, 1, -7 }, // 0x6F 'o'
|
||||
{ 632, 7, 11, 9, 1, -7 }, // 0x70 'p'
|
||||
{ 642, 7, 11, 9, 1, -7 }, // 0x71 'q'
|
||||
{ 652, 5, 8, 6, 1, -7 }, // 0x72 'r'
|
||||
{ 657, 5, 8, 7, 1, -7 }, // 0x73 's'
|
||||
{ 662, 6, 9, 6, 0, -8 }, // 0x74 't'
|
||||
{ 669, 7, 7, 9, 1, -6 }, // 0x75 'u'
|
||||
{ 676, 8, 7, 8, 0, -6 }, // 0x76 'v'
|
||||
{ 683, 12, 7, 12, 0, -6 }, // 0x77 'w'
|
||||
{ 694, 8, 7, 8, 0, -6 }, // 0x78 'x'
|
||||
{ 701, 8, 10, 8, 0, -6 }, // 0x79 'y'
|
||||
{ 711, 6, 7, 7, 0, -6 }, // 0x7A 'z'
|
||||
{ 717, 5, 12, 5, 0, -9 }, // 0x7B '{'
|
||||
{ 725, 2, 13, 8, 3, -9 }, // 0x7C '|'
|
||||
{ 729, 4, 12, 5, 1, -9 }, // 0x7D '}'
|
||||
{ 735, 6, 2, 8, 1, -5 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Bold7pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Bold7pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Bold7pt7bGlyphs,
|
||||
0x20, 0x7E, 19 };
|
||||
|
||||
// Approx. 1409 bytes
|
||||
|
||||
#endif // NOTOSANSBOLD7PT7B_H
|
||||
@@ -0,0 +1,210 @@
|
||||
#ifndef NOTOSANSBOLD9PT7B_H
|
||||
#define NOTOSANSBOLD9PT7B_H
|
||||
const uint8_t NotoSans_Bold9pt7bBitmaps[] PROGMEM = {
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xE1, 0x7E, 0xEF, 0xBC, 0xF3, 0xCC, 0x0C, 0xC1,
|
||||
0x90, 0x36, 0x04, 0xC7, 0xFE, 0xFF, 0xC6, 0x40, 0xD8, 0xFF, 0xDF, 0xF8,
|
||||
0xCC, 0x19, 0x03, 0x60, 0x18, 0x7F, 0xFF, 0xF9, 0xF8, 0xF8, 0x7E, 0x1F,
|
||||
0x1F, 0x9B, 0xFF, 0xFE, 0x18, 0x18, 0x70, 0x63, 0xE1, 0x8D, 0x8C, 0x36,
|
||||
0x30, 0xDD, 0x83, 0x66, 0xEF, 0xB7, 0xDD, 0xDB, 0x06, 0xCC, 0x33, 0x30,
|
||||
0xCE, 0xC6, 0x1F, 0x38, 0x38, 0x1C, 0x07, 0xF0, 0x77, 0x06, 0x30, 0x77,
|
||||
0x03, 0xE0, 0x7C, 0x7F, 0xE6, 0xEF, 0xEC, 0x7C, 0xE3, 0xCF, 0xFE, 0x7E,
|
||||
0xF0, 0xFF, 0x6C, 0x33, 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0xE6, 0x73, 0xCC,
|
||||
0x66, 0x73, 0x33, 0x33, 0x33, 0x76, 0xEC, 0x18, 0x18, 0xDB, 0xFF, 0x38,
|
||||
0x3C, 0x6E, 0x24, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18,
|
||||
0xFF, 0x60, 0xFF, 0xC0, 0x5F, 0x80, 0x06, 0x1C, 0x30, 0x61, 0xC3, 0x06,
|
||||
0x1C, 0x30, 0xE1, 0x83, 0x0E, 0x00, 0x3C, 0x7E, 0xE7, 0xE7, 0xC3, 0xC3,
|
||||
0xC3, 0xC3, 0xC3, 0xE3, 0xE7, 0x7E, 0x3C, 0x0C, 0x77, 0xFB, 0x4C, 0x30,
|
||||
0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x3C, 0x7F, 0x3B, 0xC8, 0xE0, 0x70, 0x38,
|
||||
0x38, 0x38, 0x38, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0x3C, 0xFE, 0xEF, 0x07,
|
||||
0x07, 0x1E, 0x3C, 0x3F, 0x07, 0x03, 0x87, 0xFF, 0xFE, 0x03, 0x01, 0xC0,
|
||||
0xF0, 0x3C, 0x1B, 0x0E, 0xC3, 0x31, 0x8C, 0xFF, 0xFF, 0xF0, 0x30, 0x0C,
|
||||
0x03, 0x00, 0x7E, 0x7E, 0xFE, 0xE0, 0xE0, 0xFE, 0xFF, 0x07, 0x03, 0x03,
|
||||
0x87, 0xFE, 0xFC, 0x0F, 0x1F, 0x9E, 0x5C, 0x0C, 0x06, 0xF3, 0xFD, 0xC6,
|
||||
0xC3, 0xE1, 0xB9, 0xCF, 0xE3, 0xE0, 0xFF, 0xFF, 0xFF, 0xF8, 0x0E, 0x03,
|
||||
0x01, 0xC0, 0x70, 0x38, 0x0E, 0x03, 0x01, 0xC0, 0x60, 0x38, 0x00, 0x3C,
|
||||
0x7E, 0xE7, 0xE3, 0xE7, 0x7E, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xFF, 0x7E,
|
||||
0x38, 0x7E, 0xEF, 0xC3, 0xC3, 0xC3, 0xEF, 0xFF, 0x33, 0x07, 0x06, 0xFE,
|
||||
0xF8, 0xFF, 0x80, 0x02, 0xFC, 0xFF, 0x80, 0x00, 0xFF, 0x60, 0x01, 0x07,
|
||||
0x1E, 0x78, 0xE0, 0xF0, 0x3E, 0x0F, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
|
||||
0x80, 0xE0, 0x78, 0x1E, 0x07, 0x0F, 0x7C, 0xF0, 0x80, 0x3C, 0xFE, 0x67,
|
||||
0x03, 0x07, 0x0E, 0x1C, 0x18, 0x38, 0x00, 0x18, 0x38, 0x38, 0x03, 0x80,
|
||||
0x7F, 0xC3, 0x83, 0x98, 0x06, 0x67, 0xCF, 0x33, 0x3D, 0x8C, 0xF6, 0x33,
|
||||
0xD8, 0xCF, 0x3F, 0xEC, 0xF7, 0x18, 0x00, 0x78, 0x60, 0x7F, 0x80, 0x0F,
|
||||
0x00, 0xF0, 0x0F, 0x01, 0xF8, 0x1D, 0x81, 0x9C, 0x39, 0xC3, 0x8C, 0x3F,
|
||||
0xE7, 0xFE, 0x70, 0xE6, 0x07, 0xE0, 0x70, 0xFC, 0x3F, 0xEF, 0xFB, 0x87,
|
||||
0xE1, 0xBF, 0xEF, 0xF3, 0x9E, 0xE1, 0xF8, 0x7E, 0x3F, 0xFE, 0xFF, 0x00,
|
||||
0x0F, 0x0F, 0xF7, 0xF9, 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38,
|
||||
0x07, 0x09, 0xFE, 0x1F, 0x80, 0xFC, 0x1F, 0xF3, 0xFF, 0x70, 0xEE, 0x0F,
|
||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x3B, 0x8F, 0x7F, 0xCF, 0xE0, 0xFF,
|
||||
0xFF, 0xFE, 0x0C, 0x1F, 0xFF, 0xFF, 0xC1, 0x83, 0x07, 0xFF, 0xE0, 0xFF,
|
||||
0xFF, 0xFE, 0x0C, 0x18, 0x3F, 0x7E, 0xC1, 0x83, 0x06, 0x0C, 0x00, 0x0F,
|
||||
0x8F, 0xF7, 0xDD, 0xC0, 0xE0, 0x38, 0x0E, 0x7F, 0x9F, 0xE0, 0xF8, 0x37,
|
||||
0x0C, 0xFF, 0x1F, 0xC0, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xC0, 0xFF, 0xDC, 0xE7,
|
||||
0x39, 0xCE, 0x73, 0x9D, 0xFF, 0x80, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18,
|
||||
0xC6, 0x31, 0x9F, 0xFE, 0xE0, 0xC1, 0xF0, 0xEC, 0x73, 0x38, 0xDC, 0x37,
|
||||
0x0F, 0xC3, 0xF0, 0xCE, 0x33, 0x8C, 0x73, 0x0E, 0xC3, 0xC0, 0xE0, 0xE0,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xE0,
|
||||
0x7F, 0x83, 0xFC, 0x1F, 0xE1, 0xBF, 0x0D, 0xEC, 0x6F, 0x67, 0x7B, 0x33,
|
||||
0xCD, 0x9E, 0x7C, 0xF3, 0xC7, 0x9E, 0x3C, 0x71, 0x80, 0xE0, 0xFE, 0x1F,
|
||||
0xC3, 0xFC, 0x7F, 0x8F, 0xB9, 0xF3, 0x3E, 0x77, 0xC7, 0xF8, 0xFF, 0x0F,
|
||||
0xE1, 0xFC, 0x1E, 0x0F, 0x03, 0xFC, 0x79, 0xE7, 0x0E, 0xE0, 0x7E, 0x07,
|
||||
0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xFC,
|
||||
0x7F, 0xBF, 0xFC, 0x7E, 0x3F, 0x1F, 0xFF, 0xFE, 0xF8, 0x70, 0x38, 0x1C,
|
||||
0x0E, 0x00, 0x0F, 0x03, 0xFC, 0x79, 0xE7, 0x0E, 0xE0, 0x7E, 0x07, 0xE0,
|
||||
0x7E, 0x07, 0xE0, 0x7E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0x3C, 0x01,
|
||||
0xE0, 0x0F, 0xFC, 0x1F, 0xE3, 0xFE, 0x71, 0xCE, 0x19, 0xC7, 0x3F, 0xC7,
|
||||
0xF0, 0xE7, 0x1C, 0xE3, 0x8E, 0x70, 0xEE, 0x1E, 0x3C, 0x7F, 0xF6, 0xE0,
|
||||
0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x07, 0x87, 0xFE, 0xFC, 0xFF, 0xFF, 0xFF,
|
||||
0xFC, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
|
||||
0x0C, 0x00, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||
0x07, 0xE0, 0xEC, 0x1D, 0xC7, 0x3F, 0xE1, 0xF8, 0xE0, 0x7C, 0x1D, 0x83,
|
||||
0xB8, 0x67, 0x1C, 0x63, 0x8E, 0x61, 0xCC, 0x1B, 0x83, 0x60, 0x7C, 0x07,
|
||||
0x80, 0xE0, 0xE1, 0xC3, 0xF0, 0xE1, 0xD8, 0x70, 0xEC, 0x7C, 0x67, 0x36,
|
||||
0x73, 0x9B, 0x38, 0xCD, 0x98, 0x6E, 0xEC, 0x36, 0x36, 0x1F, 0x1F, 0x07,
|
||||
0x8F, 0x03, 0xC7, 0x81, 0xC1, 0xC0, 0xE0, 0xE7, 0x0E, 0x39, 0xC3, 0x98,
|
||||
0x1F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x1F, 0x83, 0xB8, 0x39, 0xC7, 0x0E,
|
||||
0xE0, 0xF0, 0xE0, 0xEC, 0x19, 0xC7, 0x18, 0xC3, 0xB8, 0x36, 0x07, 0xC0,
|
||||
0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x7F, 0xDF, 0xF7, 0xF8,
|
||||
0x0E, 0x07, 0x03, 0x80, 0xE0, 0x70, 0x38, 0x0C, 0x07, 0x03, 0xFF, 0xFF,
|
||||
0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xE0, 0xC1, 0x83,
|
||||
0x83, 0x06, 0x0E, 0x0C, 0x1C, 0x38, 0x30, 0x70, 0x60, 0xFF, 0xCE, 0x73,
|
||||
0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F, 0xFF, 0x08, 0x03, 0x01, 0xE0, 0x78,
|
||||
0x33, 0x0C, 0xC6, 0x19, 0x86, 0xC0, 0xC0, 0xFE, 0xE3, 0x0E, 0x3C, 0x7F,
|
||||
0x47, 0x03, 0x3F, 0xFF, 0xE3, 0xC7, 0xFF, 0x7B, 0xE0, 0x70, 0x38, 0x1D,
|
||||
0xCF, 0xF7, 0x9F, 0x8F, 0xC3, 0xE1, 0xF1, 0xF8, 0xFF, 0xFE, 0xF0, 0x1F,
|
||||
0x7E, 0xF2, 0xE0, 0xE0, 0xE0, 0xE0, 0xE1, 0x7E, 0x3E, 0x03, 0x81, 0xC0,
|
||||
0xE7, 0x77, 0xFF, 0xBF, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xEF, 0xF7, 0xD8,
|
||||
0x1C, 0x3F, 0xB8, 0xDC, 0x7F, 0xFF, 0xFF, 0x81, 0xC1, 0x7F, 0x1F, 0x80,
|
||||
0x3F, 0x3E, 0x30, 0x3E, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
|
||||
0x30, 0x39, 0xBF, 0xFD, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0x7F, 0xBF,
|
||||
0xC0, 0xF0, 0x7F, 0xF7, 0xF0, 0xE0, 0x70, 0x38, 0x1D, 0xCF, 0xFF, 0x9F,
|
||||
0x8F, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x18, 0xFC, 0x7F, 0xFF, 0xFF,
|
||||
0xFE, 0x39, 0xC0, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xFF, 0xF0,
|
||||
0xE0, 0x38, 0x0E, 0x03, 0x87, 0xE3, 0xB9, 0xCE, 0xE3, 0xF0, 0xFE, 0x3F,
|
||||
0x8E, 0x73, 0x8E, 0xE1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCE, 0x39,
|
||||
0xFF, 0xFB, 0xCF, 0x3F, 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3, 0xF1,
|
||||
0xC7, 0xE3, 0x8F, 0xC7, 0x1C, 0xCE, 0x7F, 0xFC, 0xFC, 0x7E, 0x1F, 0x0F,
|
||||
0x87, 0xC3, 0xE1, 0xF0, 0xC0, 0x1C, 0x3F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F,
|
||||
0x8F, 0xC7, 0x7F, 0x1F, 0x00, 0xCE, 0x7F, 0xBC, 0xFC, 0x7E, 0x1F, 0x0F,
|
||||
0x8F, 0xC7, 0xFF, 0xFF, 0xB8, 0x1C, 0x0E, 0x07, 0x00, 0x39, 0xBF, 0xFD,
|
||||
0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0x7F, 0xBF, 0xC0, 0xE0, 0x70, 0x38,
|
||||
0x1C, 0xCF, 0xFF, 0xF7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x3D, 0xFF,
|
||||
0x17, 0x0F, 0x87, 0xC3, 0xC3, 0xFF, 0xF8, 0x10, 0x60, 0xFF, 0xF3, 0x06,
|
||||
0x0C, 0x18, 0x30, 0x60, 0xF8, 0xF0, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F,
|
||||
0x1F, 0x8F, 0xC7, 0x7F, 0xBE, 0xC0, 0xE1, 0xF8, 0x76, 0x19, 0xCE, 0x33,
|
||||
0x0C, 0xC3, 0xF0, 0x78, 0x1E, 0x07, 0x80, 0xE3, 0x8F, 0xC7, 0x1D, 0x8B,
|
||||
0x33, 0xB6, 0xE7, 0x6D, 0xC6, 0xDB, 0x0D, 0x96, 0x1A, 0x3C, 0x3C, 0x78,
|
||||
0x38, 0xE0, 0xE1, 0xDC, 0xE3, 0xB8, 0xFC, 0x1E, 0x07, 0x83, 0xF0, 0xEC,
|
||||
0x73, 0xB8, 0x70, 0xE1, 0xF8, 0x77, 0x19, 0xCE, 0x33, 0x8E, 0xC3, 0xF0,
|
||||
0x78, 0x1E, 0x03, 0x80, 0xC0, 0x70, 0x78, 0x1C, 0x00, 0xFF, 0xFC, 0x38,
|
||||
0xE3, 0x86, 0x1C, 0x70, 0xFF, 0xFC, 0x04, 0x73, 0x8E, 0x38, 0xE3, 0xBC,
|
||||
0xF0, 0xE3, 0x8E, 0x38, 0xE1, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x83,
|
||||
0x86, 0x18, 0x61, 0x87, 0x0F, 0x3D, 0xC6, 0x18, 0x61, 0x8E, 0x30, 0x61,
|
||||
0xFF, 0x9F };
|
||||
|
||||
const GFXglyph NotoSans_Bold9pt7bGlyphs[] PROGMEM = {
|
||||
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
|
||||
{ 1, 3, 13, 5, 1, -12 }, // 0x21 '!'
|
||||
{ 6, 6, 5, 8, 1, -12 }, // 0x22 '"'
|
||||
{ 10, 11, 13, 11, 0, -12 }, // 0x23 '#'
|
||||
{ 28, 8, 14, 10, 1, -12 }, // 0x24 '$'
|
||||
{ 42, 14, 13, 16, 1, -12 }, // 0x25 '%'
|
||||
{ 65, 12, 13, 13, 1, -12 }, // 0x26 '&'
|
||||
{ 85, 3, 5, 5, 1, -12 }, // 0x27 '''
|
||||
{ 87, 4, 16, 6, 1, -12 }, // 0x28 '('
|
||||
{ 95, 4, 16, 6, 1, -12 }, // 0x29 ')'
|
||||
{ 103, 8, 8, 10, 1, -12 }, // 0x2A '*'
|
||||
{ 111, 8, 9, 10, 1, -10 }, // 0x2B '+'
|
||||
{ 120, 3, 4, 5, 1, -1 }, // 0x2C ','
|
||||
{ 122, 5, 2, 6, 0, -5 }, // 0x2D '-'
|
||||
{ 124, 3, 3, 5, 1, -2 }, // 0x2E '.'
|
||||
{ 126, 7, 13, 7, 0, -12 }, // 0x2F '/'
|
||||
{ 138, 8, 13, 10, 1, -12 }, // 0x30 '0'
|
||||
{ 151, 6, 13, 10, 1, -12 }, // 0x31 '1'
|
||||
{ 161, 9, 13, 10, 1, -12 }, // 0x32 '2'
|
||||
{ 176, 8, 13, 10, 1, -12 }, // 0x33 '3'
|
||||
{ 189, 10, 13, 10, 0, -12 }, // 0x34 '4'
|
||||
{ 206, 8, 13, 10, 1, -12 }, // 0x35 '5'
|
||||
{ 219, 9, 13, 10, 1, -12 }, // 0x36 '6'
|
||||
{ 234, 10, 13, 10, 0, -12 }, // 0x37 '7'
|
||||
{ 251, 8, 13, 10, 1, -12 }, // 0x38 '8'
|
||||
{ 264, 8, 13, 10, 1, -12 }, // 0x39 '9'
|
||||
{ 277, 3, 10, 5, 1, -9 }, // 0x3A ':'
|
||||
{ 281, 3, 12, 5, 1, -9 }, // 0x3B ';'
|
||||
{ 286, 8, 9, 10, 1, -10 }, // 0x3C '<'
|
||||
{ 295, 8, 5, 10, 1, -8 }, // 0x3D '='
|
||||
{ 300, 8, 9, 10, 1, -10 }, // 0x3E '>'
|
||||
{ 309, 8, 13, 8, 0, -12 }, // 0x3F '?'
|
||||
{ 322, 14, 14, 16, 1, -12 }, // 0x40 '@'
|
||||
{ 347, 12, 13, 12, 0, -12 }, // 0x41 'A'
|
||||
{ 367, 10, 13, 12, 1, -12 }, // 0x42 'B'
|
||||
{ 384, 10, 13, 11, 1, -12 }, // 0x43 'C'
|
||||
{ 401, 11, 13, 13, 1, -12 }, // 0x44 'D'
|
||||
{ 419, 7, 13, 10, 2, -12 }, // 0x45 'E'
|
||||
{ 431, 7, 13, 10, 2, -12 }, // 0x46 'F'
|
||||
{ 443, 10, 13, 13, 1, -12 }, // 0x47 'G'
|
||||
{ 460, 10, 13, 13, 2, -12 }, // 0x48 'H'
|
||||
{ 477, 5, 13, 7, 1, -12 }, // 0x49 'I'
|
||||
{ 486, 5, 17, 6, -1, -12 }, // 0x4A 'J'
|
||||
{ 497, 10, 13, 12, 2, -12 }, // 0x4B 'K'
|
||||
{ 514, 8, 13, 10, 1, -12 }, // 0x4C 'L'
|
||||
{ 527, 13, 13, 17, 2, -12 }, // 0x4D 'M'
|
||||
{ 549, 11, 13, 14, 2, -12 }, // 0x4E 'N'
|
||||
{ 567, 12, 13, 14, 1, -12 }, // 0x4F 'O'
|
||||
{ 587, 9, 13, 11, 1, -12 }, // 0x50 'P'
|
||||
{ 602, 12, 16, 14, 1, -12 }, // 0x51 'Q'
|
||||
{ 626, 11, 13, 12, 1, -12 }, // 0x52 'R'
|
||||
{ 644, 8, 13, 10, 1, -12 }, // 0x53 'S'
|
||||
{ 657, 10, 13, 10, 0, -12 }, // 0x54 'T'
|
||||
{ 674, 11, 13, 13, 1, -12 }, // 0x55 'U'
|
||||
{ 692, 11, 13, 11, 0, -12 }, // 0x56 'V'
|
||||
{ 710, 17, 13, 17, 0, -12 }, // 0x57 'W'
|
||||
{ 738, 12, 13, 12, 0, -12 }, // 0x58 'X'
|
||||
{ 758, 11, 13, 11, 0, -12 }, // 0x59 'Y'
|
||||
{ 776, 10, 13, 10, 0, -12 }, // 0x5A 'Z'
|
||||
{ 793, 4, 16, 6, 1, -12 }, // 0x5B '['
|
||||
{ 801, 7, 13, 7, 0, -12 }, // 0x5C '\'
|
||||
{ 813, 5, 16, 6, 0, -12 }, // 0x5D ']'
|
||||
{ 823, 10, 9, 10, 0, -12 }, // 0x5E '^'
|
||||
{ 835, 7, 1, 7, 0, 3 }, // 0x5F '_'
|
||||
{ 836, 5, 3, 6, 1, -13 }, // 0x60 '`'
|
||||
{ 838, 8, 10, 11, 1, -9 }, // 0x61 'a'
|
||||
{ 848, 9, 13, 11, 1, -12 }, // 0x62 'b'
|
||||
{ 863, 8, 10, 9, 1, -9 }, // 0x63 'c'
|
||||
{ 873, 9, 13, 11, 1, -12 }, // 0x64 'd'
|
||||
{ 888, 9, 10, 11, 1, -9 }, // 0x65 'e'
|
||||
{ 900, 8, 13, 7, 0, -12 }, // 0x66 'f'
|
||||
{ 913, 9, 14, 11, 1, -9 }, // 0x67 'g'
|
||||
{ 929, 9, 13, 11, 1, -12 }, // 0x68 'h'
|
||||
{ 944, 3, 13, 5, 1, -12 }, // 0x69 'i'
|
||||
{ 949, 5, 17, 5, -1, -12 }, // 0x6A 'j'
|
||||
{ 960, 10, 13, 11, 1, -12 }, // 0x6B 'k'
|
||||
{ 977, 3, 13, 5, 1, -12 }, // 0x6C 'l'
|
||||
{ 982, 15, 10, 17, 1, -9 }, // 0x6D 'm'
|
||||
{ 1001, 9, 10, 11, 1, -9 }, // 0x6E 'n'
|
||||
{ 1013, 9, 10, 11, 1, -9 }, // 0x6F 'o'
|
||||
{ 1025, 9, 14, 11, 1, -9 }, // 0x70 'p'
|
||||
{ 1041, 9, 14, 11, 1, -9 }, // 0x71 'q'
|
||||
{ 1057, 7, 10, 8, 1, -9 }, // 0x72 'r'
|
||||
{ 1066, 7, 10, 9, 1, -9 }, // 0x73 's'
|
||||
{ 1075, 7, 12, 8, 0, -11 }, // 0x74 't'
|
||||
{ 1086, 9, 10, 11, 1, -9 }, // 0x75 'u'
|
||||
{ 1098, 10, 10, 10, 0, -9 }, // 0x76 'v'
|
||||
{ 1111, 15, 10, 15, 0, -9 }, // 0x77 'w'
|
||||
{ 1130, 10, 10, 10, 0, -9 }, // 0x78 'x'
|
||||
{ 1143, 10, 14, 10, 0, -9 }, // 0x79 'y'
|
||||
{ 1161, 7, 10, 9, 1, -9 }, // 0x7A 'z'
|
||||
{ 1170, 6, 16, 7, 0, -12 }, // 0x7B '{'
|
||||
{ 1182, 2, 17, 10, 4, -12 }, // 0x7C '|'
|
||||
{ 1187, 6, 16, 7, 1, -12 }, // 0x7D '}'
|
||||
{ 1199, 8, 3, 10, 1, -7 } }; // 0x7E '~'
|
||||
|
||||
const GFXfont NotoSans_Bold9pt7b PROGMEM = {
|
||||
(uint8_t *)NotoSans_Bold9pt7bBitmaps,
|
||||
(GFXglyph *)NotoSans_Bold9pt7bGlyphs,
|
||||
0x20, 0x7E, 24 };
|
||||
|
||||
// Approx. 1874 bytes
|
||||
|
||||
#endif // NOTOSANSBOLD9PT7B_H
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <helpers/ui/DisplayDriver.h>
|
||||
#include "EmojiSprites.h"
|
||||
|
||||
enum VKBStatus { VKB_EDITING, VKB_SUBMITTED, VKB_CANCELLED };
|
||||
|
||||
@@ -45,7 +46,8 @@ public:
|
||||
static const int MAX_TEXT = 140;
|
||||
|
||||
VirtualKeyboard() : _status(VKB_CANCELLED), _purpose(VKB_CHANNEL_MSG),
|
||||
_contextIdx(0), _textLen(0), _shifted(false), _symbols(false) {
|
||||
_contextIdx(0), _textLen(0), _shifted(false), _symbols(false),
|
||||
_emojiMode(false), _emojiScroll(0) {
|
||||
_text[0] = '\0';
|
||||
_label[0] = '\0';
|
||||
}
|
||||
@@ -56,6 +58,8 @@ public:
|
||||
_status = VKB_EDITING;
|
||||
_shifted = false;
|
||||
_symbols = false;
|
||||
_emojiMode = false;
|
||||
_emojiScroll = 0;
|
||||
_maxLen = (maxLen > 0 && maxLen < MAX_TEXT) ? maxLen : MAX_TEXT;
|
||||
|
||||
strncpy(_label, label, sizeof(_label) - 1);
|
||||
@@ -90,13 +94,8 @@ public:
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.drawRect(0, 10, 128, 18); // Border
|
||||
|
||||
display.setCursor(2, 12);
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
|
||||
// Show text with cursor
|
||||
char dispBuf[MAX_TEXT + 2];
|
||||
snprintf(dispBuf, sizeof(dispBuf), "%s_", _text);
|
||||
display.print(dispBuf);
|
||||
// Render text with inline emoji sprites
|
||||
renderTextField(display);
|
||||
|
||||
// Character count
|
||||
{
|
||||
@@ -111,6 +110,11 @@ public:
|
||||
// Separator
|
||||
display.drawRect(0, 30, 128, 1);
|
||||
|
||||
if (_emojiMode) {
|
||||
renderEmojiGrid(display);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Draw keyboard rows ---
|
||||
const char* const* layout = getLayout();
|
||||
|
||||
@@ -183,6 +187,8 @@ public:
|
||||
bool handleTap(int vx, int vy) {
|
||||
if (_status != VKB_EDITING) return false;
|
||||
|
||||
if (_emojiMode) return handleEmojiTap(vx, vy);
|
||||
|
||||
// Check keyboard rows 0-2
|
||||
const char* const* layout = getLayout();
|
||||
|
||||
@@ -253,6 +259,169 @@ private:
|
||||
char _label[40];
|
||||
bool _shifted;
|
||||
bool _symbols;
|
||||
bool _emojiMode;
|
||||
int _emojiScroll;
|
||||
|
||||
// Emoji grid constants (virtual coords)
|
||||
static const int EMJ_COLS = 8;
|
||||
static const int EMJ_CELL = 15; // 12px sprite + 3px gap
|
||||
static const int EMJ_GRID_X = 4;
|
||||
static const int EMJ_GRID_Y = 34;
|
||||
static const int EMJ_VIS_ROWS = 5;
|
||||
|
||||
int emojiTotalRows() const { return (EMOJI_COUNT + EMJ_COLS - 1) / EMJ_COLS; }
|
||||
int emojiMaxScroll() const { int m = emojiTotalRows() - EMJ_VIS_ROWS; return m < 0 ? 0 : m; }
|
||||
|
||||
void renderEmojiGrid(DisplayDriver& display) {
|
||||
display.setTextSize(0);
|
||||
|
||||
for (int vr = 0; vr < EMJ_VIS_ROWS; vr++) {
|
||||
int absRow = _emojiScroll + vr;
|
||||
if (absRow >= emojiTotalRows()) break;
|
||||
|
||||
for (int col = 0; col < EMJ_COLS; col++) {
|
||||
int idx = absRow * EMJ_COLS + col;
|
||||
if (idx >= EMOJI_COUNT) break;
|
||||
|
||||
int cx = EMJ_GRID_X + col * EMJ_CELL;
|
||||
int cy = EMJ_GRID_Y + vr * EMJ_CELL;
|
||||
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
const uint8_t* sprite = (const uint8_t*)pgm_read_ptr(&EMOJI_SPRITES_LG[idx]);
|
||||
if (sprite) {
|
||||
display.drawXbm(cx + 1, cy + 1, sprite, EMOJI_LG_W, EMOJI_LG_H);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Footer: [Back] [▲] page/total [▼]
|
||||
int fy = EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL + 2;
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.drawRect(0, fy - 1, 128, 1);
|
||||
|
||||
// Back button (inverted)
|
||||
display.fillRect(4, fy + 1, 30, 12);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
int bw = display.getTextWidth("Back");
|
||||
display.setCursor(4 + (30 - bw) / 2, fy + 2);
|
||||
display.print("Back");
|
||||
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
|
||||
// Scroll arrows (only if scrollable)
|
||||
if (emojiTotalRows() > EMJ_VIS_ROWS) {
|
||||
// Up arrow
|
||||
if (_emojiScroll > 0) {
|
||||
display.fillRect(50, fy + 1, 12, 12);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
display.setCursor(53, fy + 2);
|
||||
display.print("^");
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
}
|
||||
|
||||
// Page info
|
||||
char pg[8];
|
||||
snprintf(pg, sizeof(pg), "%d/%d", _emojiScroll + 1, emojiMaxScroll() + 1);
|
||||
int pw = display.getTextWidth(pg);
|
||||
display.setCursor(75 - pw / 2, fy + 2);
|
||||
display.print(pg);
|
||||
|
||||
// Down arrow
|
||||
if (_emojiScroll < emojiMaxScroll()) {
|
||||
display.fillRect(90, fy + 1, 12, 12);
|
||||
display.setColor(DisplayDriver::DARK);
|
||||
display.setCursor(93, fy + 2);
|
||||
display.print("v");
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool handleEmojiTap(int vx, int vy) {
|
||||
int fy = EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL + 2;
|
||||
|
||||
// Footer area
|
||||
if (vy >= fy) {
|
||||
if (vx >= 4 && vx < 34) {
|
||||
// Back button
|
||||
_emojiMode = false;
|
||||
return true;
|
||||
}
|
||||
if (vx >= 50 && vx < 62 && _emojiScroll > 0) {
|
||||
_emojiScroll--;
|
||||
return true;
|
||||
}
|
||||
if (vx >= 90 && vx < 102 && _emojiScroll < emojiMaxScroll()) {
|
||||
_emojiScroll++;
|
||||
return true;
|
||||
}
|
||||
return true; // Consume tap in footer
|
||||
}
|
||||
|
||||
// Grid area
|
||||
if (vy >= EMJ_GRID_Y && vy < EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL) {
|
||||
int col = (vx - EMJ_GRID_X) / EMJ_CELL;
|
||||
int vr = (vy - EMJ_GRID_Y) / EMJ_CELL;
|
||||
if (col < 0 || col >= EMJ_COLS || vr < 0 || vr >= EMJ_VIS_ROWS) return true;
|
||||
|
||||
int idx = (_emojiScroll + vr) * EMJ_COLS + col;
|
||||
if (idx >= 0 && idx < EMOJI_COUNT) {
|
||||
insertEmoji(idx);
|
||||
_emojiMode = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return true; // Consume any tap while in emoji mode
|
||||
}
|
||||
|
||||
void insertEmoji(int idx) {
|
||||
// Insert as UTF-8 directly (not escape bytes) so sent messages are valid
|
||||
uint8_t utf8[8];
|
||||
int len = emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp, utf8);
|
||||
if (EMOJI_CODEPOINTS[idx].cp2 != 0)
|
||||
len += emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp2, utf8 + len);
|
||||
if (_textLen + len > _maxLen) return;
|
||||
memcpy(_text + _textLen, utf8, len);
|
||||
_textLen += len;
|
||||
_text[_textLen] = '\0';
|
||||
}
|
||||
|
||||
// Render text field with inline emoji sprites (10×10)
|
||||
void renderTextField(DisplayDriver& display) {
|
||||
// Convert UTF-8 emoji to escape bytes for sprite lookup
|
||||
char sanitized[MAX_TEXT + 1];
|
||||
emojiSanitize(_text, sanitized, sizeof(sanitized));
|
||||
|
||||
int x = 2;
|
||||
int maxX = 124;
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.setTextSize(0);
|
||||
|
||||
for (int i = 0; sanitized[i] && x < maxX; i++) {
|
||||
uint8_t b = (uint8_t)sanitized[i];
|
||||
if (b == EMOJI_PAD_BYTE) continue;
|
||||
|
||||
if (isEmojiEscape(b)) {
|
||||
const uint8_t* sprite = getEmojiSpriteSm(b);
|
||||
if (sprite && x + EMOJI_SM_W < maxX) {
|
||||
display.drawXbm(x, 14, sprite, EMOJI_SM_W, EMOJI_SM_H);
|
||||
x += EMOJI_SM_W + 1;
|
||||
}
|
||||
} else {
|
||||
char ch[2] = { (char)b, '\0' };
|
||||
display.setCursor(x, 12);
|
||||
display.print(ch);
|
||||
x += display.getTextWidth(ch);
|
||||
}
|
||||
}
|
||||
|
||||
// Blinking cursor
|
||||
if (x < maxX) {
|
||||
display.setCursor(x, 12);
|
||||
display.print("_");
|
||||
}
|
||||
}
|
||||
|
||||
// Layout constants (virtual coords)
|
||||
static const int KEY_W = 11;
|
||||
@@ -261,7 +430,7 @@ private:
|
||||
static const int KEY_START_Y = 34;
|
||||
|
||||
// Key layouts — rows 0-2 as char arrays
|
||||
// Special: ^ = shift, < = backspace, # = symbols, > = enter, ~ = space
|
||||
// Special: ^ = shift, < = backspace, \x01 = sym toggle, \x02 = emoji, > = enter, ~ = space
|
||||
const char* const* getLayout() const {
|
||||
static const char* const lower[3] = { "qwertyuiop", "asdfghjkl", "^zxcvbnm<" };
|
||||
static const char* const upper[3] = { "QWERTYUIOP", "ASDFGHJKL", "^ZXCVBNM<" };
|
||||
@@ -269,26 +438,22 @@ private:
|
||||
return _symbols ? syms : (_shifted ? upper : lower);
|
||||
}
|
||||
|
||||
// Row 4: variable-width keys [#/ABC] [,] [SPACE] [.] [Enter]
|
||||
// Row 4: variable-width keys [#/ABC] [,] [$] [SPACE] [.] [Enter]
|
||||
// Defined by physical zones, not the char-array approach
|
||||
struct R4Key { int x; int w; char ch; const char* label; };
|
||||
|
||||
void drawRow4(DisplayDriver& display, int y) {
|
||||
// # or ABC toggle: x=4, w=20
|
||||
// comma: x=26, w=11
|
||||
// space: x=39, w=50
|
||||
// period: x=91, w=11
|
||||
// enter: x=104, w=20
|
||||
const R4Key keys[] = {
|
||||
{ 4, 20, '\x01', _symbols ? "ABC" : "123" },
|
||||
{ 26, 11, ',', "," },
|
||||
{ 39, 50, '~', "space" },
|
||||
{ 39, 11, '\x02', "$" },
|
||||
{ 52, 37, '~', "space" },
|
||||
{ 91, 11, '.', "." },
|
||||
{ 104, 20, '>', "Send" }
|
||||
};
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
bool special = (keys[i].ch == '\x01' || keys[i].ch == '>');
|
||||
for (int i = 0; i < 6; i++) {
|
||||
bool special = (keys[i].ch == '\x01' || keys[i].ch == '>' || keys[i].ch == '\x02');
|
||||
if (special) {
|
||||
display.setColor(DisplayDriver::LIGHT);
|
||||
display.fillRect(keys[i].x, y + 1, keys[i].w, KEY_H - 1);
|
||||
@@ -312,11 +477,12 @@ private:
|
||||
const R4Key keys[] = {
|
||||
{ 4, 20, '\x01', nullptr },
|
||||
{ 26, 11, ',', nullptr },
|
||||
{ 39, 50, '~', nullptr },
|
||||
{ 39, 11, '\x02', nullptr },
|
||||
{ 52, 37, '~', nullptr },
|
||||
{ 91, 11, '.', nullptr },
|
||||
{ 104, 20, '>', nullptr }
|
||||
};
|
||||
for (int i = 0; i < 5; i++) {
|
||||
for (int i = 0; i < 6; i++) {
|
||||
if (vx >= keys[i].x && vx < keys[i].x + keys[i].w) {
|
||||
processKey(keys[i].ch);
|
||||
return true;
|
||||
@@ -334,10 +500,17 @@ private:
|
||||
// Symbol/letter toggle
|
||||
_symbols = !_symbols;
|
||||
_shifted = false;
|
||||
} else if (ch == '\x02') {
|
||||
// Emoji picker toggle
|
||||
_emojiMode = !_emojiMode;
|
||||
_emojiScroll = 0;
|
||||
} else if (ch == '<') {
|
||||
// Backspace
|
||||
// Backspace — UTF-8 aware (walk back past continuation bytes 10xxxxxx)
|
||||
if (_textLen > 0) {
|
||||
_textLen--;
|
||||
while (_textLen > 0 && ((uint8_t)_text[_textLen] & 0xC0) == 0x80) {
|
||||
_textLen--;
|
||||
}
|
||||
_text[_textLen] = '\0';
|
||||
}
|
||||
} else if (ch == '>') {
|
||||
|
||||
@@ -214,7 +214,6 @@ private:
|
||||
int httpGet(const char* url);
|
||||
bool httpReadChunk(int offset, int len, uint8_t* dest, int* bytesRead);
|
||||
void httpTerm();
|
||||
void otaPublish(const char* msg);
|
||||
int readRawBytes(uint8_t* dest, int count, uint32_t timeout_ms);
|
||||
|
||||
// --- Task ---
|
||||
|
||||
@@ -4,23 +4,23 @@
|
||||
/* ------------------------------ Config -------------------------------- */
|
||||
|
||||
#ifndef LORA_FREQ
|
||||
#define LORA_FREQ 915.0
|
||||
#define LORA_FREQ 923.125
|
||||
#endif
|
||||
#ifndef LORA_BW
|
||||
#define LORA_BW 250
|
||||
#define LORA_BW 62.5
|
||||
#endif
|
||||
#ifndef LORA_SF
|
||||
#define LORA_SF 10
|
||||
#define LORA_SF 8
|
||||
#endif
|
||||
#ifndef LORA_CR
|
||||
#define LORA_CR 5
|
||||
#define LORA_CR 8
|
||||
#endif
|
||||
#ifndef LORA_TX_POWER
|
||||
#define LORA_TX_POWER 20
|
||||
#define LORA_TX_POWER 22
|
||||
#endif
|
||||
|
||||
#ifndef ADVERT_NAME
|
||||
#define ADVERT_NAME "repeater"
|
||||
#define ADVERT_NAME "remote-repeater"
|
||||
#endif
|
||||
#ifndef ADVERT_LAT
|
||||
#define ADVERT_LAT 0.0
|
||||
@@ -534,10 +534,10 @@ void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const m
|
||||
// let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response
|
||||
mesh::Packet* path = createPathReturn(sender, secret, packet->path, packet->path_len,
|
||||
PAYLOAD_TYPE_RESPONSE, reply_data, reply_len);
|
||||
if (path) sendFlood(path, SERVER_RESPONSE_DELAY);
|
||||
if (path) sendFlood(path, (uint32_t)SERVER_RESPONSE_DELAY, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else if (reply_path_len < 0) {
|
||||
mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, sender, secret, reply_data, reply_len);
|
||||
if (reply) sendFlood(reply, SERVER_RESPONSE_DELAY);
|
||||
if (reply) sendFlood(reply, (uint32_t)SERVER_RESPONSE_DELAY, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else {
|
||||
mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, sender, secret, reply_data, reply_len);
|
||||
if (reply) sendDirect(reply, reply_path, reply_path_len, SERVER_RESPONSE_DELAY);
|
||||
@@ -609,7 +609,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
||||
// let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response
|
||||
mesh::Packet *path = createPathReturn(client->id, secret, packet->path, packet->path_len,
|
||||
PAYLOAD_TYPE_RESPONSE, reply_data, reply_len);
|
||||
if (path) sendFlood(path, SERVER_RESPONSE_DELAY);
|
||||
if (path) sendFlood(path, (uint32_t)SERVER_RESPONSE_DELAY, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else {
|
||||
mesh::Packet *reply =
|
||||
createDatagram(PAYLOAD_TYPE_RESPONSE, client->id, secret, reply_data, reply_len);
|
||||
@@ -617,7 +617,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
||||
if (client->out_path_len >= 0) { // we have an out_path, so send DIRECT
|
||||
sendDirect(reply, client->out_path, client->out_path_len, SERVER_RESPONSE_DELAY);
|
||||
} else {
|
||||
sendFlood(reply, SERVER_RESPONSE_DELAY);
|
||||
sendFlood(reply, (uint32_t)SERVER_RESPONSE_DELAY, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -648,7 +648,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
||||
mesh::Packet *ack = createAck(ack_hash);
|
||||
if (ack) {
|
||||
if (client->out_path_len < 0) {
|
||||
sendFlood(ack, TXT_ACK_DELAY);
|
||||
sendFlood(ack, (uint32_t)TXT_ACK_DELAY, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else {
|
||||
sendDirect(ack, client->out_path, client->out_path_len, TXT_ACK_DELAY);
|
||||
}
|
||||
@@ -676,7 +676,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
||||
auto reply = createDatagram(PAYLOAD_TYPE_TXT_MSG, client->id, secret, temp, 5 + text_len);
|
||||
if (reply) {
|
||||
if (client->out_path_len < 0) {
|
||||
sendFlood(reply, CLI_REPLY_DELAY_MILLIS);
|
||||
sendFlood(reply, (uint32_t)CLI_REPLY_DELAY_MILLIS, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else {
|
||||
sendDirect(reply, client->out_path, client->out_path_len, CLI_REPLY_DELAY_MILLIS);
|
||||
}
|
||||
@@ -801,6 +801,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
||||
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
|
||||
|
||||
_prefs.adc_multiplier = 0.0f; // 0.0f means use default board multiplier
|
||||
_prefs.path_hash_mode = 0; // 1-byte path hashes (legacy default)
|
||||
}
|
||||
|
||||
void MyMesh::begin(FILESYSTEM *fs) {
|
||||
@@ -857,7 +858,7 @@ bool MyMesh::formatFileSystem() {
|
||||
void MyMesh::sendSelfAdvertisement(int delay_millis) {
|
||||
mesh::Packet *pkt = createSelfAdvert();
|
||||
if (pkt) {
|
||||
sendFlood(pkt, delay_millis);
|
||||
sendFlood(pkt, (uint32_t)delay_millis, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
} else {
|
||||
MESH_DEBUG_PRINTLN("ERROR: unable to create advertisement packet!");
|
||||
}
|
||||
@@ -1145,6 +1146,17 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
|
||||
} else {
|
||||
strcpy(reply, "Err - ??");
|
||||
}
|
||||
} else if (memcmp(command, "set path.hash.mode ", 19) == 0) {
|
||||
int mode = atoi(&command[19]);
|
||||
if (mode >= 0 && mode <= 2) {
|
||||
_prefs.path_hash_mode = (uint8_t)mode;
|
||||
savePrefs();
|
||||
sprintf(reply, "OK - path.hash.mode = %d (%d-byte hashes)", mode, mode + 1);
|
||||
} else {
|
||||
strcpy(reply, "ERR: mode must be 0, 1, or 2");
|
||||
}
|
||||
} else if (strcmp(command, "get path.hash.mode") == 0) {
|
||||
sprintf(reply, "> %d (%d-byte path hashes)", _prefs.path_hash_mode, _prefs.path_hash_mode + 1);
|
||||
} else{
|
||||
_cli.handleCommand(sender_timestamp, command, reply); // common CLI commands
|
||||
}
|
||||
@@ -1159,7 +1171,7 @@ void MyMesh::loop() {
|
||||
|
||||
if (next_flood_advert && millisHasNowPassed(next_flood_advert)) {
|
||||
mesh::Packet *pkt = createSelfAdvert();
|
||||
if (pkt) sendFlood(pkt);
|
||||
if (pkt) sendFlood(pkt, (uint32_t)0, (uint8_t)(_prefs.path_hash_mode + 1));
|
||||
|
||||
updateFloodAdvertTimer(); // schedule next flood advert
|
||||
updateAdvertTimer(); // also schedule local advert (so they don't overlap)
|
||||
|
||||
@@ -68,11 +68,11 @@ struct NeighbourInfo {
|
||||
};
|
||||
|
||||
#ifndef FIRMWARE_BUILD_DATE
|
||||
#define FIRMWARE_BUILD_DATE "30 Nov 2025"
|
||||
#define FIRMWARE_BUILD_DATE "3 April 2026"
|
||||
#endif
|
||||
|
||||
#ifndef FIRMWARE_VERSION
|
||||
#define FIRMWARE_VERSION "v1.11.0"
|
||||
#define FIRMWARE_VERSION "v0.2"
|
||||
#endif
|
||||
|
||||
#define FIRMWARE_ROLE "repeater"
|
||||
|
||||
@@ -4,6 +4,13 @@
|
||||
|
||||
#ifdef HAS_4G_MODEM
|
||||
#include "CellularMQTT.h"
|
||||
#endif
|
||||
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
#include "WiFiMQTT.h"
|
||||
#endif
|
||||
|
||||
#if defined(HAS_4G_MODEM) || defined(MECK_WIFI_REMOTE)
|
||||
#define AUTO_OFF_DISABLED true
|
||||
#else
|
||||
#define AUTO_OFF_DISABLED false
|
||||
@@ -57,8 +64,10 @@ void UITask::renderCurrScreen() {
|
||||
_display->setCursor((_display->width() - versionWidth) / 2, 22);
|
||||
_display->print(_version_info);
|
||||
|
||||
#ifdef HAS_4G_MODEM
|
||||
#if defined(HAS_4G_MODEM)
|
||||
const char* node_type = "< Remote Repeater >";
|
||||
#elif defined(MECK_WIFI_REMOTE)
|
||||
const char* node_type = "< WiFi Repeater >";
|
||||
#else
|
||||
const char* node_type = "< Repeater >";
|
||||
#endif
|
||||
@@ -66,7 +75,7 @@ void UITask::renderCurrScreen() {
|
||||
_display->setCursor((_display->width() - typeWidth) / 2, 35);
|
||||
_display->print(node_type);
|
||||
} else {
|
||||
// Home screen — node info + cellular status
|
||||
// Home screen — node info + connection status
|
||||
_display->setCursor(0, 0);
|
||||
_display->setTextSize(1);
|
||||
_display->setColor(DisplayDriver::GREEN);
|
||||
@@ -81,6 +90,7 @@ void UITask::renderCurrScreen() {
|
||||
sprintf(tmp, "BW: %03.2f CR: %d", _node_prefs->bw, _node_prefs->cr);
|
||||
_display->print(tmp);
|
||||
|
||||
// --- Cellular status (4G variant) ---
|
||||
#ifdef HAS_4G_MODEM
|
||||
int y = 44;
|
||||
|
||||
@@ -109,11 +119,55 @@ void UITask::renderCurrScreen() {
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
|
||||
const char* ip = cellularMQTT.getIPAddress();
|
||||
if (ip[0]) {
|
||||
const char* ip4g = cellularMQTT.getIPAddress();
|
||||
if (ip4g[0]) {
|
||||
_display->setColor(DisplayDriver::LIGHT);
|
||||
_display->setCursor(0, y);
|
||||
sprintf(tmp, "IP: %s", ip);
|
||||
sprintf(tmp, "IP: %s", ip4g);
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
}
|
||||
|
||||
uint32_t upSec = millis() / 1000;
|
||||
uint32_t upH = upSec / 3600;
|
||||
uint32_t upM = (upSec % 3600) / 60;
|
||||
_display->setColor(DisplayDriver::LIGHT);
|
||||
_display->setCursor(0, y);
|
||||
sprintf(tmp, "Up: %luh %lum Heap:%dk", upH, upM, ESP.getFreeHeap() / 1024);
|
||||
_display->print(tmp);
|
||||
#endif
|
||||
|
||||
// --- WiFi status (WiFi variant) ---
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
int y = 44;
|
||||
|
||||
_display->setCursor(0, y);
|
||||
_display->setColor(DisplayDriver::LIGHT);
|
||||
sprintf(tmp, "WiFi: %s", wifiMQTT.stateString());
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
|
||||
_display->setCursor(0, y);
|
||||
sprintf(tmp, "RSSI: %d (%d bars)", wifiMQTT.getRSSI(), wifiMQTT.getSignalBars());
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
|
||||
_display->setCursor(0, y);
|
||||
sprintf(tmp, "SSID: %.16s", wifiMQTT.getSSID());
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
|
||||
_display->setCursor(0, y);
|
||||
_display->setColor(wifiMQTT.isConnected() ? DisplayDriver::GREEN : DisplayDriver::YELLOW);
|
||||
sprintf(tmp, "MQTT: %s", wifiMQTT.isConnected() ? "Connected" : "---");
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
|
||||
const char* ipWifi = wifiMQTT.getIPAddress();
|
||||
if (ipWifi[0]) {
|
||||
_display->setColor(DisplayDriver::LIGHT);
|
||||
_display->setCursor(0, y);
|
||||
sprintf(tmp, "IP: %s", ipWifi);
|
||||
_display->print(tmp);
|
||||
y += 10;
|
||||
}
|
||||
|
||||
@@ -78,17 +78,6 @@ void CellularMQTT::updateTelemetry(const TelemetryData& data) {
|
||||
}
|
||||
}
|
||||
|
||||
void CellularMQTT::requestOTA(const char* url) {
|
||||
if (_state == CellState::OTA_IN_PROGRESS) {
|
||||
Serial.println("[OTA] Already in progress");
|
||||
return;
|
||||
}
|
||||
strncpy(_otaUrl, url, sizeof(_otaUrl) - 1);
|
||||
_otaUrl[sizeof(_otaUrl) - 1] = '\0';
|
||||
_otaPending = true;
|
||||
Serial.printf("[OTA] Requested: %s\n", url);
|
||||
}
|
||||
|
||||
int CellularMQTT::getSignalBars() const {
|
||||
if (_csq == 99 || _csq == 0) return 0;
|
||||
if (_csq <= 5) return 1;
|
||||
@@ -115,8 +104,25 @@ const char* CellularMQTT::stateString() const {
|
||||
}
|
||||
}
|
||||
|
||||
void CellularMQTT::requestOTA(const char* url) {
|
||||
if (_state == CellState::OTA_IN_PROGRESS) {
|
||||
Serial.println("[OTA] Already in progress");
|
||||
return;
|
||||
}
|
||||
strncpy(_otaUrl, url, sizeof(_otaUrl) - 1);
|
||||
_otaUrl[sizeof(_otaUrl) - 1] = '\0';
|
||||
_otaPending = true;
|
||||
Serial.printf("[OTA] Requested: %s\n", url);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Config file: /remote/mqtt.cfg
|
||||
// Format (one value per line):
|
||||
// broker.hivemq.cloud
|
||||
// 8883
|
||||
// myusername
|
||||
// mypassword
|
||||
// mydeviceid (optional — auto-generated from MAC if omitted)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool CellularMQTT::loadConfig(MQTTConfig& cfg) {
|
||||
@@ -140,6 +146,7 @@ bool CellularMQTT::loadConfig(MQTTConfig& cfg) {
|
||||
line = f.readStringUntil('\n'); line.trim();
|
||||
strncpy(cfg.password, line.c_str(), sizeof(cfg.password) - 1);
|
||||
|
||||
// Optional device ID
|
||||
if (f.available()) {
|
||||
line = f.readStringUntil('\n'); line.trim();
|
||||
if (line.length() > 0) {
|
||||
@@ -149,6 +156,7 @@ bool CellularMQTT::loadConfig(MQTTConfig& cfg) {
|
||||
|
||||
f.close();
|
||||
|
||||
// Auto-generate device ID from ESP32 MAC if not provided
|
||||
if (cfg.deviceId[0] == '\0') {
|
||||
uint8_t mac[6];
|
||||
esp_efuse_mac_get_default(mac);
|
||||
@@ -160,7 +168,7 @@ bool CellularMQTT::loadConfig(MQTTConfig& cfg) {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Modem power-on
|
||||
// Modem power-on (same sequence as ModemManager)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool CellularMQTT::modemPowerOn() {
|
||||
@@ -371,7 +379,6 @@ void CellularMQTT::handleMqttRxPayload(const char* data, int len) {
|
||||
Serial.println("[Cell] Command queue full, dropping");
|
||||
}
|
||||
} else if (strstr(_rxTopic, "/ota")) {
|
||||
// Handle OTA directly in the modem task (not queued through main loop)
|
||||
requestOTA(data);
|
||||
}
|
||||
}
|
||||
@@ -388,10 +395,11 @@ void CellularMQTT::handleMqttConnLost(const char* line) {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// APN resolution
|
||||
// APN resolution (reuses Meck's ApnDatabase)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void CellularMQTT::resolveAPN() {
|
||||
// 1. Check SD config
|
||||
File f = SD.open("/remote/apn.cfg", FILE_READ);
|
||||
if (f) {
|
||||
String line = f.readStringUntil('\n');
|
||||
@@ -407,6 +415,7 @@ void CellularMQTT::resolveAPN() {
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Check modem's current APN
|
||||
if (sendAT("AT+CGDCONT?", "OK", 3000)) {
|
||||
char* p = strstr(_atBuf, "+CGDCONT:");
|
||||
if (p) {
|
||||
@@ -429,6 +438,7 @@ void CellularMQTT::resolveAPN() {
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Auto-detect from IMSI
|
||||
if (_imsi[0]) {
|
||||
const ApnEntry* entry = apnLookupFromIMSI(_imsi);
|
||||
if (entry) {
|
||||
@@ -446,7 +456,7 @@ void CellularMQTT::resolveAPN() {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Data connection
|
||||
// Data connection — activate PDP context
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool CellularMQTT::activateData() {
|
||||
@@ -461,6 +471,7 @@ bool CellularMQTT::activateData() {
|
||||
}
|
||||
}
|
||||
|
||||
// Query IP address
|
||||
if (sendAT("AT+CGPADDR=1", "OK", 5000)) {
|
||||
char* p = strstr(_atBuf, "+CGPADDR:");
|
||||
if (p) {
|
||||
@@ -495,6 +506,7 @@ bool CellularMQTT::mqttStart() {
|
||||
}
|
||||
}
|
||||
|
||||
// Acquire client with SSL enabled (third param = 1 for SSL)
|
||||
char cmd[120];
|
||||
snprintf(cmd, sizeof(cmd), "AT+CMQTTACCQ=0,\"%s\",1", _config.deviceId);
|
||||
if (!sendAT(cmd, "OK", 5000)) {
|
||||
@@ -502,9 +514,16 @@ bool CellularMQTT::mqttStart() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure TLS 1.2 (sslversion 4 = TLS 1.2)
|
||||
sendAT("AT+CSSLCFG=\"sslversion\",0,4", "OK", 3000);
|
||||
|
||||
// Skip certificate verification (no CA cert loaded on device)
|
||||
sendAT("AT+CSSLCFG=\"authmode\",0,0", "OK", 3000);
|
||||
|
||||
// Enable SNI — required for HiveMQ Cloud (shared IP, multiple clusters)
|
||||
sendAT("AT+CSSLCFG=\"enableSNI\",0,1", "OK", 3000);
|
||||
|
||||
// Bind SSL config to MQTT session
|
||||
sendAT("AT+CMQTTSSLCFG=0,0", "OK", 3000);
|
||||
|
||||
return true;
|
||||
@@ -519,9 +538,11 @@ bool CellularMQTT::mqttConnect() {
|
||||
|
||||
Serial.printf("[Cell] TX: AT+CMQTTCONNECT=0,\"ssl://%s:%d\",...\n",
|
||||
_config.broker, _config.port);
|
||||
Serial.printf("[Cell] Full cmd (%d chars): %s\n", strlen(cmd), cmd);
|
||||
Serial.printf("[Cell] Full cmd (%d chars): %s\n", strlen(cmd), cmd);
|
||||
MODEM_SERIAL.println(cmd);
|
||||
|
||||
// Wait for +CMQTTCONNECT URC (any result code, not just success)
|
||||
// Don't use waitResponse — it bails on "ERROR" before we see the code
|
||||
unsigned long start = millis();
|
||||
int pos = 0;
|
||||
_atBuf[0] = '\0';
|
||||
@@ -533,8 +554,10 @@ bool CellularMQTT::mqttConnect() {
|
||||
_atBuf[pos++] = c;
|
||||
_atBuf[pos] = '\0';
|
||||
}
|
||||
// Check for the URC regardless of what else is in the buffer
|
||||
char* p = strstr(_atBuf, "+CMQTTCONNECT:");
|
||||
if (p) {
|
||||
// Give it a moment to complete the line
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
while (MODEM_SERIAL.available() && pos < AT_BUF_SIZE - 1) {
|
||||
_atBuf[pos++] = MODEM_SERIAL.read();
|
||||
@@ -556,6 +579,7 @@ bool CellularMQTT::mqttConnect() {
|
||||
vTaskDelay(pdMS_TO_TICKS(50));
|
||||
}
|
||||
|
||||
// Timeout — dump what we got
|
||||
int len = strlen(_atBuf);
|
||||
while (len > 0 && (_atBuf[len-1] == '\r' || _atBuf[len-1] == '\n')) _atBuf[--len] = '\0';
|
||||
Serial.printf("[Cell] MQTT connect timeout. Buffer: %.200s\n", _atBuf);
|
||||
@@ -581,6 +605,7 @@ bool CellularMQTT::mqttPublish(const char* topic, const char* payload) {
|
||||
int tlen = strlen(topic);
|
||||
int plen = strlen(payload);
|
||||
|
||||
// Step 1: Set topic
|
||||
char cmd[80];
|
||||
snprintf(cmd, sizeof(cmd), "AT+CMQTTTOPIC=0,%d", tlen);
|
||||
MODEM_SERIAL.println(cmd);
|
||||
@@ -595,6 +620,7 @@ bool CellularMQTT::mqttPublish(const char* topic, const char* payload) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Step 2: Set payload
|
||||
snprintf(cmd, sizeof(cmd), "AT+CMQTTPAYLOAD=0,%d", plen);
|
||||
MODEM_SERIAL.println(cmd);
|
||||
if (!waitPrompt(5000)) {
|
||||
@@ -607,12 +633,14 @@ bool CellularMQTT::mqttPublish(const char* topic, const char* payload) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Step 3: Publish QoS 1, 60s timeout
|
||||
if (!sendAT("AT+CMQTTPUB=0,1,60", "OK", 15000)) {
|
||||
_pubFailCount++;
|
||||
Serial.printf("[Cell] Publish failed (%d consecutive)\n", _pubFailCount);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Success — reset failure counter
|
||||
_pubFailCount = 0;
|
||||
return true;
|
||||
}
|
||||
@@ -624,14 +652,9 @@ void CellularMQTT::mqttDisconnect() {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// OTA — HTTP download + ESP32 flash
|
||||
// OTA — HTTP download via A7682E + ESP32 flash
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void CellularMQTT::otaPublish(const char* msg) {
|
||||
Serial.printf("[OTA] %s\n", msg);
|
||||
mqttPublish(_topicRsp, msg);
|
||||
}
|
||||
|
||||
int CellularMQTT::readRawBytes(uint8_t* dest, int count, uint32_t timeout_ms) {
|
||||
unsigned long start = millis();
|
||||
int received = 0;
|
||||
@@ -645,7 +668,6 @@ int CellularMQTT::readRawBytes(uint8_t* dest, int count, uint32_t timeout_ms) {
|
||||
}
|
||||
|
||||
int CellularMQTT::httpGet(const char* url) {
|
||||
// Terminate any previous HTTP session
|
||||
sendAT("AT+HTTPTERM", "OK", 2000);
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
|
||||
@@ -654,7 +676,6 @@ int CellularMQTT::httpGet(const char* url) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Set URL via prompt pattern
|
||||
int urlLen = strlen(url);
|
||||
char cmd[40];
|
||||
snprintf(cmd, sizeof(cmd), "AT+HTTPPARA=\"URL\",%d", urlLen);
|
||||
@@ -671,23 +692,19 @@ int CellularMQTT::httpGet(const char* url) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// SSL config for HTTPS
|
||||
if (strncmp(url, "https://", 8) == 0) {
|
||||
sendAT("AT+HTTPPARA=\"SSLCFG\",0", "OK", 3000);
|
||||
}
|
||||
|
||||
// Follow redirects (GitHub releases use 302)
|
||||
sendAT("AT+HTTPPARA=\"REDIR\",1", "OK", 2000);
|
||||
|
||||
// Execute GET — response: +HTTPACTION: 0,<status>,<content_length>
|
||||
MODEM_SERIAL.println("AT+HTTPACTION=0");
|
||||
|
||||
// Wait for +HTTPACTION URC — download can take minutes over Cat-1
|
||||
unsigned long start = millis();
|
||||
int pos = 0;
|
||||
_atBuf[0] = '\0';
|
||||
|
||||
while (millis() - start < 180000) { // 3 minute timeout
|
||||
while (millis() - start < 180000) {
|
||||
while (MODEM_SERIAL.available()) {
|
||||
char c = MODEM_SERIAL.read();
|
||||
if (pos < AT_BUF_SIZE - 1) {
|
||||
@@ -725,13 +742,10 @@ int CellularMQTT::httpGet(const char* url) {
|
||||
bool CellularMQTT::httpReadChunk(int offset, int len, uint8_t* dest, int* bytesRead) {
|
||||
*bytesRead = 0;
|
||||
|
||||
// AT+HTTPREAD=<offset>,<length>
|
||||
// Response: +HTTPREAD: <actual_len>\r\n<binary data>\r\nOK
|
||||
char cmd[40];
|
||||
snprintf(cmd, sizeof(cmd), "AT+HTTPREAD=%d,%d", offset, len);
|
||||
MODEM_SERIAL.println(cmd);
|
||||
|
||||
// Wait for +HTTPREAD: <len> header
|
||||
unsigned long start = millis();
|
||||
int pos = 0;
|
||||
_atBuf[0] = '\0';
|
||||
@@ -755,7 +769,6 @@ bool CellularMQTT::httpReadChunk(int offset, int len, uint8_t* dest, int* bytesR
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read exactly actualLen binary bytes
|
||||
int got = readRawBytes(dest, actualLen, 15000);
|
||||
if (got != actualLen) {
|
||||
Serial.printf("[OTA] Short read: got %d expected %d\n", got, actualLen);
|
||||
@@ -763,8 +776,6 @@ bool CellularMQTT::httpReadChunk(int offset, int len, uint8_t* dest, int* bytesR
|
||||
}
|
||||
|
||||
*bytesRead = actualLen;
|
||||
|
||||
// Drain trailing \r\nOK\r\n
|
||||
waitResponse("OK", 3000, _atBuf, AT_BUF_SIZE);
|
||||
return true;
|
||||
}
|
||||
@@ -785,14 +796,12 @@ void CellularMQTT::performOTA() {
|
||||
_otaPending = false;
|
||||
_state = CellState::OTA_IN_PROGRESS;
|
||||
|
||||
otaPublish("OTA: Starting download...");
|
||||
Serial.printf("[OTA] URL: %s\n", _otaUrl);
|
||||
|
||||
// Disconnect MQTT — modem can only do one thing at a time
|
||||
mqttDisconnect();
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
|
||||
// Download firmware via HTTP
|
||||
int fileSize = httpGet(_otaUrl);
|
||||
if (fileSize <= 0) {
|
||||
Serial.println("[OTA] Download failed");
|
||||
@@ -803,7 +812,6 @@ void CellularMQTT::performOTA() {
|
||||
|
||||
Serial.printf("[OTA] Downloaded %d bytes, flashing...\n", fileSize);
|
||||
|
||||
// Begin ESP32 OTA
|
||||
if (!Update.begin(fileSize)) {
|
||||
Serial.printf("[OTA] Update.begin failed: %s\n", Update.errorString());
|
||||
httpTerm();
|
||||
@@ -811,7 +819,6 @@ void CellularMQTT::performOTA() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Allocate chunk buffer
|
||||
uint8_t* chunk = (uint8_t*)malloc(OTA_CHUNK_SIZE);
|
||||
if (!chunk) {
|
||||
Serial.println("[OTA] malloc failed");
|
||||
@@ -856,7 +863,7 @@ void CellularMQTT::performOTA() {
|
||||
lastPct = pct;
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(10)); // Yield to watchdog
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
}
|
||||
|
||||
free(chunk);
|
||||
@@ -941,6 +948,7 @@ restart:
|
||||
if (!registered) Serial.println("[Cell] Registration timeout — continuing");
|
||||
}
|
||||
|
||||
// Operator name
|
||||
sendAT("AT+COPS=3,0", "OK", 2000);
|
||||
if (sendAT("AT+COPS?", "OK", 5000)) {
|
||||
char* p = strchr(_atBuf, '"');
|
||||
@@ -966,7 +974,7 @@ restart:
|
||||
Serial.printf("[Cell] Registered: oper=%s CSQ=%d APN=%s IMEI=%s\n",
|
||||
_operator, _csq, _apn[0] ? _apn : "(none)", _imei);
|
||||
|
||||
// Sync ESP32 system clock from modem network time
|
||||
// Sync ESP32 system clock from modem network time
|
||||
for (int attempt = 0; attempt < 5; attempt++) {
|
||||
if (attempt > 0) vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
if (sendAT("AT+CCLK?", "OK", 3000)) {
|
||||
@@ -974,7 +982,7 @@ restart:
|
||||
if (p) {
|
||||
int yy=0, mo=0, dd=0, hh=0, mm=0, ss=0, tz=0;
|
||||
if (sscanf(p, "+CCLK: \"%d/%d/%d,%d:%d:%d", &yy, &mo, &dd, &hh, &mm, &ss) >= 6) {
|
||||
if (yy < 24 || yy > 50) continue;
|
||||
if (yy < 24 || yy > 50) continue; // Not synced yet
|
||||
char* tzp = p + 7;
|
||||
while (*tzp && *tzp != '+' && *tzp != '-') tzp++;
|
||||
if (*tzp) tz = atoi(tzp);
|
||||
@@ -1022,9 +1030,10 @@ restart:
|
||||
goto restart;
|
||||
}
|
||||
|
||||
// Allow MQTT session to stabilise before subscribing
|
||||
// Allow MQTT session to stabilise before subscribing
|
||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
|
||||
// Subscribe with retry — the modem sometimes misses the first prompt
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (mqttSubscribe(_topicCmd)) break;
|
||||
Serial.printf("[Cell] Subscribe retry %d for cmd topic\n", i + 1);
|
||||
@@ -1050,12 +1059,12 @@ restart:
|
||||
// Check for pending OTA request
|
||||
if (_otaPending && _state == CellState::CONNECTED) {
|
||||
performOTA();
|
||||
continue; // After OTA failure, reconnect loop handles recovery
|
||||
continue;
|
||||
}
|
||||
|
||||
drainURCs();
|
||||
|
||||
// Health check
|
||||
// Health check: too many consecutive publish failures = silent disconnect
|
||||
if (_pubFailCount >= MQTT_PUB_FAIL_MAX && _state == CellState::CONNECTED) {
|
||||
Serial.printf("[Cell] %d consecutive publish failures — forcing reconnect\n", _pubFailCount);
|
||||
_state = CellState::RECONNECTING;
|
||||
@@ -1070,6 +1079,7 @@ restart:
|
||||
mqttDisconnect();
|
||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
|
||||
// Check data is still active
|
||||
if (!sendAT("AT+CGACT?", "OK", 5000) || !strstr(_atBuf, ",1")) {
|
||||
if (!activateData()) {
|
||||
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||
@@ -1078,7 +1088,7 @@ restart:
|
||||
}
|
||||
|
||||
if (!mqttStart() || !mqttConnect()) {
|
||||
continue;
|
||||
continue; // Retry with backoff
|
||||
}
|
||||
|
||||
mqttSubscribe(_topicCmd);
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
#include "CellularMQTT.h"
|
||||
#endif
|
||||
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
#if defined(HAS_SDCARD) || defined(SDCARD_CS)
|
||||
#include <SD.h>
|
||||
#endif
|
||||
#include "WiFiMQTT.h"
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
#include "UITask.h"
|
||||
static UITask ui_task(display);
|
||||
@@ -28,7 +35,7 @@ static char command[160];
|
||||
unsigned long lastActive = 0; // mark last active time
|
||||
unsigned long nextSleepinSecs = 120; // next sleep in seconds. The first sleep (if enabled) is after 2 minutes from boot
|
||||
|
||||
#ifdef HAS_4G_MODEM
|
||||
#if (defined(HAS_4G_MODEM) || defined(MECK_WIFI_REMOTE)) && (defined(HAS_SDCARD) || defined(SDCARD_CS))
|
||||
static bool sdCardReady = false;
|
||||
#endif
|
||||
|
||||
@@ -93,10 +100,12 @@ void setup() {
|
||||
the_mesh.begin(fs);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SD card init — needed for CellularMQTT config (/remote/mqtt.cfg)
|
||||
// SD, LoRa, and e-ink share the same SPI bus on T-Deck Pro.
|
||||
// SD card init — needed for MQTT config on devices with SD slots.
|
||||
// T-Deck Pro: SD shares display SPI bus (HSPI via displaySpi)
|
||||
// T5S3: SD shares LoRa SPI bus (SCK=14, MOSI=13, MISO=21)
|
||||
// Heltec V4 and others without SD: config lives in SPIFFS (already init'd)
|
||||
// ---------------------------------------------------------------------------
|
||||
#ifdef HAS_4G_MODEM
|
||||
#if (defined(HAS_4G_MODEM) || defined(MECK_WIFI_REMOTE)) && (defined(HAS_SDCARD) || defined(SDCARD_CS))
|
||||
{
|
||||
// Deselect all SPI devices before SD init to prevent bus contention
|
||||
#ifdef SDCARD_CS
|
||||
@@ -114,7 +123,12 @@ void setup() {
|
||||
delay(100);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
#ifdef SDCARD_CS
|
||||
#if defined(LilyGo_T5S3_EPaper_Pro)
|
||||
// T5S3: SD shares LoRa SPI bus — create local HSPI reference
|
||||
static SPIClass sdSpi(HSPI);
|
||||
sdSpi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, SDCARD_CS);
|
||||
if (SD.begin(SDCARD_CS, sdSpi, 4000000)) { sdCardReady = true; break; }
|
||||
#elif defined(SDCARD_CS)
|
||||
extern SPIClass displaySpi;
|
||||
if (SD.begin(SDCARD_CS, displaySpi)) { sdCardReady = true; break; }
|
||||
#else
|
||||
@@ -124,8 +138,10 @@ void setup() {
|
||||
}
|
||||
Serial.printf("SD card: %s\n", sdCardReady ? "ready" : "FAILED");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Start cellular MQTT
|
||||
// Start MQTT backhaul
|
||||
#ifdef HAS_4G_MODEM
|
||||
if (sdCardReady) {
|
||||
cellularMQTT.begin();
|
||||
Serial.println("Cellular MQTT starting...");
|
||||
@@ -134,6 +150,21 @@ void setup() {
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
#if defined(HAS_SDCARD) || defined(SDCARD_CS)
|
||||
if (sdCardReady) {
|
||||
wifiMQTT.begin();
|
||||
Serial.println("WiFi MQTT starting...");
|
||||
} else {
|
||||
Serial.println("WiFi MQTT skipped — no SD card for config");
|
||||
}
|
||||
#else
|
||||
// No SD card slot — config lives in SPIFFS (already initialized above)
|
||||
wifiMQTT.begin();
|
||||
Serial.println("WiFi MQTT starting (SPIFFS config)...");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.begin(the_mesh.getNodePrefs(), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION);
|
||||
#endif
|
||||
@@ -170,13 +201,12 @@ void loop() {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MQTT → CLI bridge: process incoming commands from MQTT
|
||||
// MQTT → CLI bridge: process incoming commands from MQTT (cellular)
|
||||
// ---------------------------------------------------------------------------
|
||||
#ifdef HAS_4G_MODEM
|
||||
{
|
||||
MQTTCommand mqttCmd;
|
||||
while (cellularMQTT.recvCommand(mqttCmd)) {
|
||||
// CLI command — process through the same handler as serial/LoRa admin
|
||||
Serial.printf("[MQTT] CLI: %s\n", mqttCmd.cmd);
|
||||
char reply[512];
|
||||
reply[0] = '\0';
|
||||
@@ -189,7 +219,7 @@ void loop() {
|
||||
}
|
||||
}
|
||||
|
||||
// Periodic telemetry snapshot for MQTT publishing
|
||||
// Periodic telemetry snapshot for cellular MQTT
|
||||
{
|
||||
static unsigned long lastTelemUpdate = 0;
|
||||
if (millis() - lastTelemUpdate > 10000) {
|
||||
@@ -198,8 +228,13 @@ void loop() {
|
||||
memset(&td, 0, sizeof(td));
|
||||
td.uptime_secs = millis() / 1000;
|
||||
td.battery_mv = board.getBattMilliVolts();
|
||||
#ifdef HAS_BQ27220
|
||||
td.battery_pct = board.getBatteryPercent();
|
||||
td.temperature = board.getBattTemperature();
|
||||
#else
|
||||
td.battery_pct = 0;
|
||||
td.temperature = 0;
|
||||
#endif
|
||||
td.csq = cellularMQTT.getCSQ();
|
||||
td.freq = p->freq;
|
||||
td.bw = p->bw;
|
||||
@@ -218,6 +253,59 @@ void loop() {
|
||||
}
|
||||
#endif
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MQTT → CLI bridge: process incoming commands from MQTT (WiFi)
|
||||
// ---------------------------------------------------------------------------
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
wifiMQTT.loop();
|
||||
|
||||
{
|
||||
MQTTCommand mqttCmd;
|
||||
while (wifiMQTT.recvCommand(mqttCmd)) {
|
||||
Serial.printf("[MQTT] CLI: %s\n", mqttCmd.cmd);
|
||||
char reply[512];
|
||||
reply[0] = '\0';
|
||||
the_mesh.handleCommand((uint32_t)time(nullptr), mqttCmd.cmd, reply);
|
||||
|
||||
if (reply[0] == '\0') strcpy(reply, "OK");
|
||||
|
||||
wifiMQTT.sendResponse(wifiMQTT.getRspTopic(), reply);
|
||||
Serial.printf("[MQTT] Reply: %.80s\n", reply);
|
||||
}
|
||||
}
|
||||
|
||||
// Periodic telemetry snapshot for WiFi MQTT
|
||||
{
|
||||
static unsigned long lastTelemUpdate = 0;
|
||||
if (millis() - lastTelemUpdate > 10000) {
|
||||
NodePrefs* p = the_mesh.getNodePrefs();
|
||||
TelemetryData td;
|
||||
memset(&td, 0, sizeof(td));
|
||||
td.uptime_secs = millis() / 1000;
|
||||
td.battery_mv = board.getBattMilliVolts();
|
||||
#ifdef HAS_BQ27220
|
||||
td.battery_pct = board.getBatteryPercent();
|
||||
td.temperature = board.getBattTemperature();
|
||||
#else
|
||||
td.battery_pct = 0;
|
||||
td.temperature = 0;
|
||||
#endif
|
||||
td.rssi = wifiMQTT.getRSSI();
|
||||
td.freq = p->freq;
|
||||
td.bw = p->bw;
|
||||
td.sf = p->sf;
|
||||
td.cr = p->cr;
|
||||
td.tx_power = p->tx_power_dbm;
|
||||
strncpy(td.node_name, p->node_name, sizeof(td.node_name) - 1);
|
||||
td.mqtt_connected = wifiMQTT.isConnected();
|
||||
td.neighbor_count = 0;
|
||||
|
||||
wifiMQTT.updateTelemetry(td);
|
||||
lastTelemUpdate = millis();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
the_mesh.loop();
|
||||
sensors.loop();
|
||||
#ifdef DISPLAY_CLASS
|
||||
@@ -225,7 +313,7 @@ void loop() {
|
||||
#endif
|
||||
rtc_clock.tick();
|
||||
|
||||
#ifndef HAS_4G_MODEM
|
||||
#if !defined(HAS_4G_MODEM) && !defined(MECK_WIFI_REMOTE)
|
||||
if (the_mesh.getNodePrefs()->powersaving_enabled &&
|
||||
the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) {
|
||||
if (!the_mesh.hasPendingWork()) {
|
||||
|
||||
@@ -0,0 +1,509 @@
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
|
||||
#include "WiFiMQTT.h"
|
||||
#include <esp_mac.h>
|
||||
#include <Update.h>
|
||||
#include <HTTPClient.h>
|
||||
#include "target.h"
|
||||
|
||||
WiFiMQTT wifiMQTT;
|
||||
|
||||
#define WIFI_CONFIG_FILE "/remote/wifi.cfg"
|
||||
#define MQTT_CONFIG_FILE "/remote/mqtt.cfg"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Public API
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void WiFiMQTT::begin() {
|
||||
Serial.println("[WiFi] begin()");
|
||||
|
||||
_state = WiFiMQTTState::OFF;
|
||||
_cmdHead = _cmdTail = 0;
|
||||
_rspHead = _rspTail = 0;
|
||||
_activeNetwork = 0;
|
||||
|
||||
if (!loadConfig(_config)) {
|
||||
Serial.println("[WiFi] ERROR: Missing config files — cannot start");
|
||||
_state = WiFiMQTTState::ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.printf("[WiFi] Config: %d network(s), broker=%s:%d id=%s\n",
|
||||
_config.networkCount, _config.broker, _config.port, _config.deviceId);
|
||||
for (int i = 0; i < _config.networkCount; i++) {
|
||||
Serial.printf("[WiFi] %d: %s\n", i + 1, _config.networks[i].ssid);
|
||||
}
|
||||
|
||||
snprintf(_topicCmd, sizeof(_topicCmd), "meck/%s/cmd", _config.deviceId);
|
||||
snprintf(_topicRsp, sizeof(_topicRsp), "meck/%s/rsp", _config.deviceId);
|
||||
snprintf(_topicTelem, sizeof(_topicTelem), "meck/%s/telemetry", _config.deviceId);
|
||||
snprintf(_topicOta, sizeof(_topicOta), "meck/%s/ota", _config.deviceId);
|
||||
|
||||
// Configure TLS — skip server cert verification (same as cellular)
|
||||
_wifiClient.setInsecure();
|
||||
|
||||
_mqttClient.setClient(_wifiClient);
|
||||
_mqttClient.setServer(_config.broker, _config.port);
|
||||
_mqttClient.setCallback(mqttCallback);
|
||||
_mqttClient.setBufferSize(MQTT_PAYLOAD_MAX + MQTT_TOPIC_MAX);
|
||||
|
||||
_state = WiFiMQTTState::WIFI_CONNECTING;
|
||||
}
|
||||
|
||||
void WiFiMQTT::loop() {
|
||||
if (_state == WiFiMQTTState::OFF || _state == WiFiMQTTState::ERROR) return;
|
||||
|
||||
// Check for pending OTA
|
||||
if (_otaPending && _state == WiFiMQTTState::CONNECTED) {
|
||||
performOTA();
|
||||
return;
|
||||
}
|
||||
|
||||
// WiFi connection management
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
if (_state == WiFiMQTTState::CONNECTED || _state == WiFiMQTTState::MQTT_CONNECTING) {
|
||||
Serial.println("[WiFi] Connection lost");
|
||||
_state = WiFiMQTTState::WIFI_CONNECTING;
|
||||
}
|
||||
if (millis() - _lastWifiAttempt > WIFI_RECONNECT_MS) {
|
||||
connectWiFi();
|
||||
_lastWifiAttempt = millis();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// WiFi is up — check MQTT
|
||||
if (!_mqttClient.connected()) {
|
||||
if (_state == WiFiMQTTState::CONNECTED) {
|
||||
Serial.println("[WiFi] MQTT disconnected");
|
||||
}
|
||||
_state = WiFiMQTTState::MQTT_CONNECTING;
|
||||
if (millis() - _lastMqttAttempt > MQTT_RECONNECT_MS) {
|
||||
connectMQTT();
|
||||
_lastMqttAttempt = millis();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Connected — run MQTT loop
|
||||
_mqttClient.loop();
|
||||
|
||||
// Publish queued responses
|
||||
publishQueuedResponses();
|
||||
|
||||
// Periodic RSSI
|
||||
if (millis() - _lastRSSI > 30000) {
|
||||
_rssi = WiFi.RSSI();
|
||||
_lastRSSI = millis();
|
||||
}
|
||||
|
||||
// Periodic telemetry
|
||||
if (millis() - _lastTelem > TELEMETRY_INTERVAL) {
|
||||
publishTelemetry();
|
||||
_lastTelem = millis();
|
||||
}
|
||||
}
|
||||
|
||||
bool WiFiMQTT::recvCommand(MQTTCommand& out) {
|
||||
if (_cmdHead == _cmdTail) return false;
|
||||
memcpy(&out, &_cmdBuf[_cmdTail], sizeof(MQTTCommand));
|
||||
_cmdTail = (_cmdTail + 1) % CMD_QUEUE_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WiFiMQTT::sendResponse(const char* topic, const char* payload) {
|
||||
int next = (_rspHead + 1) % RSP_QUEUE_SIZE;
|
||||
if (next == _rspTail) return false; // Full
|
||||
memset(&_rspBuf[_rspHead], 0, sizeof(MQTTResponse));
|
||||
strncpy(_rspBuf[_rspHead].topic, topic, MQTT_TOPIC_MAX - 1);
|
||||
strncpy(_rspBuf[_rspHead].payload, payload, MQTT_PAYLOAD_MAX - 1);
|
||||
_rspHead = next;
|
||||
return true;
|
||||
}
|
||||
|
||||
void WiFiMQTT::updateTelemetry(const TelemetryData& data) {
|
||||
memcpy(&_telemetry, &data, sizeof(data));
|
||||
}
|
||||
|
||||
void WiFiMQTT::requestOTA(const char* url) {
|
||||
if (_state == WiFiMQTTState::OTA_IN_PROGRESS) return;
|
||||
strncpy(_otaUrl, url, sizeof(_otaUrl) - 1);
|
||||
_otaUrl[sizeof(_otaUrl) - 1] = '\0';
|
||||
_otaPending = true;
|
||||
Serial.printf("[OTA] Requested: %s\n", url);
|
||||
}
|
||||
|
||||
int WiFiMQTT::getSignalBars() const {
|
||||
if (_rssi == 0) return 0;
|
||||
if (_rssi > -50) return 5;
|
||||
if (_rssi > -60) return 4;
|
||||
if (_rssi > -70) return 3;
|
||||
if (_rssi > -80) return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char* WiFiMQTT::stateString() const {
|
||||
switch (_state) {
|
||||
case WiFiMQTTState::OFF: return "OFF";
|
||||
case WiFiMQTTState::WIFI_CONNECTING: return "WiFi...";
|
||||
case WiFiMQTTState::WIFI_CONNECTED: return "WiFi OK";
|
||||
case WiFiMQTTState::MQTT_CONNECTING: return "MQTT...";
|
||||
case WiFiMQTTState::CONNECTED: return "CONNECTED";
|
||||
case WiFiMQTTState::OTA_IN_PROGRESS: return "OTA";
|
||||
case WiFiMQTTState::ERROR: return "ERROR";
|
||||
default: return "???";
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Config files
|
||||
//
|
||||
// /remote/wifi.cfg — SSID/password pairs, two lines each:
|
||||
// HomeNetwork
|
||||
// HomePassword
|
||||
// BackupNetwork
|
||||
// BackupPassword
|
||||
//
|
||||
// /remote/mqtt.cfg — same format as cellular variant
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool WiFiMQTT::loadConfig(WiFiMQTTConfig& cfg) {
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
|
||||
// Determine filesystem: SD if available, otherwise SPIFFS
|
||||
// Heltec V4 and other headless boards have no SD slot — config lives in SPIFFS.
|
||||
// Upload config files via: pio run -t uploadfs (with data/ folder)
|
||||
#if defined(HAS_SDCARD) || defined(SDCARD_CS)
|
||||
fs::FS& configFS = SD;
|
||||
Serial.println("[WiFi] Config source: SD card");
|
||||
#else
|
||||
fs::FS& configFS = SPIFFS;
|
||||
Serial.println("[WiFi] Config source: SPIFFS");
|
||||
#endif
|
||||
|
||||
// WiFi config: read SSID/password pairs
|
||||
File wf = configFS.open(WIFI_CONFIG_FILE, FILE_READ);
|
||||
if (!wf) {
|
||||
Serial.printf("[WiFi] No %s\n", WIFI_CONFIG_FILE);
|
||||
return false;
|
||||
}
|
||||
|
||||
cfg.networkCount = 0;
|
||||
while (wf.available() && cfg.networkCount < MAX_WIFI_NETWORKS) {
|
||||
String ssid = wf.readStringUntil('\n'); ssid.trim();
|
||||
if (ssid.length() == 0) break;
|
||||
String pass = wf.readStringUntil('\n'); pass.trim();
|
||||
strncpy(cfg.networks[cfg.networkCount].ssid, ssid.c_str(), sizeof(cfg.networks[0].ssid) - 1);
|
||||
strncpy(cfg.networks[cfg.networkCount].password, pass.c_str(), sizeof(cfg.networks[0].password) - 1);
|
||||
cfg.networkCount++;
|
||||
}
|
||||
wf.close();
|
||||
|
||||
if (cfg.networkCount == 0) {
|
||||
Serial.println("[WiFi] No networks in wifi.cfg");
|
||||
return false;
|
||||
}
|
||||
|
||||
// MQTT config: /remote/mqtt.cfg (same format as cellular)
|
||||
File mf = configFS.open(MQTT_CONFIG_FILE, FILE_READ);
|
||||
if (!mf) {
|
||||
Serial.printf("[WiFi] No %s\n", MQTT_CONFIG_FILE);
|
||||
return false;
|
||||
}
|
||||
String line;
|
||||
line = mf.readStringUntil('\n'); line.trim();
|
||||
strncpy(cfg.broker, line.c_str(), sizeof(cfg.broker) - 1);
|
||||
line = mf.readStringUntil('\n'); line.trim();
|
||||
cfg.port = line.length() > 0 ? line.toInt() : 8883;
|
||||
line = mf.readStringUntil('\n'); line.trim();
|
||||
strncpy(cfg.username, line.c_str(), sizeof(cfg.username) - 1);
|
||||
line = mf.readStringUntil('\n'); line.trim();
|
||||
strncpy(cfg.password, line.c_str(), sizeof(cfg.password) - 1);
|
||||
if (mf.available()) {
|
||||
line = mf.readStringUntil('\n'); line.trim();
|
||||
if (line.length() > 0) {
|
||||
strncpy(cfg.deviceId, line.c_str(), sizeof(cfg.deviceId) - 1);
|
||||
}
|
||||
}
|
||||
mf.close();
|
||||
|
||||
// Auto-generate device ID if not provided
|
||||
if (cfg.deviceId[0] == '\0') {
|
||||
uint8_t mac[6];
|
||||
esp_efuse_mac_get_default(mac);
|
||||
snprintf(cfg.deviceId, sizeof(cfg.deviceId), "meck-%02x%02x%02x%02x",
|
||||
mac[2], mac[3], mac[4], mac[5]);
|
||||
}
|
||||
|
||||
return cfg.broker[0] != '\0';
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// WiFi connection — tries each configured network in order
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool WiFiMQTT::connectWiFi() {
|
||||
WiFi.mode(WIFI_STA);
|
||||
|
||||
for (int n = 0; n < _config.networkCount; n++) {
|
||||
Serial.printf("[WiFi] Trying %s (%d/%d)...\n",
|
||||
_config.networks[n].ssid, n + 1, _config.networkCount);
|
||||
WiFi.begin(_config.networks[n].ssid, _config.networks[n].password);
|
||||
|
||||
unsigned long start = millis();
|
||||
while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
|
||||
delay(100);
|
||||
}
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
IPAddress ip = WiFi.localIP();
|
||||
snprintf(_ipAddr, sizeof(_ipAddr), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||
_rssi = WiFi.RSSI();
|
||||
_activeNetwork = n;
|
||||
Serial.printf("[WiFi] Connected to %s — IP: %s RSSI: %d\n",
|
||||
_config.networks[n].ssid, _ipAddr, _rssi);
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
IPAddress ip = WiFi.localIP();
|
||||
snprintf(_ipAddr, sizeof(_ipAddr), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||
_rssi = WiFi.RSSI();
|
||||
_activeNetwork = n;
|
||||
Serial.printf("[WiFi] Connected to %s — IP: %s RSSI: %d\n",
|
||||
_config.networks[n].ssid, _ipAddr, _rssi);
|
||||
|
||||
// Sync clock via NTP
|
||||
configTime(0, 0, "pool.ntp.org", "time.google.com");
|
||||
Serial.print("[WiFi] NTP sync...");
|
||||
int tries = 0;
|
||||
while (time(nullptr) < 1700000000 && tries < 20) {
|
||||
delay(500);
|
||||
tries++;
|
||||
}
|
||||
time_t now = time(nullptr);
|
||||
if (now > 1700000000) {
|
||||
extern AutoDiscoverRTCClock rtc_clock;
|
||||
rtc_clock.setCurrentTime((uint32_t)now);
|
||||
Serial.printf(" OK (%lu)\n", (unsigned long)now);
|
||||
} else {
|
||||
Serial.println(" timeout");
|
||||
}
|
||||
|
||||
_state = WiFiMQTTState::WIFI_CONNECTED;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
WiFi.disconnect();
|
||||
delay(500);
|
||||
}
|
||||
|
||||
Serial.println("[WiFi] All networks failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MQTT connection
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
bool WiFiMQTT::connectMQTT() {
|
||||
Serial.printf("[WiFi] MQTT connecting to %s:%d...\n", _config.broker, _config.port);
|
||||
|
||||
char clientId[48];
|
||||
snprintf(clientId, sizeof(clientId), "%s-%lu", _config.deviceId, millis() & 0xFFFF);
|
||||
|
||||
if (_mqttClient.connect(clientId, _config.username, _config.password)) {
|
||||
Serial.println("[WiFi] MQTT connected!");
|
||||
|
||||
_mqttClient.subscribe(_topicCmd, 1);
|
||||
_mqttClient.subscribe(_topicOta, 1);
|
||||
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
|
||||
// Publish boot event
|
||||
_mqttClient.publish(_topicTelem, "{\"event\":\"boot\",\"state\":\"connected\"}", true);
|
||||
return true;
|
||||
}
|
||||
|
||||
Serial.printf("[WiFi] MQTT connect failed, rc=%d\n", _mqttClient.state());
|
||||
return false;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MQTT message callback
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void WiFiMQTT::mqttCallback(char* topic, byte* payload, unsigned int length) {
|
||||
wifiMQTT.onMessage(topic, payload, length);
|
||||
}
|
||||
|
||||
void WiFiMQTT::onMessage(char* topic, byte* payload, unsigned int length) {
|
||||
char buf[MQTT_PAYLOAD_MAX];
|
||||
int len = (length < MQTT_PAYLOAD_MAX - 1) ? length : MQTT_PAYLOAD_MAX - 1;
|
||||
memcpy(buf, payload, len);
|
||||
buf[len] = '\0';
|
||||
|
||||
Serial.printf("[WiFi] RX [%s]: %.80s\n", topic, buf);
|
||||
|
||||
if (strstr(topic, "/cmd")) {
|
||||
int next = (_cmdHead + 1) % CMD_QUEUE_SIZE;
|
||||
if (next != _cmdTail) {
|
||||
memset(&_cmdBuf[_cmdHead], 0, sizeof(MQTTCommand));
|
||||
strncpy(_cmdBuf[_cmdHead].cmd, buf, MQTT_PAYLOAD_MAX - 1);
|
||||
_cmdHead = next;
|
||||
Serial.printf("[WiFi] Queued CLI: %s\n", buf);
|
||||
} else {
|
||||
Serial.println("[WiFi] Command queue full");
|
||||
}
|
||||
} else if (strstr(topic, "/ota")) {
|
||||
requestOTA(buf);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Publish helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void WiFiMQTT::publishQueuedResponses() {
|
||||
while (_rspHead != _rspTail) {
|
||||
_mqttClient.publish(_rspBuf[_rspTail].topic, _rspBuf[_rspTail].payload);
|
||||
_rspTail = (_rspTail + 1) % RSP_QUEUE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
void WiFiMQTT::publishTelemetry() {
|
||||
_rssi = WiFi.RSSI();
|
||||
|
||||
char json[400];
|
||||
snprintf(json, sizeof(json),
|
||||
"{\"uptime\":%lu,\"batt_mv\":%d,\"batt_pct\":%d,\"temp\":%.1f,"
|
||||
"\"rssi\":%d,\"bars\":%d,\"neighbors\":%d,"
|
||||
"\"freq\":%.3f,\"bw\":%.1f,\"sf\":%d,\"cr\":%d,\"tx\":%d,"
|
||||
"\"name\":\"%s\",\"ip\":\"%s\",\"ssid\":\"%s\","
|
||||
"\"heap\":%d}",
|
||||
_telemetry.uptime_secs, _telemetry.battery_mv, _telemetry.battery_pct,
|
||||
_telemetry.temperature / 10.0f,
|
||||
_rssi, getSignalBars(), _telemetry.neighbor_count,
|
||||
_telemetry.freq, _telemetry.bw, _telemetry.sf, _telemetry.cr, _telemetry.tx_power,
|
||||
_telemetry.node_name, _ipAddr, _config.networks[_activeNetwork].ssid,
|
||||
ESP.getFreeHeap());
|
||||
|
||||
_mqttClient.publish(_topicTelem, json);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// OTA — HTTP download over WiFi + ESP32 flash
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void WiFiMQTT::performOTA() {
|
||||
_otaPending = false;
|
||||
_state = WiFiMQTTState::OTA_IN_PROGRESS;
|
||||
|
||||
Serial.printf("[OTA] URL: %s\n", _otaUrl);
|
||||
|
||||
_mqttClient.publish(_topicRsp, "OTA: Starting download...");
|
||||
_mqttClient.loop();
|
||||
|
||||
HTTPClient http;
|
||||
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
|
||||
http.setTimeout(180000);
|
||||
|
||||
if (!http.begin(_wifiClient, _otaUrl)) {
|
||||
Serial.println("[OTA] HTTP begin failed");
|
||||
_mqttClient.publish(_topicRsp, "OTA: HTTP begin failed");
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
int httpCode = http.GET();
|
||||
if (httpCode != HTTP_CODE_OK) {
|
||||
Serial.printf("[OTA] HTTP error: %d\n", httpCode);
|
||||
char msg[60];
|
||||
snprintf(msg, sizeof(msg), "OTA: HTTP error %d", httpCode);
|
||||
_mqttClient.publish(_topicRsp, msg);
|
||||
http.end();
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
int fileSize = http.getSize();
|
||||
if (fileSize <= 0) {
|
||||
Serial.println("[OTA] Unknown content length");
|
||||
_mqttClient.publish(_topicRsp, "OTA: Unknown file size");
|
||||
http.end();
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.printf("[OTA] File size: %d bytes\n", fileSize);
|
||||
|
||||
if (!Update.begin(fileSize)) {
|
||||
Serial.printf("[OTA] Update.begin failed: %s\n", Update.errorString());
|
||||
_mqttClient.publish(_topicRsp, "OTA: Flash init failed");
|
||||
http.end();
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
WiFiClient* stream = http.getStreamPtr();
|
||||
uint8_t buf[1024];
|
||||
int offset = 0;
|
||||
int lastPct = -1;
|
||||
|
||||
while (offset < fileSize) {
|
||||
int avail = stream->available();
|
||||
if (avail <= 0) {
|
||||
if (!stream->connected()) break;
|
||||
delay(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
int toRead = (avail < (int)sizeof(buf)) ? avail : sizeof(buf);
|
||||
int got = stream->readBytes(buf, toRead);
|
||||
if (got <= 0) break;
|
||||
|
||||
size_t written = Update.write(buf, got);
|
||||
if (written != (size_t)got) {
|
||||
Serial.printf("[OTA] Write failed: %d of %d\n", written, got);
|
||||
break;
|
||||
}
|
||||
|
||||
offset += got;
|
||||
|
||||
int pct = (offset * 100) / fileSize;
|
||||
if (pct / 10 != lastPct / 10) {
|
||||
Serial.printf("[OTA] Progress: %d%% (%d/%d)\n", pct, offset, fileSize);
|
||||
char msg[60];
|
||||
snprintf(msg, sizeof(msg), "OTA: Flashing %d%%", pct);
|
||||
_mqttClient.publish(_topicRsp, msg);
|
||||
_mqttClient.loop();
|
||||
lastPct = pct;
|
||||
}
|
||||
|
||||
delay(1);
|
||||
}
|
||||
|
||||
http.end();
|
||||
|
||||
if (offset < fileSize) {
|
||||
Serial.printf("[OTA] Incomplete: %d of %d\n", offset, fileSize);
|
||||
Update.abort();
|
||||
_mqttClient.publish(_topicRsp, "OTA: Download incomplete");
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Update.end(true)) {
|
||||
Serial.printf("[OTA] Update.end failed: %s\n", Update.errorString());
|
||||
_mqttClient.publish(_topicRsp, "OTA: Verification failed");
|
||||
_state = WiFiMQTTState::CONNECTED;
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.println("[OTA] SUCCESS — rebooting in 3 seconds");
|
||||
_mqttClient.publish(_topicRsp, "OTA: Success! Rebooting...");
|
||||
_mqttClient.loop();
|
||||
delay(3000);
|
||||
ESP.restart();
|
||||
}
|
||||
|
||||
#endif // MECK_WIFI_REMOTE
|
||||
@@ -0,0 +1,191 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// WiFiMQTT — WiFi + MQTT for audio variant remote repeater
|
||||
//
|
||||
// Same interface as CellularMQTT but uses ESP32 native WiFi + PubSubClient.
|
||||
// No modem, no AT commands, no FreeRTOS task — runs in the main loop.
|
||||
//
|
||||
// Supports multiple WiFi networks in wifi.cfg (SSID/password pairs).
|
||||
// Tries each in order on connect/reconnect.
|
||||
//
|
||||
// Guard: MECK_WIFI_REMOTE (set in platformio env build_flags)
|
||||
// =============================================================================
|
||||
|
||||
#ifdef MECK_WIFI_REMOTE
|
||||
|
||||
#ifndef WIFI_MQTT_H
|
||||
#define WIFI_MQTT_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <WiFi.h>
|
||||
#include <WiFiClientSecure.h>
|
||||
#include <PubSubClient.h>
|
||||
#if defined(HAS_SDCARD) || defined(SDCARD_CS)
|
||||
#include <SD.h>
|
||||
#endif
|
||||
#include <SPIFFS.h>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Configuration
|
||||
// ---------------------------------------------------------------------------
|
||||
#define MQTT_TOPIC_MAX 80
|
||||
#define MQTT_PAYLOAD_MAX 512
|
||||
#define MQTT_CLIENT_ID_MAX 32
|
||||
|
||||
#define CMD_QUEUE_SIZE 8
|
||||
#define RSP_QUEUE_SIZE 8
|
||||
|
||||
#define MAX_WIFI_NETWORKS 4
|
||||
|
||||
#define TELEMETRY_INTERVAL 60000 // 60 seconds
|
||||
#define WIFI_RECONNECT_MS 10000 // 10 seconds between WiFi reconnect attempts
|
||||
#define MQTT_RECONNECT_MS 5000 // 5 seconds between MQTT reconnect attempts
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// State machine
|
||||
// ---------------------------------------------------------------------------
|
||||
enum class WiFiMQTTState : uint8_t {
|
||||
OFF,
|
||||
WIFI_CONNECTING,
|
||||
WIFI_CONNECTED,
|
||||
MQTT_CONNECTING,
|
||||
CONNECTED,
|
||||
OTA_IN_PROGRESS,
|
||||
ERROR
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Queue message types (same as CellularMQTT for compatibility)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
struct MQTTCommand {
|
||||
char cmd[MQTT_PAYLOAD_MAX];
|
||||
};
|
||||
|
||||
struct MQTTResponse {
|
||||
char topic[MQTT_TOPIC_MAX];
|
||||
char payload[MQTT_PAYLOAD_MAX];
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Config (loaded from SD)
|
||||
// ---------------------------------------------------------------------------
|
||||
struct WiFiNetwork {
|
||||
char ssid[40];
|
||||
char password[64];
|
||||
};
|
||||
|
||||
struct WiFiMQTTConfig {
|
||||
WiFiNetwork networks[MAX_WIFI_NETWORKS];
|
||||
int networkCount;
|
||||
char broker[80];
|
||||
uint16_t port; // 8883 for MQTT TLS
|
||||
char username[40];
|
||||
char password[40];
|
||||
char deviceId[MQTT_CLIENT_ID_MAX];
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Telemetry snapshot
|
||||
// ---------------------------------------------------------------------------
|
||||
struct TelemetryData {
|
||||
uint32_t uptime_secs;
|
||||
uint16_t battery_mv;
|
||||
uint8_t battery_pct;
|
||||
int16_t temperature;
|
||||
int rssi;
|
||||
uint8_t neighbor_count;
|
||||
float freq;
|
||||
float bw;
|
||||
uint8_t sf;
|
||||
uint8_t cr;
|
||||
uint8_t tx_power;
|
||||
char node_name[32];
|
||||
bool mqtt_connected;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// WiFiMQTT class
|
||||
// ---------------------------------------------------------------------------
|
||||
class WiFiMQTT {
|
||||
public:
|
||||
void begin();
|
||||
void loop(); // Call from main loop — handles WiFi, MQTT, publish/subscribe
|
||||
|
||||
// --- Queue API (called from main loop) ---
|
||||
bool recvCommand(MQTTCommand& out);
|
||||
bool sendResponse(const char* topic, const char* payload);
|
||||
|
||||
// --- Telemetry ---
|
||||
void updateTelemetry(const TelemetryData& data);
|
||||
|
||||
// --- OTA ---
|
||||
void requestOTA(const char* url);
|
||||
bool isOTAInProgress() const { return _state == WiFiMQTTState::OTA_IN_PROGRESS; }
|
||||
|
||||
// --- State queries ---
|
||||
WiFiMQTTState getState() const { return _state; }
|
||||
bool isConnected() const { return _state == WiFiMQTTState::CONNECTED; }
|
||||
int getRSSI() const { return _rssi; }
|
||||
int getSignalBars() const;
|
||||
const char* getSSID() const { return _config.networks[_activeNetwork].ssid; }
|
||||
const char* getIPAddress() const { return _ipAddr; }
|
||||
const char* getBroker() const { return _config.broker; }
|
||||
const char* getRspTopic() const { return _topicRsp; }
|
||||
const char* stateString() const;
|
||||
|
||||
static bool loadConfig(WiFiMQTTConfig& cfg);
|
||||
|
||||
private:
|
||||
WiFiMQTTState _state = WiFiMQTTState::OFF;
|
||||
int _rssi = 0;
|
||||
int _activeNetwork = 0;
|
||||
|
||||
char _ipAddr[20] = {0};
|
||||
WiFiMQTTConfig _config = {};
|
||||
TelemetryData _telemetry = {};
|
||||
|
||||
// Topic strings
|
||||
char _topicCmd[MQTT_TOPIC_MAX] = {0};
|
||||
char _topicRsp[MQTT_TOPIC_MAX] = {0};
|
||||
char _topicTelem[MQTT_TOPIC_MAX] = {0};
|
||||
char _topicOta[MQTT_TOPIC_MAX] = {0};
|
||||
|
||||
// Command/response ring buffers (no FreeRTOS queues needed — single-threaded)
|
||||
MQTTCommand _cmdBuf[CMD_QUEUE_SIZE];
|
||||
int _cmdHead = 0, _cmdTail = 0;
|
||||
|
||||
MQTTResponse _rspBuf[RSP_QUEUE_SIZE];
|
||||
int _rspHead = 0, _rspTail = 0;
|
||||
|
||||
// MQTT client stack
|
||||
WiFiClientSecure _wifiClient;
|
||||
PubSubClient _mqttClient;
|
||||
|
||||
// Timers
|
||||
unsigned long _lastWifiAttempt = 0;
|
||||
unsigned long _lastMqttAttempt = 0;
|
||||
unsigned long _lastTelem = 0;
|
||||
unsigned long _lastRSSI = 0;
|
||||
|
||||
// OTA state
|
||||
bool _otaPending = false;
|
||||
char _otaUrl[256] = {0};
|
||||
|
||||
// --- Internal ---
|
||||
bool connectWiFi();
|
||||
bool connectMQTT();
|
||||
void publishTelemetry();
|
||||
void publishQueuedResponses();
|
||||
void performOTA();
|
||||
|
||||
// PubSubClient callback (static → instance)
|
||||
static void mqttCallback(char* topic, byte* payload, unsigned int length);
|
||||
void onMessage(char* topic, byte* payload, unsigned int length);
|
||||
};
|
||||
|
||||
extern WiFiMQTT wifiMQTT;
|
||||
|
||||
#endif // WIFI_MQTT_H
|
||||
#endif // MECK_WIFI_REMOTE
|
||||
@@ -6,4 +6,7 @@
|
||||
struct ChannelDetails {
|
||||
mesh::GroupChannel channel;
|
||||
char name[32];
|
||||
};
|
||||
char scope_name[31]; // Region scope name (e.g. "au-nsw"), empty = use device default
|
||||
|
||||
ChannelDetails() { memset(name, 0, sizeof(name)); memset(scope_name, 0, sizeof(scope_name)); }
|
||||
};
|
||||
@@ -81,7 +81,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
||||
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||
// 290
|
||||
file.read((uint8_t *)&_prefs->path_hash_mode, sizeof(_prefs->path_hash_mode)); // 290
|
||||
// 291
|
||||
|
||||
// sanitise bad pref values
|
||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||
@@ -107,6 +108,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
||||
|
||||
_prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
|
||||
_prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2);
|
||||
_prefs->path_hash_mode = constrain(_prefs->path_hash_mode, 0, 2);
|
||||
|
||||
file.close();
|
||||
}
|
||||
@@ -165,7 +167,8 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
||||
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||
// 290
|
||||
file.write((uint8_t *)&_prefs->path_hash_mode, sizeof(_prefs->path_hash_mode)); // 290
|
||||
// 291
|
||||
|
||||
file.close();
|
||||
}
|
||||
@@ -285,7 +288,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
||||
sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2);
|
||||
} else if (memcmp(config, "guest.password", 14) == 0) {
|
||||
sprintf(reply, "> %s", _prefs->guest_password);
|
||||
} else if (sender_timestamp == 0 && memcmp(config, "prv.key", 7) == 0) { // from serial command line only
|
||||
} else if (memcmp(config, "prv.key", 7) == 0) { // from serial command line only
|
||||
uint8_t prv_key[PRV_KEY_SIZE];
|
||||
int len = _callbacks->getSelfId().writeTo(prv_key, PRV_KEY_SIZE);
|
||||
mesh::Utils::toHex(tmp, prv_key, len);
|
||||
@@ -545,7 +548,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
||||
savePrefs();
|
||||
_callbacks->setTxPower(_prefs->tx_power_dbm);
|
||||
strcpy(reply, "OK");
|
||||
} else if (sender_timestamp == 0 && memcmp(config, "freq ", 5) == 0) {
|
||||
} else if (memcmp(config, "freq ", 5) == 0) {
|
||||
_prefs->freq = atof(&config[5]);
|
||||
savePrefs();
|
||||
strcpy(reply, "OK - reboot to apply");
|
||||
@@ -767,13 +770,13 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
||||
} else if (sender_timestamp == 0 && memcmp(command, "log", 3) == 0) {
|
||||
_callbacks->dumpLogFile();
|
||||
strcpy(reply, " EOF");
|
||||
} else if (sender_timestamp == 0 && memcmp(command, "stats-packets", 13) == 0 && (command[13] == 0 || command[13] == ' ')) {
|
||||
} else if (memcmp(command, "stats-packets", 13) == 0 && (command[13] == 0 || command[13] == ' ')) {
|
||||
_callbacks->formatPacketStatsReply(reply);
|
||||
} else if (sender_timestamp == 0 && memcmp(command, "stats-radio", 11) == 0 && (command[11] == 0 || command[11] == ' ')) {
|
||||
} else if (memcmp(command, "stats-radio", 11) == 0 && (command[11] == 0 || command[11] == ' ')) {
|
||||
_callbacks->formatRadioStatsReply(reply);
|
||||
} else if (sender_timestamp == 0 && memcmp(command, "stats-core", 10) == 0 && (command[10] == 0 || command[10] == ' ')) {
|
||||
} else if (memcmp(command, "stats-core", 10) == 0 && (command[10] == 0 || command[10] == ' ')) {
|
||||
_callbacks->formatStatsReply(reply);
|
||||
} else {
|
||||
strcpy(reply, "Unknown command");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,6 +52,8 @@ struct NodePrefs { // persisted to file
|
||||
uint32_t discovery_mod_timestamp;
|
||||
float adc_multiplier;
|
||||
char owner_info[120];
|
||||
// Multi-byte path hash support (added for Meck remote repeater)
|
||||
uint8_t path_hash_mode; // 0=1-byte (legacy), 1=2-byte, 2=3-byte path hashes
|
||||
};
|
||||
|
||||
class CommonCLICallbacks {
|
||||
@@ -110,4 +112,4 @@ public:
|
||||
void savePrefs(FILESYSTEM* _fs);
|
||||
void handleCommand(uint32_t sender_timestamp, const char* command, char* reply);
|
||||
uint8_t buildAdvertData(uint8_t node_type, uint8_t* app_data);
|
||||
};
|
||||
};
|
||||
@@ -140,11 +140,15 @@ class ESP32RTCClock : public mesh::RTCClock {
|
||||
public:
|
||||
ESP32RTCClock() { }
|
||||
void begin() {
|
||||
esp_reset_reason_t reason = esp_reset_reason();
|
||||
if (reason == ESP_RST_POWERON) {
|
||||
// start with some date/time in the recent past
|
||||
// Check if the ESP32 RTC peripheral retained a sane time across reset.
|
||||
// On power-on the value is undefined; on watchdog/brownout/SW reset it
|
||||
// may retain valid time OR garbage. Accept times in a plausible window
|
||||
// (Nov 2023 → May 2033) and re-seed anything outside that range.
|
||||
time_t _now;
|
||||
time(&_now);
|
||||
if (_now < 1700000000 || _now > 2000000000) {
|
||||
struct timeval tv;
|
||||
tv.tv_sec = 1715770351; // 15 May 2024, 8:50pm
|
||||
tv.tv_sec = 1715770351; // 15 May 2024, 8:50pm UTC (safe seed)
|
||||
tv.tv_usec = 0;
|
||||
settimeofday(&tv, NULL);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#include "SerialBLEInterface.h"
|
||||
#include "esp_bt.h"
|
||||
#include "esp_gap_ble_api.h"
|
||||
|
||||
// See the following for generating UUIDs:
|
||||
// https://www.uuidgenerator.net/
|
||||
@@ -27,6 +29,11 @@ void SerialBLEInterface::begin(const char* prefix, char* name, uint32_t pin_code
|
||||
BLEDevice::setSecurityCallbacks(this);
|
||||
BLEDevice::setMTU(MAX_FRAME_SIZE);
|
||||
|
||||
// Boost BLE TX power for improved range (+9 dBm, up from default +3 dBm)
|
||||
esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, ESP_PWR_LVL_P9);
|
||||
esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV, ESP_PWR_LVL_P9);
|
||||
esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_SCAN, ESP_PWR_LVL_P9);
|
||||
|
||||
BLESecurity sec;
|
||||
sec.setStaticPIN(pin_code);
|
||||
sec.setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND);
|
||||
@@ -77,6 +84,18 @@ void SerialBLEInterface::onAuthenticationComplete(esp_ble_auth_cmpl_t cmpl) {
|
||||
if (cmpl.success) {
|
||||
BLE_DEBUG_PRINTLN(" - SecurityCallback - Authentication Success");
|
||||
deviceConnected = true;
|
||||
|
||||
// Request fast connection interval (15ms) for faster contact sync.
|
||||
// Phone may negotiate higher, but most modern phones accept 15ms.
|
||||
// Units are 1.25ms, so 12 = 15ms, 16 = 20ms.
|
||||
esp_ble_conn_update_params_t conn_params;
|
||||
memcpy(conn_params.bda, _remote_bda, 6);
|
||||
conn_params.min_int = 12; // 15ms (12 × 1.25ms)
|
||||
conn_params.max_int = 16; // 20ms (16 × 1.25ms)
|
||||
conn_params.latency = 0; // no skipped intervals
|
||||
conn_params.timeout = 400; // 4 seconds supervision timeout
|
||||
esp_ble_gap_update_conn_params(&conn_params);
|
||||
BLE_DEBUG_PRINTLN(" - Requested fast connection interval (15-20ms)");
|
||||
} else {
|
||||
BLE_DEBUG_PRINTLN(" - SecurityCallback - Authentication Failure*");
|
||||
|
||||
@@ -94,6 +113,7 @@ void SerialBLEInterface::onConnect(BLEServer* pServer) {
|
||||
void SerialBLEInterface::onConnect(BLEServer* pServer, esp_ble_gatts_cb_param_t *param) {
|
||||
BLE_DEBUG_PRINTLN("onConnect(), conn_id=%d, mtu=%d", param->connect.conn_id, pServer->getPeerMTU(param->connect.conn_id));
|
||||
last_conn_id = param->connect.conn_id;
|
||||
memcpy(_remote_bda, param->connect.remote_bda, 6);
|
||||
}
|
||||
|
||||
void SerialBLEInterface::onMtuChanged(BLEServer* pServer, esp_ble_gatts_cb_param_t* param) {
|
||||
@@ -185,7 +205,7 @@ size_t SerialBLEInterface::writeFrame(const uint8_t src[], size_t len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define BLE_WRITE_MIN_INTERVAL 30
|
||||
#define BLE_WRITE_MIN_INTERVAL 15
|
||||
|
||||
bool SerialBLEInterface::isWriteBusy() const {
|
||||
return millis() < _last_write + BLE_WRITE_MIN_INTERVAL; // still too soon to start another write?
|
||||
|
||||
@@ -14,6 +14,7 @@ class SerialBLEInterface : public BaseSerialInterface, BLESecurityCallbacks, BLE
|
||||
bool oldDeviceConnected;
|
||||
bool _isEnabled;
|
||||
uint16_t last_conn_id;
|
||||
uint8_t _remote_bda[6]; // peer BDA, stored in onConnect for conn param updates
|
||||
uint32_t _pin_code;
|
||||
unsigned long _last_write;
|
||||
unsigned long adv_restart_time;
|
||||
@@ -23,7 +24,7 @@ class SerialBLEInterface : public BaseSerialInterface, BLESecurityCallbacks, BLE
|
||||
uint8_t buf[MAX_FRAME_SIZE];
|
||||
};
|
||||
|
||||
#define FRAME_QUEUE_SIZE 8
|
||||
#define FRAME_QUEUE_SIZE 16
|
||||
int recv_queue_len;
|
||||
Frame recv_queue[FRAME_QUEUE_SIZE];
|
||||
int send_queue_len;
|
||||
@@ -58,6 +59,7 @@ public:
|
||||
_isEnabled = false;
|
||||
_last_write = 0;
|
||||
last_conn_id = 0;
|
||||
memset(_remote_bda, 0, 6);
|
||||
send_queue_len = recv_queue_len = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ size_t SerialWifiInterface::writeFrame(const uint8_t src[], size_t len) {
|
||||
}
|
||||
|
||||
bool SerialWifiInterface::isWriteBusy() const {
|
||||
return false;
|
||||
return send_queue_len >= (FRAME_QUEUE_SIZE * 3 / 4); // backpressure at 75% full
|
||||
}
|
||||
|
||||
bool SerialWifiInterface::hasReceivedFrameHeader() {
|
||||
@@ -82,8 +82,8 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) {
|
||||
}
|
||||
|
||||
if (deviceConnected) {
|
||||
if (send_queue_len > 0) { // first, check send queue
|
||||
|
||||
// drain all pending send frames — WiFi TCP can handle the throughput
|
||||
while (send_queue_len > 0) {
|
||||
_last_write = millis();
|
||||
int len = send_queue[0].len;
|
||||
|
||||
@@ -97,70 +97,68 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) {
|
||||
for (int i = 0; i < send_queue_len; i++) { // delete top item from queue
|
||||
send_queue[i] = send_queue[i + 1];
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
// check if we are waiting for a frame header
|
||||
if(!hasReceivedFrameHeader()){
|
||||
// check if we are waiting for a frame header
|
||||
if(!hasReceivedFrameHeader()){
|
||||
|
||||
// make sure we have received enough bytes for a frame header
|
||||
// 3 bytes frame header = (1 byte frame type) + (2 bytes frame length as unsigned 16-bit little endian)
|
||||
int frame_header_length = 3;
|
||||
if(client.available() >= frame_header_length){
|
||||
// make sure we have received enough bytes for a frame header
|
||||
// 3 bytes frame header = (1 byte frame type) + (2 bytes frame length as unsigned 16-bit little endian)
|
||||
int frame_header_length = 3;
|
||||
if(client.available() >= frame_header_length){
|
||||
|
||||
// read frame header
|
||||
client.readBytes(&received_frame_header.type, 1);
|
||||
client.readBytes((uint8_t*)&received_frame_header.length, 2);
|
||||
|
||||
}
|
||||
// read frame header
|
||||
client.readBytes(&received_frame_header.type, 1);
|
||||
client.readBytes((uint8_t*)&received_frame_header.length, 2);
|
||||
|
||||
}
|
||||
|
||||
// check if we have received a frame header
|
||||
if(hasReceivedFrameHeader()){
|
||||
}
|
||||
|
||||
// make sure we have received enough bytes for the required frame length
|
||||
int available = client.available();
|
||||
int frame_type = received_frame_header.type;
|
||||
int frame_length = received_frame_header.length;
|
||||
if(frame_length > available){
|
||||
WIFI_DEBUG_PRINTLN("Waiting for %d more bytes", frame_length - available);
|
||||
return 0;
|
||||
// check if we have received a frame header
|
||||
if(hasReceivedFrameHeader()){
|
||||
|
||||
// make sure we have received enough bytes for the required frame length
|
||||
int available = client.available();
|
||||
int frame_type = received_frame_header.type;
|
||||
int frame_length = received_frame_header.length;
|
||||
if(frame_length > available){
|
||||
WIFI_DEBUG_PRINTLN("Waiting for %d more bytes", frame_length - available);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// skip frames that are larger than MAX_FRAME_SIZE
|
||||
if(frame_length > MAX_FRAME_SIZE){
|
||||
WIFI_DEBUG_PRINTLN("Skipping frame: length=%d is larger than MAX_FRAME_SIZE=%d", frame_length, MAX_FRAME_SIZE);
|
||||
while(frame_length > 0){
|
||||
uint8_t skip[1];
|
||||
int skipped = client.read(skip, 1);
|
||||
frame_length -= skipped;
|
||||
}
|
||||
|
||||
// skip frames that are larger than MAX_FRAME_SIZE
|
||||
if(frame_length > MAX_FRAME_SIZE){
|
||||
WIFI_DEBUG_PRINTLN("Skipping frame: length=%d is larger than MAX_FRAME_SIZE=%d", frame_length, MAX_FRAME_SIZE);
|
||||
while(frame_length > 0){
|
||||
uint8_t skip[1];
|
||||
int skipped = client.read(skip, 1);
|
||||
frame_length -= skipped;
|
||||
}
|
||||
resetReceivedFrameHeader();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// skip frames that are not expected type
|
||||
// '<' is 0x3c which indicates a frame sent from app to radio
|
||||
if(frame_type != '<'){
|
||||
WIFI_DEBUG_PRINTLN("Skipping frame: type=0x%x is unexpected", frame_type);
|
||||
while(frame_length > 0){
|
||||
uint8_t skip[1];
|
||||
int skipped = client.read(skip, 1);
|
||||
frame_length -= skipped;
|
||||
}
|
||||
resetReceivedFrameHeader();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// read frame data to provided buffer
|
||||
client.readBytes(dest, frame_length);
|
||||
|
||||
// ready for next frame
|
||||
resetReceivedFrameHeader();
|
||||
return frame_length;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// skip frames that are not expected type
|
||||
// '<' is 0x3c which indicates a frame sent from app to radio
|
||||
if(frame_type != '<'){
|
||||
WIFI_DEBUG_PRINTLN("Skipping frame: type=0x%x is unexpected", frame_type);
|
||||
while(frame_length > 0){
|
||||
uint8_t skip[1];
|
||||
int skipped = client.read(skip, 1);
|
||||
frame_length -= skipped;
|
||||
}
|
||||
resetReceivedFrameHeader();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// read frame data to provided buffer
|
||||
client.readBytes(dest, frame_length);
|
||||
|
||||
// ready for next frame
|
||||
resetReceivedFrameHeader();
|
||||
return frame_length;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class SerialWifiInterface : public BaseSerialInterface {
|
||||
|
||||
FrameHeader received_frame_header;
|
||||
|
||||
#define FRAME_QUEUE_SIZE 4
|
||||
#define FRAME_QUEUE_SIZE 64
|
||||
int recv_queue_len;
|
||||
Frame recv_queue[FRAME_QUEUE_SIZE];
|
||||
int send_queue_len;
|
||||
@@ -68,4 +68,4 @@ public:
|
||||
#else
|
||||
#define WIFI_DEBUG_PRINT(...) {}
|
||||
#define WIFI_DEBUG_PRINTLN(...) {}
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,350 +0,0 @@
|
||||
#if defined(TBEAM_SUPREME_SX1262) || defined(TBEAM_SX1262) || defined(TBEAM_SX1276)
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "TBeamBoard.h"
|
||||
//#include <RadioLib.h>
|
||||
|
||||
uint32_t deviceOnline = 0x00;
|
||||
|
||||
bool pmuInterrupt;
|
||||
static void setPmuFlag()
|
||||
{
|
||||
pmuInterrupt = true;
|
||||
}
|
||||
|
||||
void TBeamBoard::begin() {
|
||||
|
||||
ESP32Board::begin();
|
||||
|
||||
power_init();
|
||||
|
||||
//Configure user button
|
||||
pinMode(PIN_USER_BTN, INPUT);
|
||||
|
||||
#ifndef TBEAM_SUPREME_SX1262
|
||||
digitalWrite(P_LORA_TX_LED, HIGH); //inverted pin for SX1276 - HIGH for off
|
||||
#endif
|
||||
|
||||
//radiotype_detect();
|
||||
|
||||
esp_reset_reason_t reason = esp_reset_reason();
|
||||
if (reason == ESP_RST_DEEPSLEEP) {
|
||||
long wakeup_source = esp_sleep_get_ext1_wakeup_status();
|
||||
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
||||
startup_reason = BD_STARTUP_RX_PACKET;
|
||||
}
|
||||
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS);
|
||||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MESH_DEBUG
|
||||
void TBeamBoard::scanDevices(TwoWire *w)
|
||||
{
|
||||
uint8_t err, addr;
|
||||
int nDevices = 0;
|
||||
uint32_t start = 0;
|
||||
|
||||
Serial.println("Scanning I2C for Devices");
|
||||
for (addr = 1; addr < 127; addr++) {
|
||||
start = millis();
|
||||
w->beginTransmission(addr); delay(2);
|
||||
err = w->endTransmission();
|
||||
if (err == 0) {
|
||||
nDevices++;
|
||||
switch (addr) {
|
||||
case 0x77:
|
||||
case 0x76:
|
||||
Serial.println("\tFound BME280 Sensor");
|
||||
deviceOnline |= BME280_ONLINE;
|
||||
break;
|
||||
case 0x34:
|
||||
Serial.println("\tFound AXP192/AXP2101 PMU");
|
||||
deviceOnline |= POWERMANAGE_ONLINE;
|
||||
break;
|
||||
case 0x3C:
|
||||
Serial.println("\tFound SSD1306/SH1106 display");
|
||||
deviceOnline |= DISPLAY_ONLINE;
|
||||
break;
|
||||
case 0x51:
|
||||
Serial.println("\tFound PCF8563 RTC");
|
||||
deviceOnline |= PCF8563_ONLINE;
|
||||
break;
|
||||
case 0x1C:
|
||||
Serial.println("\tFound QMC6310 MAG Sensor");
|
||||
deviceOnline |= QMC6310_ONLINE;
|
||||
break;
|
||||
default:
|
||||
Serial.print("\tI2C device found at address 0x");
|
||||
if (addr < 16) {
|
||||
Serial.print("0");
|
||||
}
|
||||
Serial.print(addr, HEX);
|
||||
Serial.println(" !");
|
||||
break;
|
||||
}
|
||||
|
||||
} else if (err == 4) {
|
||||
Serial.print("Unknow error at address 0x");
|
||||
if (addr < 16) {
|
||||
Serial.print("0");
|
||||
}
|
||||
Serial.println(addr, HEX);
|
||||
}
|
||||
}
|
||||
if (nDevices == 0)
|
||||
Serial.println("No I2C devices found\n");
|
||||
|
||||
Serial.println("Scan for devices is complete.");
|
||||
Serial.println("\n");
|
||||
|
||||
Serial.printf("GPS RX pin: %d", PIN_GPS_RX);
|
||||
Serial.printf(" GPS TX pin: %d", PIN_GPS_TX);
|
||||
Serial.println();
|
||||
}
|
||||
void TBeamBoard::printPMU()
|
||||
{
|
||||
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
|
||||
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
|
||||
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
|
||||
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
|
||||
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
|
||||
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
|
||||
|
||||
// The battery percentage may be inaccurate at first use, the PMU will automatically
|
||||
// learn the battery curve and will automatically calibrate the battery percentage
|
||||
// after a charge and discharge cycle
|
||||
if (PMU->isBatteryConnect()) {
|
||||
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
|
||||
}
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
#endif
|
||||
|
||||
bool TBeamBoard::power_init()
|
||||
{
|
||||
if (!PMU) {
|
||||
#ifdef TBEAM_SUPREME_SX1262
|
||||
PMU = new XPowersAXP2101(PMU_WIRE_PORT, PIN_BOARD_SDA1, PIN_BOARD_SCL1, I2C_PMU_ADD);
|
||||
#else
|
||||
PMU = new XPowersAXP2101(PMU_WIRE_PORT, PIN_BOARD_SDA, PIN_BOARD_SCL, I2C_PMU_ADD);
|
||||
#endif
|
||||
if (!PMU->init()) {
|
||||
MESH_DEBUG_PRINTLN("Warning: Failed to find AXP2101 power management");
|
||||
delete PMU;
|
||||
PMU = NULL;
|
||||
} else {
|
||||
MESH_DEBUG_PRINTLN("AXP2101 PMU init succeeded, using AXP2101 PMU");
|
||||
}
|
||||
}
|
||||
if (!PMU) {
|
||||
PMU = new XPowersAXP192(PMU_WIRE_PORT, PIN_BOARD_SDA, PIN_BOARD_SCL, I2C_PMU_ADD);
|
||||
if (!PMU->init()) {
|
||||
MESH_DEBUG_PRINTLN("Warning: Failed to find AXP192 power management");
|
||||
delete PMU;
|
||||
PMU = NULL;
|
||||
} else {
|
||||
MESH_DEBUG_PRINTLN("AXP192 PMU init succeeded, using AXP192 PMU");
|
||||
}
|
||||
}
|
||||
|
||||
if (!PMU) {
|
||||
return false;
|
||||
}
|
||||
|
||||
deviceOnline |= POWERMANAGE_ONLINE;
|
||||
|
||||
PMU->setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG);
|
||||
|
||||
// Set up PMU interrupts
|
||||
pinMode(PIN_PMU_IRQ, INPUT_PULLUP);
|
||||
attachInterrupt(PIN_PMU_IRQ, setPmuFlag, FALLING);
|
||||
|
||||
if (PMU->getChipModel() == XPOWERS_AXP192) {
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300); //Set up LoRa power rail
|
||||
PMU->enablePowerOutput(XPOWERS_LDO2); //Enable the LoRa power rail
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); //Set up OLED power rail
|
||||
PMU->enablePowerOutput(XPOWERS_DCDC1); //Enable the OLED power rail
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300); //Set up GPS power rail
|
||||
PMU->enablePowerOutput(XPOWERS_LDO3); //Enable the GPS power rail
|
||||
|
||||
PMU->setProtectedChannel(XPOWERS_DCDC1); //Protect the OLED power rail
|
||||
PMU->setProtectedChannel(XPOWERS_DCDC3); //Protect the ESP32 power rail
|
||||
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC2); //Disable unsused power rail DC2
|
||||
|
||||
PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ); //Disable PMU IRQ
|
||||
|
||||
PMU->setChargerConstantCurr(XPOWERS_AXP192_CHG_CUR_450MA); //Set battery charging current
|
||||
PMU->setChargeTargetVoltage(XPOWERS_AXP192_CHG_VOL_4V2); //Set battery charge-stop voltage
|
||||
}
|
||||
else if(PMU->getChipModel() == XPOWERS_AXP2101){
|
||||
#ifdef TBEAM_SUPREME_SX1262
|
||||
//Set up the GPS power rail
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO4, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO4);
|
||||
|
||||
//Set up the LoRa power rail
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO3);
|
||||
|
||||
//Set up power rail for the M.2 interface
|
||||
PMU->setPowerChannelVoltage(XPOWERS_DCDC3, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_DCDC3);
|
||||
|
||||
if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()) {
|
||||
MESH_DEBUG_PRINTLN("Power off and restart ALDO BLDO..");
|
||||
PMU->disablePowerOutput(XPOWERS_ALDO1);
|
||||
PMU->disablePowerOutput(XPOWERS_ALDO2);
|
||||
PMU->disablePowerOutput(XPOWERS_BLDO1);
|
||||
delay(250);
|
||||
}
|
||||
|
||||
//Set up power rail for QMC6310U
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO2);
|
||||
|
||||
//Set up power rail for BME280 and OLED
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO1, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO1);
|
||||
|
||||
//Set up pwer rail for SD Card
|
||||
PMU->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_BLDO1);
|
||||
|
||||
//Set up power rail BLDO2 to headers
|
||||
PMU->setPowerChannelVoltage(XPOWERS_BLDO2, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_BLDO2);
|
||||
|
||||
//Set up power rail DCDC4 to headers
|
||||
PMU->setPowerChannelVoltage(XPOWERS_DCDC4, XPOWERS_AXP2101_DCDC4_VOL2_MAX);
|
||||
PMU->enablePowerOutput(XPOWERS_DCDC4);
|
||||
|
||||
//Set up power rail DCDC5 to headers
|
||||
PMU->setPowerChannelVoltage(XPOWERS_DCDC5, 3300);
|
||||
PMU->enablePowerOutput(XPOWERS_DCDC5);
|
||||
|
||||
//Disable unused power rails
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC2);
|
||||
PMU->disablePowerOutput(XPOWERS_DLDO1);
|
||||
PMU->disablePowerOutput(XPOWERS_DLDO2);
|
||||
PMU->disablePowerOutput(XPOWERS_VBACKUP);
|
||||
#else
|
||||
//Turn off unused power rails
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC2);
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC3);
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC4);
|
||||
PMU->disablePowerOutput(XPOWERS_DCDC5);
|
||||
PMU->disablePowerOutput(XPOWERS_ALDO1);
|
||||
PMU->disablePowerOutput(XPOWERS_ALDO4);
|
||||
PMU->disablePowerOutput(XPOWERS_BLDO1);
|
||||
PMU->disablePowerOutput(XPOWERS_BLDO2);
|
||||
PMU->disablePowerOutput(XPOWERS_DLDO1);
|
||||
PMU->disablePowerOutput(XPOWERS_DLDO2);
|
||||
//PMU->disablePowerOutput(XPOWERS_CPULDO);
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_VBACKUP, 3300); //Set up GPS RTC power
|
||||
PMU->enablePowerOutput(XPOWERS_VBACKUP); //Turn on GPS RTC power
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300); //Set up LoRa power rail
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO2); //Enable LoRa power rail
|
||||
|
||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300); //Set up GPS power rail
|
||||
PMU->enablePowerOutput(XPOWERS_ALDO3); //Enable GPS power rail
|
||||
|
||||
#endif
|
||||
|
||||
PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ); //Disable all PMU interrupts
|
||||
|
||||
PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA); //Set battery charging current to 500mA
|
||||
PMU->setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); //Set battery charging cutoff voltage to 4.2V
|
||||
|
||||
}
|
||||
|
||||
PMU->clearIrqStatus(); //Clear interrupt flags
|
||||
|
||||
PMU->disableTSPinMeasure(); //Disable TS detection, since it is not used
|
||||
|
||||
//Enable voltage measurements
|
||||
PMU->enableSystemVoltageMeasure();
|
||||
PMU->enableVbusVoltageMeasure();
|
||||
PMU->enableBattVoltageMeasure();
|
||||
|
||||
#ifdef MESH_DEBUG
|
||||
scanDevices(&Wire);
|
||||
printPMU();
|
||||
#endif
|
||||
|
||||
// Set the power key off press time
|
||||
PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S);
|
||||
return true;
|
||||
}
|
||||
|
||||
#pragma region "Debug code"
|
||||
// void TBeamBoard::radiotype_detect(){
|
||||
|
||||
// static SPIClass spi;
|
||||
// char chipTypeInfo;
|
||||
|
||||
// #if defined(P_LORA_SCLK)
|
||||
// spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI);
|
||||
// #endif
|
||||
|
||||
// for(int i = 0; i<radioVersions; i++){
|
||||
// switch(i){
|
||||
// case 0:
|
||||
// CustomSX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi);
|
||||
// int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8);
|
||||
// if (status != RADIOLIB_ERR_NONE) {
|
||||
// Serial.print("ERROR: SX1262 not found: ");
|
||||
// Serial.println(status);
|
||||
// //delete radio;
|
||||
// radio = NULL;
|
||||
// break;
|
||||
// }
|
||||
// else{
|
||||
// MESH_DEBUG_PRINTLN("SX1262 detected");
|
||||
// P_LORA_BUSY = 32;
|
||||
// RADIO_CLASS = CustomSX1262;
|
||||
// WRAPPER_CLASS = CustomSX1262Wrapper;
|
||||
// SX126X_RX_BOOSTED_GAIN = true;
|
||||
// SX126X_CURRENT_LIMIT = 140;
|
||||
// //delete radio;
|
||||
// radio = NULL;
|
||||
// break;
|
||||
// }
|
||||
// case 1:
|
||||
// SX1276 radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi);
|
||||
// int status1 = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8);
|
||||
// if (status1 != RADIOLIB_ERR_NONE) {
|
||||
// Serial.print("ERROR: SX1272 not found: ");
|
||||
// Serial.println(status1);
|
||||
// //delete radio;
|
||||
// radio = NULL;
|
||||
// }
|
||||
// else{
|
||||
// MESH_DEBUG_PRINTLN("SX1272 detected");
|
||||
// P_LORA_BUSY = RADIOLIB_NC;
|
||||
// P_LORA_DIO_2 = 32;
|
||||
// RADIO_CLASS = CustomSX1272;
|
||||
// WRAPPER_CLASS = CustomSX1272Wrapper;
|
||||
// SX127X_CURRENT_LIMIT = 120;
|
||||
// //delete radio;
|
||||
// radio = NULL;
|
||||
// return;
|
||||
// }
|
||||
// default:
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// }
|
||||
#pragma endregion
|
||||
|
||||
#endif
|
||||
@@ -1,166 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#if defined(TBEAM_SUPREME_SX1262) || defined(TBEAM_SX1262) || defined(TBEAM_SX1276)
|
||||
|
||||
// Define pin mappings BEFORE including ESP32Board.h so sleep() can use P_LORA_DIO_1
|
||||
#ifdef TBEAM_SUPREME_SX1262
|
||||
// LoRa radio module pins for TBeam S3 Supreme SX1262
|
||||
#define P_LORA_DIO_0 -1 //NC
|
||||
#define P_LORA_DIO_1 1 //SX1262 IRQ pin
|
||||
#define P_LORA_NSS 10 //SX1262 SS pin
|
||||
#define P_LORA_RESET 5 //SX1262 Rest pin
|
||||
#define P_LORA_BUSY 4 //SX1262 Busy pin
|
||||
#define P_LORA_SCLK 12 //SX1262 SCLK pin
|
||||
#define P_LORA_MISO 13 //SX1262 MISO pin
|
||||
#define P_LORA_MOSI 11 //SX1262 MOSI pin
|
||||
|
||||
#define PIN_BOARD_SDA1 42 //SDA for PMU and PFC8563 (RTC)
|
||||
#define PIN_BOARD_SCL1 41 //SCL for PMU and PFC8563 (RTC)
|
||||
|
||||
#define PIN_PMU_IRQ 40 //IRQ pin for PMU
|
||||
|
||||
// #define PIN_GPS_RX 9
|
||||
// #define PIN_GPS_TX 8
|
||||
// #define PIN_GPS_EN 7
|
||||
|
||||
#define P_BOARD_SPI_MOSI 35 //SPI for SD Card and QMI8653 (IMU)
|
||||
#define P_BOARD_SPI_MISO 37 //SPI for SD Card and QMI8653 (IMU)
|
||||
#define P_BOARD_SPI_SCK 36 //SPI for SD Card and QMI8653 (IMU)
|
||||
#define P_BPARD_SPI_CS 47 //Pin for SD Card CS
|
||||
#define P_BOARD_IMU_CS 34 //Pin for QMI8653 (IMU) CS
|
||||
|
||||
#define P_BOARD_IMU_INT 33 //IMU Int pin
|
||||
#define P_BOARD_RTC_INT 14 //RTC Int pin
|
||||
|
||||
//I2C Wire addresses
|
||||
#define I2C_BME280_ADD 0x76 //BME280 sensor I2C address on Wire
|
||||
#define I2C_OLED_ADD 0x3C //SH1106 OLED I2C address on Wire
|
||||
#define I2C_QMC6310U_ADD 0x1C //QMC6310U mag sensor I2C address on Wire
|
||||
|
||||
//I2C Wire1 addresses
|
||||
#define I2C_RTC_ADD 0x51 //RTC I2C address on Wire1
|
||||
#define I2C_PMU_ADD 0x34 //AXP2101 I2C address on Wire1
|
||||
|
||||
#define PMU_WIRE_PORT Wire1
|
||||
#define RTC_WIRE_PORT Wire1
|
||||
#endif
|
||||
|
||||
#ifdef TBEAM_SX1262
|
||||
#define P_LORA_BUSY 32
|
||||
#endif
|
||||
|
||||
#ifdef TBEAM_SX1276
|
||||
#define P_LORA_DIO_2 32
|
||||
#define P_LORA_BUSY RADIOLIB_NC
|
||||
#endif
|
||||
|
||||
#if defined(TBEAM_SX1262) || defined(TBEAM_SX1276)
|
||||
// LoRa radio module pins for TBeam
|
||||
// uint32_t P_LORA_BUSY = 0; //shared, so define at run
|
||||
// uint32_t P_LORA_DIO_2 = 0; //SX1276 only, so define at run
|
||||
|
||||
#define P_LORA_DIO_0 26
|
||||
#define P_LORA_DIO_1 33
|
||||
#define P_LORA_NSS 18
|
||||
#define P_LORA_RESET 23
|
||||
#define P_LORA_SCLK 5
|
||||
#define P_LORA_MISO 19
|
||||
#define P_LORA_MOSI 27
|
||||
|
||||
// #define PIN_GPS_RX 34
|
||||
// #define PIN_GPS_TX 12
|
||||
|
||||
#define PIN_PMU_IRQ 35
|
||||
#define PMU_WIRE_PORT Wire
|
||||
#define RTC_WIRE_PORT Wire
|
||||
#define I2C_PMU_ADD 0x34
|
||||
#endif
|
||||
|
||||
// enum RadioType {
|
||||
// SX1262,
|
||||
// SX1276
|
||||
// };
|
||||
|
||||
// Include headers AFTER pin definitions so ESP32Board::sleep() can use P_LORA_DIO_1
|
||||
#include <Wire.h>
|
||||
#include <Arduino.h>
|
||||
#include "XPowersLib.h"
|
||||
#include "helpers/ESP32Board.h"
|
||||
#include <driver/rtc_io.h>
|
||||
|
||||
class TBeamBoard : public ESP32Board {
|
||||
XPowersLibInterface *PMU = NULL;
|
||||
//PhysicalLayer * pl;
|
||||
//RadioType * radio = NULL;
|
||||
// int radioVersions = 2;
|
||||
|
||||
enum {
|
||||
POWERMANAGE_ONLINE = _BV(0),
|
||||
DISPLAY_ONLINE = _BV(1),
|
||||
RADIO_ONLINE = _BV(2),
|
||||
GPS_ONLINE = _BV(3),
|
||||
PSRAM_ONLINE = _BV(4),
|
||||
SDCARD_ONLINE = _BV(5),
|
||||
AXDL345_ONLINE = _BV(6),
|
||||
BME280_ONLINE = _BV(7),
|
||||
BMP280_ONLINE = _BV(8),
|
||||
BME680_ONLINE = _BV(9),
|
||||
QMC6310_ONLINE = _BV(10),
|
||||
QMI8658_ONLINE = _BV(11),
|
||||
PCF8563_ONLINE = _BV(12),
|
||||
OSC32768_ONLINE = _BV(13),
|
||||
};
|
||||
|
||||
bool power_init();
|
||||
//void radiotype_detect();
|
||||
|
||||
public:
|
||||
|
||||
#ifdef MESH_DEBUG
|
||||
void printPMU();
|
||||
void scanDevices(TwoWire *w);
|
||||
#endif
|
||||
void begin();
|
||||
|
||||
#ifndef TBEAM_SUPREME_SX1262
|
||||
void onBeforeTransmit() override{
|
||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on - invert pin for SX1276
|
||||
}
|
||||
void onAfterTransmit() override{
|
||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off - invert pin for SX1276
|
||||
}
|
||||
#endif
|
||||
|
||||
void enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
||||
|
||||
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
||||
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
|
||||
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||
|
||||
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
|
||||
|
||||
if (pin_wake_btn < 0) {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
||||
} else {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
||||
}
|
||||
|
||||
if (secs > 0) {
|
||||
esp_sleep_enable_timer_wakeup(secs * 1000000);
|
||||
}
|
||||
|
||||
// Finally set ESP32 into sleep
|
||||
esp_deep_sleep_start(); // CPU halts here and never returns!
|
||||
}
|
||||
|
||||
uint16_t getBattMilliVolts(){
|
||||
return PMU->getBattVoltage();
|
||||
}
|
||||
|
||||
const char* getManufacturerName() const{
|
||||
return "LilyGo T-Beam";
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -6,6 +6,7 @@
|
||||
class DisplayDriver {
|
||||
int _w, _h;
|
||||
protected:
|
||||
uint8_t _fontStyle = 0; // 0=Classic, 1=Noto Sans, 2=Montserrat
|
||||
DisplayDriver(int w, int h) { _w = w; _h = h; }
|
||||
public:
|
||||
enum Color { DARK=0, LIGHT, RED, GREEN, BLUE, YELLOW, ORANGE }; // on b/w screen, colors will be !=0 synonym of light
|
||||
@@ -13,6 +14,10 @@ public:
|
||||
int width() const { return _w; }
|
||||
int height() const { return _h; }
|
||||
|
||||
// Font style — controls typeface used by setTextSize()
|
||||
void setFontStyle(uint8_t s) { _fontStyle = s; }
|
||||
uint8_t getFontStyle() const { return _fontStyle; }
|
||||
|
||||
virtual bool isOn() = 0;
|
||||
virtual void turnOn() = 0;
|
||||
virtual void turnOff() = 0;
|
||||
@@ -97,4 +102,4 @@ public:
|
||||
}
|
||||
|
||||
virtual void endFrame() = 0;
|
||||
};
|
||||
};
|
||||
@@ -117,13 +117,23 @@ void FastEPDDisplay::startFrame(Color bkg) {
|
||||
_frameCRC.reset();
|
||||
_frameCRC.update<bool>(_darkMode);
|
||||
_frameCRC.update<bool>(_portraitMode);
|
||||
_frameCRC.update<uint8_t>(_fontStyle);
|
||||
}
|
||||
|
||||
void FastEPDDisplay::setTextSize(int sz) {
|
||||
if (!_canvas) return;
|
||||
_frameCRC.update<int>(sz);
|
||||
|
||||
// Font mapping for 960×540 display at ~234 DPI
|
||||
// Check for custom font style first (Noto Sans, Montserrat)
|
||||
const GFXfont* customFont = meckGetFont(_fontStyle, sz);
|
||||
if (customFont) {
|
||||
_canvas->setFont(customFont);
|
||||
// textSize 5 (clock face) uses ×5 scaling even with custom fonts
|
||||
_canvas->setTextSize(sz == 5 ? 5 : 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// Classic style (or fallback) — original FreeSans/FreeSerif fonts
|
||||
// Toggle between font families via -D MECK_SERIF_FONT build flag
|
||||
switch(sz) {
|
||||
case 0: // Body text — reader content, settings rows, messages, footers
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
#include <Fonts/FreeSerif12pt7b.h>
|
||||
#include <Fonts/FreeSerif18pt7b.h>
|
||||
|
||||
// Meck custom font styles (Noto Sans, Montserrat)
|
||||
#include "MeckFonts.h"
|
||||
|
||||
#include "DisplayDriver.h"
|
||||
|
||||
// GxEPD2 color constant compatibility — MapScreen uses these directly
|
||||
|
||||
@@ -98,6 +98,18 @@ void GxEPDDisplay::startFrame(Color bkg) {
|
||||
|
||||
void GxEPDDisplay::setTextSize(int sz) {
|
||||
display_crc.update<int>(sz);
|
||||
display_crc.update<uint8_t>(_fontStyle);
|
||||
|
||||
// Check for custom font style first (Noto Sans, Montserrat)
|
||||
const GFXfont* customFont = meckGetFont(_fontStyle, sz);
|
||||
if (customFont) {
|
||||
display.setFont(customFont);
|
||||
// textSize 5 (clock face) uses ×2 scaling even with custom fonts
|
||||
display.setTextSize(sz == 5 ? 2 : 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// Classic style (or fallback) — original FreeSans fonts
|
||||
switch(sz) {
|
||||
case 0: // Tiny - built-in 6x8 pixel font
|
||||
display.setFont(NULL);
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
#include <Fonts/FreeSansBold12pt7b.h>
|
||||
#include <Fonts/FreeSans18pt7b.h>
|
||||
|
||||
// Meck custom font styles (Noto Sans, Montserrat)
|
||||
#include "MeckFonts.h"
|
||||
|
||||
// Inline CRC32 for frame change detection (replaces bakercp/CRC32
|
||||
// to avoid naming collision with PNGdec's bundled CRC32.h)
|
||||
class FrameCRC32 {
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <helpers/RefCountedDigitalPin.h>
|
||||
#include <helpers/ESP32Board.h>
|
||||
|
||||
// built-ins
|
||||
#ifndef PIN_VBAT_READ // set in platformio.ini for boards like Heltec Wireless Paper (20)
|
||||
#define PIN_VBAT_READ 1
|
||||
#endif
|
||||
#ifndef PIN_ADC_CTRL // set in platformio.ini for Heltec Wireless Tracker (2)
|
||||
#define PIN_ADC_CTRL 37
|
||||
#endif
|
||||
#define PIN_ADC_CTRL_ACTIVE LOW
|
||||
#define PIN_ADC_CTRL_INACTIVE HIGH
|
||||
|
||||
#include <driver/rtc_io.h>
|
||||
|
||||
class HeltecV3Board : public ESP32Board {
|
||||
private:
|
||||
bool adc_active_state;
|
||||
|
||||
public:
|
||||
RefCountedDigitalPin periph_power;
|
||||
|
||||
HeltecV3Board() : periph_power(PIN_VEXT_EN) { }
|
||||
|
||||
void begin() {
|
||||
ESP32Board::begin();
|
||||
|
||||
// Auto-detect correct ADC_CTRL pin polarity (different for boards >3.2)
|
||||
pinMode(PIN_ADC_CTRL, INPUT);
|
||||
adc_active_state = !digitalRead(PIN_ADC_CTRL);
|
||||
|
||||
pinMode(PIN_ADC_CTRL, OUTPUT);
|
||||
digitalWrite(PIN_ADC_CTRL, !adc_active_state); // Initially inactive
|
||||
|
||||
periph_power.begin();
|
||||
|
||||
esp_reset_reason_t reason = esp_reset_reason();
|
||||
if (reason == ESP_RST_DEEPSLEEP) {
|
||||
long wakeup_source = esp_sleep_get_ext1_wakeup_status();
|
||||
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
||||
startup_reason = BD_STARTUP_RX_PACKET;
|
||||
}
|
||||
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS);
|
||||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1);
|
||||
}
|
||||
}
|
||||
|
||||
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
|
||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
||||
|
||||
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
||||
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
|
||||
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||
|
||||
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
|
||||
|
||||
if (pin_wake_btn < 0) {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
||||
} else {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
||||
}
|
||||
|
||||
if (secs > 0) {
|
||||
esp_sleep_enable_timer_wakeup(secs * 1000000);
|
||||
}
|
||||
|
||||
// Finally set ESP32 into sleep
|
||||
esp_deep_sleep_start(); // CPU halts here and never returns!
|
||||
}
|
||||
|
||||
void powerOff() override {
|
||||
enterDeepSleep(0);
|
||||
}
|
||||
|
||||
uint16_t getBattMilliVolts() override {
|
||||
analogReadResolution(10);
|
||||
digitalWrite(PIN_ADC_CTRL, adc_active_state);
|
||||
|
||||
uint32_t raw = 0;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
raw += analogRead(PIN_VBAT_READ);
|
||||
}
|
||||
raw = raw / 8;
|
||||
|
||||
digitalWrite(PIN_ADC_CTRL, !adc_active_state);
|
||||
|
||||
return (5.42 * (3.3 / 1024.0) * raw) * 1000;
|
||||
}
|
||||
|
||||
const char* getManufacturerName() const override {
|
||||
return "Heltec V3";
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,61 @@
|
||||
[Heltec_lora32_v3]
|
||||
extends = esp32_base
|
||||
board = esp32-s3-devkitc-1
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
${sensor_base.build_flags}
|
||||
-I variants/heltec_v3
|
||||
-D HELTEC_LORA_V3
|
||||
-D ESP32_CPU_FREQ=80
|
||||
-D P_LORA_DIO_1=14
|
||||
-D P_LORA_NSS=8
|
||||
-D P_LORA_RESET=RADIOLIB_NC
|
||||
-D P_LORA_BUSY=13
|
||||
-D P_LORA_SCLK=9
|
||||
-D P_LORA_MISO=11
|
||||
-D P_LORA_MOSI=10
|
||||
-D USE_SX1262
|
||||
-D RADIO_CLASS=CustomSX1262
|
||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
||||
-D LORA_TX_POWER=22
|
||||
; -D P_LORA_TX_LED=35
|
||||
-D PIN_BOARD_SDA=17
|
||||
-D PIN_BOARD_SCL=18
|
||||
-D PIN_USER_BTN=0
|
||||
-D PIN_VEXT_EN=36
|
||||
-D SX126X_DIO2_AS_RF_SWITCH=true
|
||||
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
|
||||
-D SX126X_CURRENT_LIMIT=140
|
||||
-D SX126X_RX_BOOSTED_GAIN=1
|
||||
-D PIN_GPS_RX=47
|
||||
-D PIN_GPS_TX=48
|
||||
-D PIN_GPS_EN=26
|
||||
build_src_filter = ${esp32_base.build_src_filter}
|
||||
+<../variants/heltec_v3>
|
||||
+<helpers/sensors>
|
||||
lib_deps =
|
||||
${esp32_base.lib_deps}
|
||||
${sensor_base.lib_deps}
|
||||
|
||||
[env:meck_wifi_repeater_heltec_v3]
|
||||
extends = Heltec_lora32_v3
|
||||
build_flags =
|
||||
${Heltec_lora32_v3.build_flags}
|
||||
-D DISPLAY_CLASS=SSD1306Display
|
||||
-D ADVERT_NAME='"WiFi Repeater"'
|
||||
-D ADVERT_LAT=0.0
|
||||
-D ADVERT_LON=0.0
|
||||
-D ADMIN_PASSWORD='"password"'
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D MECK_WIFI_REMOTE=1
|
||||
; -D MESH_PACKET_LOGGING=1
|
||||
; -D MESH_DEBUG=1
|
||||
build_src_filter = ${Heltec_lora32_v3.build_src_filter}
|
||||
+<helpers/ui/SSD1306Display.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/simple_repeater>
|
||||
lib_deps =
|
||||
${Heltec_lora32_v3.lib_deps}
|
||||
${esp32_ota.lib_deps}
|
||||
knolleary/PubSubClient @ ^2.8
|
||||
bakercp/CRC32 @ ^2.0.0
|
||||
@@ -0,0 +1,61 @@
|
||||
#include <Arduino.h>
|
||||
#include "target.h"
|
||||
|
||||
HeltecV3Board board;
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
static SPIClass spi;
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
#else
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
|
||||
#endif
|
||||
|
||||
WRAPPER_CLASS radio_driver(radio, board);
|
||||
|
||||
ESP32RTCClock fallback_clock;
|
||||
AutoDiscoverRTCClock rtc_clock(fallback_clock);
|
||||
|
||||
#if ENV_INCLUDE_GPS
|
||||
#include <helpers/sensors/MicroNMEALocationProvider.h>
|
||||
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
|
||||
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
|
||||
#else
|
||||
EnvironmentSensorManager sensors;
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
DISPLAY_CLASS display;
|
||||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
|
||||
#endif
|
||||
|
||||
bool radio_init() {
|
||||
fallback_clock.begin();
|
||||
rtc_clock.begin(Wire);
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
return radio.std_init(&spi);
|
||||
#else
|
||||
return radio.std_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t radio_get_rng_seed() {
|
||||
return radio.random(0x7FFFFFFF);
|
||||
}
|
||||
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
|
||||
radio.setFrequency(freq);
|
||||
radio.setSpreadingFactor(sf);
|
||||
radio.setBandwidth(bw);
|
||||
radio.setCodingRate(cr);
|
||||
}
|
||||
|
||||
void radio_set_tx_power(int8_t dbm) {
|
||||
radio.setOutputPower(dbm);
|
||||
}
|
||||
|
||||
mesh::LocalIdentity radio_new_identity() {
|
||||
RadioNoiseListener rng(radio);
|
||||
return mesh::LocalIdentity(&rng); // create new random identity
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#define RADIOLIB_STATIC_ONLY 1
|
||||
#include <RadioLib.h>
|
||||
#include <helpers/radiolib/RadioLibWrappers.h>
|
||||
#include <HeltecV3Board.h>
|
||||
#include <helpers/radiolib/CustomSX1262Wrapper.h>
|
||||
#include <helpers/AutoDiscoverRTCClock.h>
|
||||
#include <helpers/SensorManager.h>
|
||||
#include <helpers/sensors/EnvironmentSensorManager.h>
|
||||
#ifdef DISPLAY_CLASS
|
||||
#include <helpers/ui/SSD1306Display.h>
|
||||
#include <helpers/ui/MomentaryButton.h>
|
||||
#endif
|
||||
|
||||
extern HeltecV3Board board;
|
||||
extern WRAPPER_CLASS radio_driver;
|
||||
extern AutoDiscoverRTCClock rtc_clock;
|
||||
extern EnvironmentSensorManager sensors;
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
extern DISPLAY_CLASS display;
|
||||
extern MomentaryButton user_btn;
|
||||
#endif
|
||||
|
||||
bool radio_init();
|
||||
uint32_t radio_get_rng_seed();
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
|
||||
void radio_set_tx_power(int8_t dbm);
|
||||
mesh::LocalIdentity radio_new_identity();
|
||||
@@ -0,0 +1,103 @@
|
||||
#include "HeltecV4Board.h"
|
||||
|
||||
void HeltecV4Board::begin() {
|
||||
ESP32Board::begin();
|
||||
|
||||
|
||||
pinMode(PIN_ADC_CTRL, OUTPUT);
|
||||
digitalWrite(PIN_ADC_CTRL, LOW); // Initially inactive
|
||||
|
||||
// Set up digital GPIO registers before releasing RTC hold. The hold latches
|
||||
// the pad state including function select, so register writes accumulate
|
||||
// without affecting the pad. On hold release, all changes apply atomically
|
||||
// (IO MUX switches to digital GPIO with output already HIGH — no glitch).
|
||||
pinMode(P_LORA_PA_POWER, OUTPUT);
|
||||
digitalWrite(P_LORA_PA_POWER,HIGH);
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_POWER);
|
||||
|
||||
pinMode(P_LORA_PA_EN, OUTPUT);
|
||||
digitalWrite(P_LORA_PA_EN,HIGH);
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
|
||||
pinMode(P_LORA_PA_TX_EN, OUTPUT);
|
||||
digitalWrite(P_LORA_PA_TX_EN,LOW);
|
||||
|
||||
esp_reset_reason_t reason = esp_reset_reason();
|
||||
if (reason != ESP_RST_DEEPSLEEP) {
|
||||
delay(1); // GC1109 startup time after cold power-on
|
||||
}
|
||||
|
||||
periph_power.begin();
|
||||
if (reason == ESP_RST_DEEPSLEEP) {
|
||||
long wakeup_source = esp_sleep_get_ext1_wakeup_status();
|
||||
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
||||
startup_reason = BD_STARTUP_RX_PACKET;
|
||||
}
|
||||
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS);
|
||||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1);
|
||||
}
|
||||
}
|
||||
|
||||
void HeltecV4Board::onBeforeTransmit(void) {
|
||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
||||
digitalWrite(P_LORA_PA_TX_EN,HIGH);
|
||||
}
|
||||
|
||||
void HeltecV4Board::onAfterTransmit(void) {
|
||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
||||
digitalWrite(P_LORA_PA_TX_EN,LOW);
|
||||
}
|
||||
|
||||
void HeltecV4Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
||||
|
||||
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
||||
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
|
||||
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||
|
||||
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
|
||||
|
||||
// Hold GC1109 FEM pins during sleep to keep LNA active for RX wake
|
||||
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
|
||||
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN);
|
||||
|
||||
if (pin_wake_btn < 0) {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
||||
} else {
|
||||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
||||
}
|
||||
|
||||
if (secs > 0) {
|
||||
esp_sleep_enable_timer_wakeup(secs * 1000000);
|
||||
}
|
||||
|
||||
// Finally set ESP32 into sleep
|
||||
esp_deep_sleep_start(); // CPU halts here and never returns!
|
||||
}
|
||||
|
||||
void HeltecV4Board::powerOff() {
|
||||
enterDeepSleep(0);
|
||||
}
|
||||
|
||||
uint16_t HeltecV4Board::getBattMilliVolts() {
|
||||
analogReadResolution(10);
|
||||
digitalWrite(PIN_ADC_CTRL, HIGH);
|
||||
delay(10);
|
||||
uint32_t raw = 0;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
raw += analogRead(PIN_VBAT_READ);
|
||||
}
|
||||
raw = raw / 8;
|
||||
|
||||
digitalWrite(PIN_ADC_CTRL, LOW);
|
||||
|
||||
return (5.42 * (3.3 / 1024.0) * raw) * 1000;
|
||||
}
|
||||
|
||||
const char* HeltecV4Board::getManufacturerName() const {
|
||||
#ifdef HELTEC_LORA_V4_TFT
|
||||
return "Heltec V4 TFT";
|
||||
#else
|
||||
return "Heltec V4 OLED";
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <helpers/RefCountedDigitalPin.h>
|
||||
#include <helpers/ESP32Board.h>
|
||||
#include <driver/rtc_io.h>
|
||||
|
||||
class HeltecV4Board : public ESP32Board {
|
||||
|
||||
public:
|
||||
RefCountedDigitalPin periph_power;
|
||||
|
||||
HeltecV4Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { }
|
||||
|
||||
void begin();
|
||||
void onBeforeTransmit(void) override;
|
||||
void onAfterTransmit(void) override;
|
||||
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
|
||||
void powerOff() override;
|
||||
uint16_t getBattMilliVolts() override;
|
||||
const char* getManufacturerName() const override ;
|
||||
|
||||
};
|
||||
@@ -0,0 +1,61 @@
|
||||
# Heltec V4 WiFi Remote Repeater — Setup Guide
|
||||
|
||||
## Variant Files
|
||||
|
||||
Copy the following into `variants/heltec_v4/`:
|
||||
- `HeltecV4Board.h`, `HeltecV4Board.cpp`
|
||||
- `target.h`, `target.cpp`
|
||||
- `pins_arduino.h`
|
||||
|
||||
Copy `heltec_v4.json` into `boards/`
|
||||
|
||||
## Config Files (SPIFFS)
|
||||
|
||||
The Heltec V4 has no SD card slot — config lives in SPIFFS.
|
||||
|
||||
Create a `data/remote/` folder in your project root:
|
||||
|
||||
```
|
||||
data/
|
||||
remote/
|
||||
wifi.cfg
|
||||
mqtt.cfg
|
||||
```
|
||||
|
||||
### data/remote/wifi.cfg
|
||||
```
|
||||
YourSSID
|
||||
YourPassword
|
||||
BackupSSID
|
||||
BackupPassword
|
||||
```
|
||||
|
||||
### data/remote/mqtt.cfg
|
||||
```
|
||||
6818ce5f77dd45bb90facf753ba81d81.s1.eu.hivemq.cloud
|
||||
8883
|
||||
meckremote
|
||||
yourpassword
|
||||
heltec-wifi-1
|
||||
```
|
||||
|
||||
### Upload config to SPIFFS
|
||||
```bash
|
||||
pio run -e meck_wifi_repeater_heltec_v4 -t uploadfs
|
||||
```
|
||||
|
||||
This uploads the `data/` folder contents to SPIFFS on the device.
|
||||
|
||||
### Flash firmware
|
||||
```bash
|
||||
pio run -e meck_wifi_repeater_heltec_v4 -t upload
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The OLED display shows basic repeater status (same as stock repeater)
|
||||
- WiFi MQTT and Mycelium dashboard work identically to T-Deck Pro builds
|
||||
- OTA firmware updates work over WiFi via the Mycelium dashboard
|
||||
- Config changes require re-uploading SPIFFS (`-t uploadfs`)
|
||||
- The same `main.cpp`, `WiFiMQTT.h/cpp`, and `MyMesh.cpp` are shared
|
||||
with T-Deck Pro and T5S3 builds — no Heltec-specific source changes
|
||||
@@ -0,0 +1,67 @@
|
||||
#ifndef Pins_Arduino_h
|
||||
#define Pins_Arduino_h
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static const uint8_t LED_BUILTIN = 35;
|
||||
#define BUILTIN_LED LED_BUILTIN // backward compatibility
|
||||
#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN
|
||||
|
||||
static const uint8_t TX = 43;
|
||||
static const uint8_t RX = 44;
|
||||
|
||||
static const uint8_t SDA = 3;
|
||||
static const uint8_t SCL = 4;
|
||||
|
||||
static const uint8_t SS = 8;
|
||||
static const uint8_t MOSI = 10;
|
||||
static const uint8_t MISO = 11;
|
||||
static const uint8_t SCK = 9;
|
||||
|
||||
static const uint8_t A0 = 1;
|
||||
static const uint8_t A1 = 2;
|
||||
static const uint8_t A2 = 3;
|
||||
static const uint8_t A3 = 4;
|
||||
static const uint8_t A4 = 5;
|
||||
static const uint8_t A5 = 6;
|
||||
static const uint8_t A6 = 7;
|
||||
static const uint8_t A7 = 8;
|
||||
static const uint8_t A8 = 9;
|
||||
static const uint8_t A9 = 10;
|
||||
static const uint8_t A10 = 11;
|
||||
static const uint8_t A11 = 12;
|
||||
static const uint8_t A12 = 13;
|
||||
static const uint8_t A13 = 14;
|
||||
static const uint8_t A14 = 15;
|
||||
static const uint8_t A15 = 16;
|
||||
static const uint8_t A16 = 17;
|
||||
static const uint8_t A17 = 18;
|
||||
static const uint8_t A18 = 19;
|
||||
static const uint8_t A19 = 20;
|
||||
|
||||
static const uint8_t T1 = 1;
|
||||
static const uint8_t T2 = 2;
|
||||
static const uint8_t T3 = 3;
|
||||
static const uint8_t T4 = 4;
|
||||
static const uint8_t T5 = 5;
|
||||
static const uint8_t T6 = 6;
|
||||
static const uint8_t T7 = 7;
|
||||
static const uint8_t T8 = 8;
|
||||
static const uint8_t T9 = 9;
|
||||
static const uint8_t T10 = 10;
|
||||
static const uint8_t T11 = 11;
|
||||
static const uint8_t T12 = 12;
|
||||
static const uint8_t T13 = 13;
|
||||
static const uint8_t T14 = 14;
|
||||
|
||||
static const uint8_t Vext = 36;
|
||||
static const uint8_t LED = 35;
|
||||
static const uint8_t RST_OLED = 21;
|
||||
static const uint8_t SCL_OLED = 18;
|
||||
static const uint8_t SDA_OLED = 17;
|
||||
|
||||
static const uint8_t RST_LoRa = 12;
|
||||
static const uint8_t BUSY_LoRa = 13;
|
||||
static const uint8_t DIO0 = 14;
|
||||
|
||||
#endif /* Pins_Arduino_h */
|
||||
@@ -0,0 +1,208 @@
|
||||
[Heltec_lora32_v4]
|
||||
extends = esp32_base
|
||||
board = heltec_v4
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
${sensor_base.build_flags}
|
||||
-I variants/heltec_v4
|
||||
-D HELTEC_LORA_V4
|
||||
-D USE_SX1262
|
||||
-D ESP32_CPU_FREQ=80
|
||||
-D RADIO_CLASS=CustomSX1262
|
||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
||||
-D P_LORA_TX_LED=35
|
||||
-D P_LORA_DIO_1=14
|
||||
-D P_LORA_NSS=8
|
||||
-D P_LORA_RESET=12
|
||||
-D P_LORA_BUSY=13
|
||||
-D P_LORA_SCLK=9
|
||||
-D P_LORA_MISO=11
|
||||
-D P_LORA_MOSI=10
|
||||
-D P_LORA_PA_POWER=7 ; VFEM_Ctrl - Power on GC1109
|
||||
-D P_LORA_PA_EN=2 ; PA CSD - Enable GC1109
|
||||
-D P_LORA_PA_TX_EN=46 ; PA CPS - GC1109 TX PA full(High) / bypass(Low)
|
||||
-D PIN_USER_BTN=0
|
||||
-D PIN_VEXT_EN=36
|
||||
-D PIN_VEXT_EN_ACTIVE=HIGH
|
||||
-D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm.
|
||||
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output
|
||||
-D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX
|
||||
-D SX126X_DIO2_AS_RF_SWITCH=true ; GC1109 CTX is controlled by SX1262 DIO2
|
||||
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
|
||||
-D SX126X_CURRENT_LIMIT=140
|
||||
-D SX126X_RX_BOOSTED_GAIN=1 ; In some cases, commenting this out will improve RX
|
||||
-D PIN_GPS_RX=38
|
||||
-D PIN_GPS_TX=39
|
||||
-D PIN_GPS_RESET=42
|
||||
-D PIN_GPS_RESET_ACTIVE=LOW
|
||||
-D PIN_GPS_EN=34
|
||||
-D PIN_GPS_EN_ACTIVE=LOW
|
||||
-D ENV_INCLUDE_GPS=1
|
||||
-D PIN_ADC_CTRL=37
|
||||
-D PIN_VBAT_READ=1
|
||||
build_src_filter = ${esp32_base.build_src_filter}
|
||||
+<../variants/heltec_v4>
|
||||
+<helpers/sensors>
|
||||
lib_deps =
|
||||
${esp32_base.lib_deps}
|
||||
${sensor_base.lib_deps}
|
||||
|
||||
[heltec_v4_oled]
|
||||
extends = Heltec_lora32_v4
|
||||
build_flags =
|
||||
${Heltec_lora32_v4.build_flags}
|
||||
-D HELTEC_LORA_V4_OLED
|
||||
-D PIN_BOARD_SDA=17
|
||||
-D PIN_BOARD_SCL=18
|
||||
-D PIN_OLED_RESET=21
|
||||
build_src_filter= ${Heltec_lora32_v4.build_src_filter}
|
||||
lib_deps = ${Heltec_lora32_v4.lib_deps}
|
||||
|
||||
[heltec_v4_tft]
|
||||
extends = Heltec_lora32_v4
|
||||
build_flags =
|
||||
${Heltec_lora32_v4.build_flags}
|
||||
-D HELTEC_LORA_V4_TFT
|
||||
-D PIN_BOARD_SDA=4
|
||||
-D PIN_BOARD_SCL=3
|
||||
-D DISPLAY_SCALE_X=2.5
|
||||
-D DISPLAY_SCALE_Y=3.75
|
||||
-D PIN_TFT_RST=18
|
||||
-D PIN_TFT_VDD_CTL=-1
|
||||
-D PIN_TFT_LEDA_CTL=21
|
||||
-D PIN_TFT_LEDA_CTL_ACTIVE=HIGH
|
||||
-D PIN_TFT_CS=15
|
||||
-D PIN_TFT_DC=16
|
||||
-D PIN_TFT_SCL=17
|
||||
-D PIN_TFT_SDA=33
|
||||
build_src_filter= ${Heltec_lora32_v4.build_src_filter}
|
||||
lib_deps =
|
||||
${Heltec_lora32_v4.lib_deps}
|
||||
adafruit/Adafruit ST7735 and ST7789 Library @ ^1.11.0
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Heltec V4 WiFi Remote Repeater — WiFi MQTT backhaul, remote management
|
||||
; No SD card — config files stored in SPIFFS.
|
||||
; Upload config: create data/remote/ folder with wifi.cfg and mqtt.cfg,
|
||||
; then run: pio run -e meck_wifi_repeater_heltec_v4 -t uploadfs
|
||||
; OLED display shows status (optional — works headless too)
|
||||
; Flash: pio run -e meck_wifi_repeater_heltec_v4 -t upload
|
||||
; ---------------------------------------------------------------------------
|
||||
[env:meck_wifi_repeater_heltec_v4]
|
||||
extends = heltec_v4_oled
|
||||
upload_port = /dev/cu.usbmodem101
|
||||
build_src_filter = ${heltec_v4_oled.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/SSD1306Display.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
build_flags =
|
||||
${heltec_v4_oled.build_flags}
|
||||
-D FIRMWARE_VERSION='"Meck HV4 WiFi Rptr v0.1"'
|
||||
-D FIRMWARE_BUILD_DATE='"5 Apr 2026"'
|
||||
-D DISPLAY_CLASS=SSD1306Display
|
||||
-D ADVERT_NAME='"Heltec Repeater"'
|
||||
-D ADMIN_PASSWORD='"password"'
|
||||
-D MECK_WIFI_REMOTE
|
||||
-D MECK_REMOTE_REPEATER=1
|
||||
-D DISABLE_WIFI_OTA=1
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D RADIOLIB_EXCLUDE_CC1101=1
|
||||
-D RADIOLIB_EXCLUDE_NRF24=1
|
||||
-D RADIOLIB_EXCLUDE_RF69=1
|
||||
-D RADIOLIB_EXCLUDE_SX1231=1
|
||||
-D RADIOLIB_EXCLUDE_SX1233=1
|
||||
-D RADIOLIB_EXCLUDE_SI443X=1
|
||||
-D RADIOLIB_EXCLUDE_RFM2X=1
|
||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||
-D RADIOLIB_EXCLUDE_SX1272=1
|
||||
-D RADIOLIB_EXCLUDE_SX1278=1
|
||||
-D RADIOLIB_EXCLUDE_STM32WLX=1
|
||||
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||
-D RADIOLIB_EXCLUDE_LLCC68=1
|
||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||
-D RADIOLIB_EXCLUDE_AFSK=1
|
||||
-D RADIOLIB_EXCLUDE_AX25=1
|
||||
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
|
||||
-D RADIOLIB_EXCLUDE_MORSE=1
|
||||
-D RADIOLIB_EXCLUDE_RTTY=1
|
||||
-D RADIOLIB_EXCLUDE_SSTV=1
|
||||
-D RADIOLIB_EXCLUDE_APRS=1
|
||||
-D RADIOLIB_EXCLUDE_LORAWAN=1
|
||||
-D RADIOLIB_EXCLUDE_PAGER=1
|
||||
-D RADIOLIB_EXCLUDE_FSK4=1
|
||||
-D RADIOLIB_EXCLUDE_BELL=1
|
||||
lib_deps =
|
||||
${heltec_v4_oled.lib_deps}
|
||||
knolleary/PubSubClient@^2.8
|
||||
lib_ignore =
|
||||
ESP32 BLE Arduino
|
||||
AsyncTCP
|
||||
RPAsyncTCP
|
||||
ESPAsyncWebServer
|
||||
AsyncElegantOTA
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
board_build.partitions = default_16MB.csv
|
||||
board_build.filesystem = spiffs
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Heltec V4 WiFi Remote Repeater — HEADLESS (no display)
|
||||
; ---------------------------------------------------------------------------
|
||||
[env:meck_wifi_repeater_heltec_v4_headless]
|
||||
extends = Heltec_lora32_v4
|
||||
upload_port = /dev/cu.usbmodem101
|
||||
build_src_filter = ${Heltec_lora32_v4.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
build_flags =
|
||||
${Heltec_lora32_v4.build_flags}
|
||||
-D ESP32_CPU_FREQ=240
|
||||
-D FIRMWARE_VERSION='"Meck HV4 WiFi Rptr v0.1"'
|
||||
-D FIRMWARE_BUILD_DATE='"5 Apr 2026"'
|
||||
-D ADVERT_NAME='"Heltec Repeater"'
|
||||
-D ADMIN_PASSWORD='"password"'
|
||||
-D MECK_WIFI_REMOTE
|
||||
-D MECK_REMOTE_REPEATER=1
|
||||
-D DISABLE_WIFI_OTA=1
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D RADIOLIB_EXCLUDE_CC1101=1
|
||||
-D RADIOLIB_EXCLUDE_NRF24=1
|
||||
-D RADIOLIB_EXCLUDE_RF69=1
|
||||
-D RADIOLIB_EXCLUDE_SX1231=1
|
||||
-D RADIOLIB_EXCLUDE_SX1233=1
|
||||
-D RADIOLIB_EXCLUDE_SI443X=1
|
||||
-D RADIOLIB_EXCLUDE_RFM2X=1
|
||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||
-D RADIOLIB_EXCLUDE_SX1272=1
|
||||
-D RADIOLIB_EXCLUDE_SX1278=1
|
||||
-D RADIOLIB_EXCLUDE_STM32WLX=1
|
||||
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||
-D RADIOLIB_EXCLUDE_LLCC68=1
|
||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||
-D RADIOLIB_EXCLUDE_AFSK=1
|
||||
-D RADIOLIB_EXCLUDE_AX25=1
|
||||
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
|
||||
-D RADIOLIB_EXCLUDE_MORSE=1
|
||||
-D RADIOLIB_EXCLUDE_RTTY=1
|
||||
-D RADIOLIB_EXCLUDE_SSTV=1
|
||||
-D RADIOLIB_EXCLUDE_APRS=1
|
||||
-D RADIOLIB_EXCLUDE_LORAWAN=1
|
||||
-D RADIOLIB_EXCLUDE_PAGER=1
|
||||
-D RADIOLIB_EXCLUDE_FSK4=1
|
||||
-D RADIOLIB_EXCLUDE_BELL=1
|
||||
lib_deps =
|
||||
${Heltec_lora32_v4.lib_deps}
|
||||
knolleary/PubSubClient@^2.8
|
||||
lib_ignore =
|
||||
ESP32 BLE Arduino
|
||||
AsyncTCP
|
||||
RPAsyncTCP
|
||||
ESPAsyncWebServer
|
||||
AsyncElegantOTA
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
board_build.partitions = default_16MB.csv
|
||||
board_build.filesystem = spiffs
|
||||
@@ -0,0 +1,61 @@
|
||||
#include <Arduino.h>
|
||||
#include "target.h"
|
||||
|
||||
HeltecV4Board board;
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
static SPIClass spi;
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
#else
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
|
||||
#endif
|
||||
|
||||
WRAPPER_CLASS radio_driver(radio, board);
|
||||
|
||||
ESP32RTCClock fallback_clock;
|
||||
AutoDiscoverRTCClock rtc_clock(fallback_clock);
|
||||
|
||||
#if ENV_INCLUDE_GPS
|
||||
#include <helpers/sensors/MicroNMEALocationProvider.h>
|
||||
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
|
||||
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
|
||||
#else
|
||||
EnvironmentSensorManager sensors;
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
DISPLAY_CLASS display(NULL);
|
||||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
|
||||
#endif
|
||||
|
||||
bool radio_init() {
|
||||
fallback_clock.begin();
|
||||
rtc_clock.begin(Wire);
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
return radio.std_init(&spi);
|
||||
#else
|
||||
return radio.std_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t radio_get_rng_seed() {
|
||||
return radio.random(0x7FFFFFFF);
|
||||
}
|
||||
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
|
||||
radio.setFrequency(freq);
|
||||
radio.setSpreadingFactor(sf);
|
||||
radio.setBandwidth(bw);
|
||||
radio.setCodingRate(cr);
|
||||
}
|
||||
|
||||
void radio_set_tx_power(int8_t dbm) {
|
||||
radio.setOutputPower(dbm);
|
||||
}
|
||||
|
||||
mesh::LocalIdentity radio_new_identity() {
|
||||
RadioNoiseListener rng(radio);
|
||||
return mesh::LocalIdentity(&rng); // create new random identity
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#define RADIOLIB_STATIC_ONLY 1
|
||||
#include <RadioLib.h>
|
||||
#include <helpers/radiolib/RadioLibWrappers.h>
|
||||
#include <HeltecV4Board.h>
|
||||
#include <helpers/radiolib/CustomSX1262Wrapper.h>
|
||||
#include <helpers/AutoDiscoverRTCClock.h>
|
||||
#include <helpers/SensorManager.h>
|
||||
#include <helpers/sensors/EnvironmentSensorManager.h>
|
||||
#ifdef DISPLAY_CLASS
|
||||
#ifdef HELTEC_LORA_V4_OLED
|
||||
#include <helpers/ui/SSD1306Display.h>
|
||||
#elif defined(HELTEC_LORA_V4_TFT)
|
||||
#include <helpers/ui/ST7789LCDDisplay.h>
|
||||
#endif
|
||||
#include <helpers/ui/MomentaryButton.h>
|
||||
#endif
|
||||
|
||||
extern HeltecV4Board board;
|
||||
extern WRAPPER_CLASS radio_driver;
|
||||
extern AutoDiscoverRTCClock rtc_clock;
|
||||
extern EnvironmentSensorManager sensors;
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
extern DISPLAY_CLASS display;
|
||||
extern MomentaryButton user_btn;
|
||||
#endif
|
||||
|
||||
bool radio_init();
|
||||
uint32_t radio_get_rng_seed();
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
|
||||
void radio_set_tx_power(int8_t dbm);
|
||||
mesh::LocalIdentity radio_new_identity();
|
||||
|
||||
@@ -77,7 +77,7 @@ extends = LilyGo_T5S3_EPaper_Pro
|
||||
build_flags =
|
||||
${LilyGo_T5S3_EPaper_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D OFFLINE_QUEUE_SIZE=1
|
||||
-D CHANNEL_MSG_HISTORY_SIZE=800
|
||||
@@ -111,7 +111,7 @@ extends = LilyGo_T5S3_EPaper_Pro
|
||||
build_flags =
|
||||
${LilyGo_T5S3_EPaper_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=510
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D BLE_PIN_CODE=123456
|
||||
-D OFFLINE_QUEUE_SIZE=256
|
||||
@@ -144,7 +144,7 @@ extends = LilyGo_T5S3_EPaper_Pro
|
||||
build_flags =
|
||||
${LilyGo_T5S3_EPaper_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D MECK_WIFI_COMPANION=1
|
||||
-D MECK_WEB_READER=1
|
||||
@@ -166,4 +166,69 @@ lib_deps =
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
adafruit/Adafruit GFX Library@^1.11.0
|
||||
https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip
|
||||
https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip
|
||||
https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; T5S3 WiFi Remote Repeater — WiFi MQTT backhaul, remote management
|
||||
; Same MQTT protocol as T-Deck Pro remote repeater builds.
|
||||
; Uses FastEPD for parallel e-ink display.
|
||||
; Flash: pio run -e meck_wifi_repeater_t5s3 -t upload
|
||||
; ---------------------------------------------------------------------------
|
||||
[env:meck_wifi_repeater_t5s3]
|
||||
extends = LilyGo_T5S3_EPaper_Pro
|
||||
build_src_filter = ${LilyGo_T5S3_EPaper_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<helpers/ui/FastEPDDisplay.cpp>
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
build_flags =
|
||||
${LilyGo_T5S3_EPaper_Pro.build_flags}
|
||||
-D FIRMWARE_VERSION='"Meck T5S3 WiFi Rptr v0.1"'
|
||||
-D FIRMWARE_BUILD_DATE='"5 Apr 2026"'
|
||||
-D DISPLAY_CLASS=FastEPDDisplay
|
||||
-D USE_EINK
|
||||
-D MECK_WIFI_REMOTE
|
||||
-D MECK_REMOTE_REPEATER=1
|
||||
-D DISABLE_WIFI_OTA=1
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D HAS_SDCARD=1
|
||||
-D RADIOLIB_EXCLUDE_CC1101=1
|
||||
-D RADIOLIB_EXCLUDE_NRF24=1
|
||||
-D RADIOLIB_EXCLUDE_RF69=1
|
||||
-D RADIOLIB_EXCLUDE_SX1231=1
|
||||
-D RADIOLIB_EXCLUDE_SX1233=1
|
||||
-D RADIOLIB_EXCLUDE_SI443X=1
|
||||
-D RADIOLIB_EXCLUDE_RFM2X=1
|
||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||
-D RADIOLIB_EXCLUDE_SX1272=1
|
||||
-D RADIOLIB_EXCLUDE_SX1278=1
|
||||
-D RADIOLIB_EXCLUDE_STM32WLX=1
|
||||
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||
-D RADIOLIB_EXCLUDE_LLCC68=1
|
||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||
-D RADIOLIB_EXCLUDE_AFSK=1
|
||||
-D RADIOLIB_EXCLUDE_AX25=1
|
||||
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
|
||||
-D RADIOLIB_EXCLUDE_MORSE=1
|
||||
-D RADIOLIB_EXCLUDE_RTTY=1
|
||||
-D RADIOLIB_EXCLUDE_SSTV=1
|
||||
-D RADIOLIB_EXCLUDE_APRS=1
|
||||
-D RADIOLIB_EXCLUDE_LORAWAN=1
|
||||
-D RADIOLIB_EXCLUDE_PAGER=1
|
||||
-D RADIOLIB_EXCLUDE_FSK4=1
|
||||
-D RADIOLIB_EXCLUDE_BELL=1
|
||||
lib_deps =
|
||||
${LilyGo_T5S3_EPaper_Pro.lib_deps}
|
||||
knolleary/PubSubClient@^2.8
|
||||
adafruit/Adafruit GFX Library@^1.11.0
|
||||
https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip
|
||||
https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip
|
||||
lib_ignore =
|
||||
ESP32 BLE Arduino
|
||||
AsyncTCP
|
||||
RPAsyncTCP
|
||||
ESPAsyncWebServer
|
||||
AsyncElegantOTA
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
@@ -199,11 +199,16 @@ bool TDeckBoard::configureFuelGauge(uint16_t designCapacity_mAh) {
|
||||
// Design Capacity correct, but check if Full Charge Capacity is sane.
|
||||
uint16_t fcc = bq27220_read16(BQ27220_REG_FULL_CAP);
|
||||
Serial.printf("BQ27220: Design Capacity already correct, FCC=%d mAh\n", fcc);
|
||||
if (fcc >= designCapacity_mAh * 3 / 2) {
|
||||
// Check if FCC is outside an acceptable band around design capacity.
|
||||
// Catches both: FCC too high (stale factory 3000mAh) and FCC too low
|
||||
// (gauge learned on a smaller battery, e.g. 1400mAh on a 2500mAh pack).
|
||||
uint16_t fccLo = (designCapacity_mAh > 100) ? designCapacity_mAh - 100 : 0;
|
||||
uint16_t fccHi = designCapacity_mAh + 100;
|
||||
if (fcc < fccLo || fcc > fccHi) {
|
||||
// FCC is >=150% of design — stale from factory defaults (typically 3000 mAh).
|
||||
uint16_t designEnergy = (uint16_t)((uint32_t)designCapacity_mAh * 37 / 10);
|
||||
Serial.printf("BQ27220: FCC %d >> DC %d, checking Design Energy (target %d mWh)\n",
|
||||
fcc, designCapacity_mAh, designEnergy);
|
||||
Serial.printf("BQ27220: FCC %d outside target band [%d..%d], checking Design Energy (target %d mWh)\n",
|
||||
fcc, fccLo, fccHi, designEnergy);
|
||||
|
||||
// Unseal to read data memory and issue RESET
|
||||
bq27220_writeControl(0x0414); delay(2);
|
||||
@@ -344,7 +349,7 @@ bool TDeckBoard::configureFuelGauge(uint16_t designCapacity_mAh) {
|
||||
fcc = bq27220_read16(BQ27220_REG_FULL_CAP);
|
||||
Serial.printf("BQ27220: FCC after RESET: %d mAh (target <= %d)\n", fcc, designCapacity_mAh);
|
||||
|
||||
if (fcc > designCapacity_mAh * 3 / 2) {
|
||||
if (fcc > designCapacity_mAh) {
|
||||
// RESET didn't fix FCC — the gauge IT algorithm is stubbornly
|
||||
// retaining its learned value. This typically resolves after one
|
||||
// full charge/discharge cycle. Software clamp in
|
||||
|
||||
@@ -105,13 +105,15 @@ lib_deps =
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
; Audio + BLE companion (audio-player hardware with BLE phone bridging)
|
||||
; MAX_CONTACTS=500 is near BLE protocol ceiling (MAX_CONTACTS/2 sent as uint8_t, max 510)
|
||||
; MAX_CONTACTS=2000 — protocol v11+ sends true capacity in extended DEVICE_INFO field.
|
||||
; Older apps see 510 (sentinel 0xFF in legacy byte) and still work correctly.
|
||||
; Contact + sort arrays allocated in PSRAM via BaseChatMesh::initContacts().
|
||||
[env:meck_audio_ble]
|
||||
extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=510
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D BLE_PIN_CODE=123456
|
||||
-D OFFLINE_QUEUE_SIZE=256
|
||||
@@ -130,6 +132,9 @@ lib_deps =
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git#2.0.6
|
||||
bitbank2/JPEGDEC
|
||||
https://github.com/sh123/esp32_codec2_arduino.git
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
|
||||
; Audio + WiFi companion (audio-player hardware with WiFi app bridging)
|
||||
; No BLE — WiFi companion uses SerialWifiInterface (TCP socket on port 5000).
|
||||
@@ -143,7 +148,7 @@ extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D MECK_WIFI_COMPANION=1
|
||||
-D TCP_PORT=5000
|
||||
@@ -152,9 +157,10 @@ build_flags =
|
||||
-D MECK_AUDIO_VARIANT
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.6.WiFi"'
|
||||
-D FIRMWARE_VERSION='"Meck v1.7.WiFi"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
@@ -165,6 +171,10 @@ lib_deps =
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git#2.0.6
|
||||
bitbank2/JPEGDEC
|
||||
https://github.com/sh123/esp32_codec2_arduino.git
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
ESP32 BLE Arduino
|
||||
|
||||
; Audio standalone (audio-player hardware, no BLE/WiFi — maximum battery life)
|
||||
; No MECK_WEB_READER: WiFi power draw conflicts with zero-radio-power design.
|
||||
@@ -175,13 +185,14 @@ extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D OFFLINE_QUEUE_SIZE=1
|
||||
-D MECK_AUDIO_VARIANT
|
||||
-D MECK_OTA_UPDATE=1
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
@@ -192,22 +203,28 @@ lib_deps =
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git#2.0.6
|
||||
bitbank2/JPEGDEC
|
||||
https://github.com/sh123/esp32_codec2_arduino.git
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
ESP32 BLE Arduino
|
||||
|
||||
; 4G + BLE companion (4G modem hardware, no audio — GPIO conflict with PCM5102A)
|
||||
; MAX_CONTACTS=500 is near BLE protocol ceiling (MAX_CONTACTS/2 sent as uint8_t, max 510)
|
||||
; MAX_CONTACTS=2000 — protocol v11+ sends true capacity in extended DEVICE_INFO field.
|
||||
; Older apps see 510 (sentinel 0xFF in legacy byte) and still work correctly.
|
||||
; Contact + sort arrays allocated in PSRAM via BaseChatMesh::initContacts().
|
||||
[env:meck_4g_ble]
|
||||
extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=510
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D BLE_PIN_CODE=123456
|
||||
-D OFFLINE_QUEUE_SIZE=256
|
||||
-D HAS_4G_MODEM=1
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.6.4G"'
|
||||
-D FIRMWARE_VERSION='"Meck v1.7.4G"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
@@ -217,6 +234,11 @@ build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduinov
|
||||
|
||||
; 4G + WiFi companion (4G modem hardware with WiFi app bridging, no audio)
|
||||
; No BLE — WiFi companion uses SerialWifiInterface (TCP socket on port 5000).
|
||||
@@ -229,7 +251,7 @@ extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D MECK_WIFI_COMPANION=1
|
||||
-D TCP_PORT=5000
|
||||
@@ -238,9 +260,10 @@ build_flags =
|
||||
-D HAS_4G_MODEM=1
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.6.4G.WiFi"'
|
||||
-D FIRMWARE_VERSION='"Meck v1.7.4G.WiFi"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
@@ -248,6 +271,12 @@ build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
ESP32 BLE Arduino
|
||||
|
||||
; 4G standalone (4G modem hardware, no BLE — maximum battery + cellular features)
|
||||
; No BLE_PIN_CODE: BLE never initializes, saving ~30KB heap + radio power.
|
||||
@@ -259,15 +288,16 @@ extends = LilyGo_TDeck_Pro
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_CONTACTS=2000
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D OFFLINE_QUEUE_SIZE=1
|
||||
-D HAS_4G_MODEM=1
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.6.4G.SA"'
|
||||
-D FIRMWARE_VERSION='"Meck v1.7.4G.SA"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
@@ -275,6 +305,12 @@ build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
lib_ignore =
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
ESP32 BLE Arduino
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Remote Repeater (T-Deck Pro 4G, cellular MQTT remote management)
|
||||
@@ -298,13 +334,100 @@ build_flags =
|
||||
-D HAS_4G_MODEM=1
|
||||
-D DISABLE_WIFI_OTA=1
|
||||
-D MECK_REMOTE_REPEATER=1
|
||||
-D MAX_NEIGHBOURS=16
|
||||
-D FIRMWARE_VERSION='"Meck RemRptr v0.1"'
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D FIRMWARE_VERSION='"Meck RemRptr v0.3"'
|
||||
-D FIRMWARE_BUILD_DATE='"5 April 2026"'
|
||||
-D RADIOLIB_EXCLUDE_CC1101=1
|
||||
-D RADIOLIB_EXCLUDE_NRF24=1
|
||||
-D RADIOLIB_EXCLUDE_RF69=1
|
||||
-D RADIOLIB_EXCLUDE_SX1231=1
|
||||
-D RADIOLIB_EXCLUDE_SX1233=1
|
||||
-D RADIOLIB_EXCLUDE_SI443X=1
|
||||
-D RADIOLIB_EXCLUDE_RFM2X=1
|
||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||
-D RADIOLIB_EXCLUDE_SX1272=1
|
||||
-D RADIOLIB_EXCLUDE_SX1278=1
|
||||
-D RADIOLIB_EXCLUDE_STM32WLX=1
|
||||
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||
-D RADIOLIB_EXCLUDE_LLCC68=1
|
||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||
-D RADIOLIB_EXCLUDE_AFSK=1
|
||||
-D RADIOLIB_EXCLUDE_AX25=1
|
||||
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
|
||||
-D RADIOLIB_EXCLUDE_MORSE=1
|
||||
-D RADIOLIB_EXCLUDE_RTTY=1
|
||||
-D RADIOLIB_EXCLUDE_SSTV=1
|
||||
-D RADIOLIB_EXCLUDE_APRS=1
|
||||
-D RADIOLIB_EXCLUDE_LORAWAN=1
|
||||
-D RADIOLIB_EXCLUDE_PAGER=1
|
||||
-D RADIOLIB_EXCLUDE_FSK4=1
|
||||
-D RADIOLIB_EXCLUDE_BELL=1
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<helpers/ui/GxEPDDisplay.cpp>
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro.lib_deps}
|
||||
|
||||
lib_ignore =
|
||||
ESP32 BLE Arduino
|
||||
NimBLE-Arduino
|
||||
AsyncTCP
|
||||
ESPAsyncWebServer
|
||||
AsyncElegantOTA
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
|
||||
[env:meck_wifi_repeater]
|
||||
extends = LilyGo_TDeck_Pro
|
||||
build_src_filter = ${LilyGo_TDeck_Pro.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
-<helpers/esp32/SerialBLEInterface.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<helpers/ui/GxEPDDisplay.cpp>
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro.build_flags}
|
||||
-D FIRMWARE_VERSION='"Meck WiFi Rptr v0.3"'
|
||||
-D FIRMWARE_BUILD_DATE='"5 April 2026"'
|
||||
-D MAX_NEIGHBOURS=50
|
||||
-D MECK_WIFI_REMOTE
|
||||
-D MECK_REMOTE_REPEATER=1
|
||||
-D DISABLE_WIFI_OTA=1
|
||||
-D RADIOLIB_EXCLUDE_CC1101=1
|
||||
-D RADIOLIB_EXCLUDE_NRF24=1
|
||||
-D RADIOLIB_EXCLUDE_RF69=1
|
||||
-D RADIOLIB_EXCLUDE_SX1231=1
|
||||
-D RADIOLIB_EXCLUDE_SX1233=1
|
||||
-D RADIOLIB_EXCLUDE_SI443X=1
|
||||
-D RADIOLIB_EXCLUDE_RFM2X=1
|
||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||
-D RADIOLIB_EXCLUDE_SX1272=1
|
||||
-D RADIOLIB_EXCLUDE_SX1278=1
|
||||
-D RADIOLIB_EXCLUDE_STM32WLX=1
|
||||
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||
-D RADIOLIB_EXCLUDE_LLCC68=1
|
||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||
-D RADIOLIB_EXCLUDE_AFSK=1
|
||||
-D RADIOLIB_EXCLUDE_AX25=1
|
||||
-D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
|
||||
-D RADIOLIB_EXCLUDE_MORSE=1
|
||||
-D RADIOLIB_EXCLUDE_RTTY=1
|
||||
-D RADIOLIB_EXCLUDE_SSTV=1
|
||||
-D RADIOLIB_EXCLUDE_APRS=1
|
||||
-D RADIOLIB_EXCLUDE_LORAWAN=1
|
||||
-D RADIOLIB_EXCLUDE_PAGER=1
|
||||
-D RADIOLIB_EXCLUDE_FSK4=1
|
||||
-D RADIOLIB_EXCLUDE_BELL=1
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro.lib_deps}
|
||||
knolleary/PubSubClient@^2.8
|
||||
lib_ignore =
|
||||
ESP32 BLE Arduino
|
||||
AsyncTCP
|
||||
RPAsyncTCP
|
||||
ESPAsyncWebServer
|
||||
AsyncElegantOTA
|
||||
ESP32-audioI2S
|
||||
esp32_codec2_arduino
|
||||
@@ -0,0 +1,347 @@
|
||||
#include <Arduino.h>
|
||||
#include "variant.h"
|
||||
#include "TDeckProMaxBoard.h"
|
||||
#include <Mesh.h> // For MESH_DEBUG_PRINTLN
|
||||
|
||||
// LEDC channel for e-ink backlight PWM (Arduino ESP32 core 2.x channel-based API)
|
||||
#ifdef PIN_EINK_BL
|
||||
#define EINK_BL_LEDC_CHANNEL 0
|
||||
#endif
|
||||
|
||||
// =============================================================================
|
||||
// TDeckProMaxBoard::begin() — Boot sequence for T-Deck Pro MAX V0.1
|
||||
//
|
||||
// Critical ordering:
|
||||
// 1. I2C bus init (XL9555, BQ27220, and all sensors share this bus)
|
||||
// 2. XL9555 init (must be up before ANY peripheral that depends on it)
|
||||
// 3. Touch reset pulse via XL9555 (needed before touch driver init)
|
||||
// 4. Keyboard reset pulse via XL9555 (clean keyboard state)
|
||||
// 5. LoRa power enable via XL9555 (must be on before SPI radio init)
|
||||
// 6. GPS power + UART init
|
||||
// 7. Parent class init (ESP32Board::begin)
|
||||
// 8. LoRa SPI pin config + deep sleep wake handling
|
||||
// 9. BQ27220 fuel gauge check
|
||||
// 10. Low-voltage protection
|
||||
//
|
||||
// NOTE: We do NOT call TDeckBoard::begin() — we reimplement the boot sequence
|
||||
// to handle XL9555-routed pins. BQ27220 methods are inherited unchanged.
|
||||
// =============================================================================
|
||||
|
||||
void TDeckProMaxBoard::begin() {
|
||||
|
||||
MESH_DEBUG_PRINTLN("TDeckProMaxBoard::begin() - T-Deck Pro MAX V0.1");
|
||||
|
||||
// ------ Step 1: I2C bus ------
|
||||
// All I2C devices (XL9555, BQ27220, TCA8418, CST328, DRV2605, ES8311,
|
||||
// BQ25896, BHI260AP) share SDA=13, SCL=14.
|
||||
Wire.begin(I2C_SDA, I2C_SCL);
|
||||
Wire.setClock(100000); // 100kHz — safe for all devices on the bus
|
||||
MESH_DEBUG_PRINTLN(" I2C initialized (SDA=%d SCL=%d)", I2C_SDA, I2C_SCL);
|
||||
|
||||
// ------ Step 2: XL9555 I/O Expander ------
|
||||
// This must happen before anything that needs peripheral power or resets.
|
||||
if (!xl9555_init()) {
|
||||
Serial.println("CRITICAL: XL9555 init failed — peripherals will not work!");
|
||||
// Continue anyway; some things (display, keyboard INT) might still work
|
||||
// without XL9555, but LoRa/GPS/modem will be dead.
|
||||
}
|
||||
|
||||
// ------ Step 3: Touch reset pulse ------
|
||||
// The touch controller (CST328) needs a clean reset via XL9555 IO07
|
||||
// before the touch driver tries to communicate with it.
|
||||
touchReset();
|
||||
|
||||
// ------ Step 4: Keyboard reset pulse ------
|
||||
keyboardReset();
|
||||
|
||||
// ------ Step 5: Parent class init ------
|
||||
// ESP32Board::begin() handles common ESP32 setup.
|
||||
// We skip TDeckBoard::begin() because it uses PIN_PERF_POWERON and
|
||||
// direct GPIO for LoRa/GPS power that don't exist on MAX.
|
||||
ESP32Board::begin();
|
||||
|
||||
// ------ Step 6: GPS UART init ------
|
||||
// GPS power was already enabled by XL9555 boot defaults (GPS_EN HIGH).
|
||||
// Now init the UART with the MAX-specific pins.
|
||||
#if HAS_GPS
|
||||
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
|
||||
MESH_DEBUG_PRINTLN(" GPS Serial2 initialized (RX=%d TX=%d @ %d baud)",
|
||||
GPS_RX_PIN, GPS_TX_PIN, GPS_BAUDRATE);
|
||||
#endif
|
||||
|
||||
// ------ Step 7: Configure user button ------
|
||||
pinMode(PIN_USER_BTN, INPUT);
|
||||
|
||||
// ------ Step 8: Configure LoRa SPI pins ------
|
||||
// LoRa power is already enabled via XL9555 (LORA_EN HIGH in boot defaults).
|
||||
pinMode(P_LORA_MISO, INPUT_PULLUP);
|
||||
|
||||
// ------ Step 9: Handle wake from deep sleep ------
|
||||
esp_reset_reason_t reason = esp_reset_reason();
|
||||
if (reason == ESP_RST_DEEPSLEEP) {
|
||||
uint64_t wakeup_source = esp_sleep_get_ext1_wakeup_status();
|
||||
if (wakeup_source & (1ULL << P_LORA_DIO_1)) {
|
||||
startup_reason = BD_STARTUP_RX_PACKET;
|
||||
}
|
||||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS);
|
||||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1);
|
||||
}
|
||||
|
||||
// ------ Step 10: BQ27220 fuel gauge ------
|
||||
#if HAS_BQ27220
|
||||
uint16_t voltage = getBattMilliVolts();
|
||||
MESH_DEBUG_PRINTLN(" Battery voltage: %d mV", voltage);
|
||||
configureFuelGauge(); // Inherited from TDeckBoard — sets 1500 mAh
|
||||
#endif
|
||||
|
||||
// ------ Step 11: Early low-voltage protection ------
|
||||
#if HAS_BQ27220 && defined(AUTO_SHUTDOWN_MILLIVOLTS)
|
||||
{
|
||||
uint16_t bootMv = getBattMilliVolts();
|
||||
if (bootMv > 0 && bootMv < AUTO_SHUTDOWN_MILLIVOLTS) {
|
||||
Serial.printf("CRITICAL: Boot voltage %dmV < %dmV — sleeping immediately\n",
|
||||
bootMv, AUTO_SHUTDOWN_MILLIVOLTS);
|
||||
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
|
||||
esp_sleep_enable_ext1_wakeup(1ULL << PIN_USER_BTN, ESP_EXT1_WAKEUP_ANY_HIGH);
|
||||
esp_deep_sleep_start();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// ------ Step 12: E-ink backlight (working on MAX!) ------
|
||||
// Configure LEDC PWM for backlight brightness control.
|
||||
// Start with backlight OFF — UI code can enable it when needed.
|
||||
#ifdef PIN_EINK_BL
|
||||
// Arduino ESP32 core 2.x uses channel-based LEDC API
|
||||
ledcSetup(EINK_BL_LEDC_CHANNEL, 1000, 8); // Channel 0, 1kHz, 8-bit resolution
|
||||
ledcAttachPin(PIN_EINK_BL, EINK_BL_LEDC_CHANNEL);
|
||||
ledcWrite(EINK_BL_LEDC_CHANNEL, 0); // Off by default
|
||||
MESH_DEBUG_PRINTLN(" Backlight PWM configured on IO%d", PIN_EINK_BL);
|
||||
#endif
|
||||
|
||||
MESH_DEBUG_PRINTLN("TDeckProMaxBoard::begin() - complete");
|
||||
}
|
||||
|
||||
|
||||
// =============================================================================
|
||||
// XL9555 I/O Expander — Lightweight I2C Driver
|
||||
// =============================================================================
|
||||
|
||||
bool TDeckProMaxBoard::xl9555_writeReg(uint8_t reg, uint8_t val) {
|
||||
Wire.beginTransmission(I2C_ADDR_XL9555);
|
||||
Wire.write(reg);
|
||||
Wire.write(val);
|
||||
return Wire.endTransmission() == 0;
|
||||
}
|
||||
|
||||
uint8_t TDeckProMaxBoard::xl9555_readReg(uint8_t reg) {
|
||||
Wire.beginTransmission(I2C_ADDR_XL9555);
|
||||
Wire.write(reg);
|
||||
Wire.endTransmission(false);
|
||||
Wire.requestFrom((uint8_t)I2C_ADDR_XL9555, (uint8_t)1);
|
||||
return Wire.available() ? Wire.read() : 0xFF;
|
||||
}
|
||||
|
||||
bool TDeckProMaxBoard::xl9555_init() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Initializing I/O expander at 0x%02X", I2C_ADDR_XL9555);
|
||||
|
||||
// Verify XL9555 is present on the bus
|
||||
Wire.beginTransmission(I2C_ADDR_XL9555);
|
||||
if (Wire.endTransmission() != 0) {
|
||||
Serial.println(" XL9555: NOT FOUND on I2C bus!");
|
||||
_xlReady = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set ALL pins as outputs (config register: 0 = output)
|
||||
// Port 0 (pins 0-7): all output
|
||||
if (!xl9555_writeReg(XL9555_REG_CONFIG_0, 0x00)) return false;
|
||||
// Port 1 (pins 8-15): all output
|
||||
if (!xl9555_writeReg(XL9555_REG_CONFIG_1, 0x00)) return false;
|
||||
|
||||
// Apply boot defaults
|
||||
_xlPort0 = XL9555_BOOT_PORT0;
|
||||
_xlPort1 = XL9555_BOOT_PORT1;
|
||||
if (!xl9555_writeReg(XL9555_REG_OUTPUT_0, _xlPort0)) return false;
|
||||
if (!xl9555_writeReg(XL9555_REG_OUTPUT_1, _xlPort1)) return false;
|
||||
|
||||
_xlReady = true;
|
||||
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Ready (Port0=0x%02X Port1=0x%02X)", _xlPort0, _xlPort1);
|
||||
MESH_DEBUG_PRINTLN(" XL9555: LoRa=%s GPS=%s 1V8=%s Modem=%s Antenna=%s",
|
||||
(_xlPort0 & (1 << XL_PIN_LORA_EN)) ? "ON" : "OFF",
|
||||
(_xlPort0 & (1 << XL_PIN_GPS_EN)) ? "ON" : "OFF",
|
||||
(_xlPort0 & (1 << XL_PIN_1V8_EN)) ? "ON" : "OFF",
|
||||
(_xlPort0 & (1 << XL_PIN_6609_EN)) ? "ON" : "OFF",
|
||||
(_xlPort0 & (1 << XL_PIN_LORA_SEL)) ? "internal" : "external");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::xl9555_digitalWrite(uint8_t pin, bool value) {
|
||||
if (!_xlReady) return;
|
||||
|
||||
if (pin < 8) {
|
||||
// Port 0
|
||||
if (value) _xlPort0 |= (1 << pin);
|
||||
else _xlPort0 &= ~(1 << pin);
|
||||
xl9555_writeReg(XL9555_REG_OUTPUT_0, _xlPort0);
|
||||
} else if (pin < 16) {
|
||||
// Port 1 (subtract 8 for bit position)
|
||||
uint8_t bit = pin - 8;
|
||||
if (value) _xlPort1 |= (1 << bit);
|
||||
else _xlPort1 &= ~(1 << bit);
|
||||
xl9555_writeReg(XL9555_REG_OUTPUT_1, _xlPort1);
|
||||
}
|
||||
}
|
||||
|
||||
bool TDeckProMaxBoard::xl9555_digitalRead(uint8_t pin) const {
|
||||
if (pin < 8) return (_xlPort0 >> pin) & 1;
|
||||
if (pin < 16) return (_xlPort1 >> (pin - 8)) & 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::xl9555_writePort0(uint8_t val) {
|
||||
_xlPort0 = val;
|
||||
if (_xlReady) xl9555_writeReg(XL9555_REG_OUTPUT_0, val);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::xl9555_writePort1(uint8_t val) {
|
||||
_xlPort1 = val;
|
||||
if (_xlReady) xl9555_writeReg(XL9555_REG_OUTPUT_1, val);
|
||||
}
|
||||
|
||||
|
||||
// =============================================================================
|
||||
// High-level peripheral control
|
||||
// =============================================================================
|
||||
|
||||
// ---- Modem (A7682E) ----
|
||||
|
||||
void TDeckProMaxBoard::modemPowerOn() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Modem power ON (6609_EN HIGH)");
|
||||
xl9555_digitalWrite(XL_PIN_6609_EN, HIGH);
|
||||
delay(100); // Allow SGM6609 boost to stabilise
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::modemPowerOff() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Modem power OFF (6609_EN LOW)");
|
||||
xl9555_digitalWrite(XL_PIN_6609_EN, LOW);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::modemPwrkeyPulse() {
|
||||
// A7682E power-on sequence: pulse PWRKEY LOW for >= 500ms
|
||||
// (Some datasheets say pull HIGH then LOW; LilyGo factory sets HIGH then toggles.)
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Modem PWRKEY pulse");
|
||||
xl9555_digitalWrite(XL_PIN_PWRKEY_EN, HIGH);
|
||||
delay(100);
|
||||
xl9555_digitalWrite(XL_PIN_PWRKEY_EN, LOW);
|
||||
delay(1200);
|
||||
xl9555_digitalWrite(XL_PIN_PWRKEY_EN, HIGH);
|
||||
}
|
||||
|
||||
// ---- Audio output selection ----
|
||||
|
||||
void TDeckProMaxBoard::selectAudioES8311() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Audio select → ES8311");
|
||||
xl9555_digitalWrite(XL_PIN_AUDIO_SEL, LOW);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::selectAudioModem() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Audio select → A7682E");
|
||||
xl9555_digitalWrite(XL_PIN_AUDIO_SEL, HIGH);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::amplifierEnable() {
|
||||
xl9555_digitalWrite(XL_PIN_AMPLIFIER, HIGH);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::amplifierDisable() {
|
||||
xl9555_digitalWrite(XL_PIN_AMPLIFIER, LOW);
|
||||
}
|
||||
|
||||
// ---- LoRa antenna selection ----
|
||||
|
||||
void TDeckProMaxBoard::loraAntennaInternal() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: LoRa antenna → internal");
|
||||
xl9555_digitalWrite(XL_PIN_LORA_SEL, HIGH);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::loraAntennaExternal() {
|
||||
MESH_DEBUG_PRINTLN(" XL9555: LoRa antenna → external");
|
||||
xl9555_digitalWrite(XL_PIN_LORA_SEL, LOW);
|
||||
}
|
||||
|
||||
// ---- Motor (DRV2605) ----
|
||||
|
||||
void TDeckProMaxBoard::motorEnable() {
|
||||
xl9555_digitalWrite(XL_PIN_MOTOR_EN, HIGH);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::motorDisable() {
|
||||
xl9555_digitalWrite(XL_PIN_MOTOR_EN, LOW);
|
||||
}
|
||||
|
||||
// ---- Touch reset ----
|
||||
|
||||
void TDeckProMaxBoard::touchReset() {
|
||||
if (!_xlReady) return;
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Touch reset pulse");
|
||||
xl9555_digitalWrite(XL_PIN_TOUCH_RST, LOW);
|
||||
delay(20);
|
||||
xl9555_digitalWrite(XL_PIN_TOUCH_RST, HIGH);
|
||||
delay(50); // Allow touch controller to come out of reset
|
||||
}
|
||||
|
||||
// ---- Keyboard reset ----
|
||||
|
||||
void TDeckProMaxBoard::keyboardReset() {
|
||||
if (!_xlReady) return;
|
||||
MESH_DEBUG_PRINTLN(" XL9555: Keyboard reset pulse");
|
||||
xl9555_digitalWrite(XL_PIN_KEY_RST, LOW);
|
||||
delay(20);
|
||||
xl9555_digitalWrite(XL_PIN_KEY_RST, HIGH);
|
||||
delay(50);
|
||||
}
|
||||
|
||||
// ---- GPS power ----
|
||||
|
||||
void TDeckProMaxBoard::gpsPowerOn() {
|
||||
xl9555_digitalWrite(XL_PIN_GPS_EN, HIGH);
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::gpsPowerOff() {
|
||||
xl9555_digitalWrite(XL_PIN_GPS_EN, LOW);
|
||||
}
|
||||
|
||||
// ---- LoRa power ----
|
||||
|
||||
void TDeckProMaxBoard::loraPowerOn() {
|
||||
xl9555_digitalWrite(XL_PIN_LORA_EN, HIGH);
|
||||
delay(10);
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::loraPowerOff() {
|
||||
xl9555_digitalWrite(XL_PIN_LORA_EN, LOW);
|
||||
}
|
||||
|
||||
// ---- E-ink backlight (working on MAX!) ----
|
||||
|
||||
void TDeckProMaxBoard::backlightOn() {
|
||||
#ifdef PIN_EINK_BL
|
||||
ledcWrite(EINK_BL_LEDC_CHANNEL, 255);
|
||||
#endif
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::backlightOff() {
|
||||
#ifdef PIN_EINK_BL
|
||||
ledcWrite(EINK_BL_LEDC_CHANNEL, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void TDeckProMaxBoard::backlightSetBrightness(uint8_t duty) {
|
||||
#ifdef PIN_EINK_BL
|
||||
ledcWrite(EINK_BL_LEDC_CHANNEL, duty);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// TDeckProMaxBoard — Board support for LilyGo T-Deck Pro MAX V0.1
|
||||
//
|
||||
// Extends TDeckBoard (which provides all BQ27220 fuel gauge methods) with:
|
||||
// - XL9555 I/O expander initialisation and control
|
||||
// - XL9555-routed peripheral power management
|
||||
// - Touch/keyboard reset via XL9555
|
||||
// - Modem power/PWRKEY via XL9555
|
||||
// - LoRa antenna selection via XL9555
|
||||
// - Audio output mux (ES8311 vs A7682E) via XL9555
|
||||
// - Speaker amplifier enable via XL9555
|
||||
//
|
||||
// The XL9555 must be initialised before LoRa, GPS, modem, or touch are used.
|
||||
// All power enables, resets, and switches go through I2C — not direct GPIO.
|
||||
// =============================================================================
|
||||
|
||||
#include "variant.h"
|
||||
#include "TDeckBoard.h" // Inherits BQ27220 fuel gauge, deep sleep, power management
|
||||
|
||||
class TDeckProMaxBoard : public TDeckBoard {
|
||||
public:
|
||||
void begin();
|
||||
|
||||
const char* getManufacturerName() const {
|
||||
return "LilyGo T-Deck Pro MAX";
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// XL9555 I/O Expander — lightweight inline driver
|
||||
//
|
||||
// The XL9555 has 16 I/O pins across two 8-bit ports.
|
||||
// Pin 0-7 = Port 0, Pin 8-15 = Port 1.
|
||||
// We shadow the output state in _xlPort0/_xlPort1 to allow
|
||||
// single-bit set/clear without read-modify-write over I2C.
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// Initialise XL9555: set all used pins as outputs, apply boot defaults.
|
||||
// Returns true if I2C communication with XL9555 succeeded.
|
||||
bool xl9555_init();
|
||||
|
||||
// Set a single XL9555 pin HIGH or LOW (pin 0-15).
|
||||
void xl9555_digitalWrite(uint8_t pin, bool value);
|
||||
|
||||
// Read the current output state of a pin (from shadow, not I2C read).
|
||||
bool xl9555_digitalRead(uint8_t pin) const;
|
||||
|
||||
// Write raw port values (for batch updates).
|
||||
void xl9555_writePort0(uint8_t val);
|
||||
void xl9555_writePort1(uint8_t val);
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// High-level peripheral control (delegates to XL9555)
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// Modem (A7682E) power control
|
||||
void modemPowerOn(); // Enable SGM6609 boost (6609_EN HIGH)
|
||||
void modemPowerOff(); // Disable SGM6609 boost (6609_EN LOW)
|
||||
void modemPwrkeyPulse(); // Toggle PWRKEY: HIGH 100ms → LOW 1200ms → HIGH
|
||||
|
||||
// Audio output selection
|
||||
void selectAudioES8311(); // AUDIO_SEL LOW → ES8311 output to speaker/headphones
|
||||
void selectAudioModem(); // AUDIO_SEL HIGH → A7682E output to speaker/headphones
|
||||
void amplifierEnable(); // NS4150B amplifier ON (louder speaker)
|
||||
void amplifierDisable(); // NS4150B amplifier OFF (saves power)
|
||||
|
||||
// LoRa antenna selection (SKY13453 RF switch)
|
||||
void loraAntennaInternal(); // LORA_SEL HIGH → internal PCB antenna (default)
|
||||
void loraAntennaExternal(); // LORA_SEL LOW → external IPEX antenna
|
||||
|
||||
// Motor (DRV2605) power
|
||||
void motorEnable(); // MOTOR_EN HIGH
|
||||
void motorDisable(); // MOTOR_EN LOW
|
||||
|
||||
// Touch controller reset via XL9555
|
||||
void touchReset(); // Pulse TOUCH_RST: LOW 20ms → HIGH, then 50ms settle
|
||||
|
||||
// Keyboard reset via XL9555
|
||||
void keyboardReset(); // Pulse KEY_RST: LOW 20ms → HIGH, then 50ms settle
|
||||
|
||||
// GPS power control via XL9555
|
||||
void gpsPowerOn(); // GPS_EN HIGH
|
||||
void gpsPowerOff(); // GPS_EN LOW
|
||||
|
||||
// LoRa power control via XL9555
|
||||
void loraPowerOn(); // LORA_EN HIGH
|
||||
void loraPowerOff(); // LORA_EN LOW
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// E-ink front-light control
|
||||
// On MAX, IO41 has a working backlight circuit (boost converter + LEDs).
|
||||
// PWM control for brightness is possible via ledc.
|
||||
// -------------------------------------------------------------------------
|
||||
void backlightOn();
|
||||
void backlightOff();
|
||||
void backlightSetBrightness(uint8_t duty); // 0-255, via LEDC PWM
|
||||
|
||||
private:
|
||||
// Shadow registers for XL9555 output ports (avoid I2C read-modify-write)
|
||||
uint8_t _xlPort0 = XL9555_BOOT_PORT0;
|
||||
uint8_t _xlPort1 = XL9555_BOOT_PORT1;
|
||||
bool _xlReady = false;
|
||||
|
||||
// Low-level I2C helpers
|
||||
bool xl9555_writeReg(uint8_t reg, uint8_t val);
|
||||
uint8_t xl9555_readReg(uint8_t reg);
|
||||
};
|
||||
@@ -0,0 +1,360 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Wire.h>
|
||||
|
||||
// TCA8418 Register addresses
|
||||
#define TCA8418_REG_CFG 0x01
|
||||
#define TCA8418_REG_INT_STAT 0x02
|
||||
#define TCA8418_REG_KEY_LCK_EC 0x03
|
||||
#define TCA8418_REG_KEY_EVENT_A 0x04
|
||||
#define TCA8418_REG_KP_GPIO1 0x1D
|
||||
#define TCA8418_REG_KP_GPIO2 0x1E
|
||||
#define TCA8418_REG_KP_GPIO3 0x1F
|
||||
#define TCA8418_REG_DEBOUNCE 0x29
|
||||
#define TCA8418_REG_GPI_EM1 0x20
|
||||
#define TCA8418_REG_GPI_EM2 0x21
|
||||
#define TCA8418_REG_GPI_EM3 0x22
|
||||
|
||||
// Key codes for special keys
|
||||
#define KB_KEY_NONE 0
|
||||
#define KB_KEY_BACKSPACE '\b'
|
||||
#define KB_KEY_ENTER '\r'
|
||||
#define KB_KEY_SPACE ' '
|
||||
#define KB_KEY_EMOJI 0x01 // Non-printable code for $ key (emoji picker)
|
||||
#define KB_KEY_BACKLIGHT 0x02 // Non-printable code for Alt+B (backlight toggle, MAX only)
|
||||
|
||||
class TCA8418Keyboard {
|
||||
private:
|
||||
uint8_t _addr;
|
||||
TwoWire* _wire;
|
||||
bool _initialized;
|
||||
bool _shiftActive; // Sticky shift (one-shot or held)
|
||||
bool _shiftConsumed; // Was shift active for the last returned key
|
||||
bool _shiftHeld; // Shift key physically held down
|
||||
bool _shiftUsedWhileHeld; // Was shift consumed by any key while held
|
||||
bool _altActive; // Sticky alt (one-shot)
|
||||
bool _symActive; // Sticky sym (one-shot)
|
||||
unsigned long _lastShiftTime; // For Shift+key combos
|
||||
|
||||
uint8_t readReg(uint8_t reg) {
|
||||
_wire->beginTransmission(_addr);
|
||||
_wire->write(reg);
|
||||
_wire->endTransmission();
|
||||
_wire->requestFrom(_addr, (uint8_t)1);
|
||||
return _wire->available() ? _wire->read() : 0;
|
||||
}
|
||||
|
||||
void writeReg(uint8_t reg, uint8_t val) {
|
||||
_wire->beginTransmission(_addr);
|
||||
_wire->write(reg);
|
||||
_wire->write(val);
|
||||
_wire->endTransmission();
|
||||
}
|
||||
|
||||
// Map raw key codes to characters (from working reader firmware)
|
||||
char getKeyChar(uint8_t keyCode) {
|
||||
switch (keyCode) {
|
||||
// Row 1 - QWERTYUIOP
|
||||
case 10: return 'q'; // Q (was 97 on different hardware)
|
||||
case 9: return 'w';
|
||||
case 8: return 'e';
|
||||
case 7: return 'r';
|
||||
case 6: return 't';
|
||||
case 5: return 'y';
|
||||
case 4: return 'u';
|
||||
case 3: return 'i';
|
||||
case 2: return 'o';
|
||||
case 1: return 'p';
|
||||
|
||||
// Row 2 - ASDFGHJKL + Backspace
|
||||
case 20: return 'a'; // A (was 98 on different hardware)
|
||||
case 19: return 's';
|
||||
case 18: return 'd';
|
||||
case 17: return 'f';
|
||||
case 16: return 'g';
|
||||
case 15: return 'h';
|
||||
case 14: return 'j';
|
||||
case 13: return 'k';
|
||||
case 12: return 'l';
|
||||
case 11: return '\b'; // Backspace
|
||||
|
||||
// Row 3 - Alt ZXCVBNM Sym Enter
|
||||
case 30: return 0; // Alt - handled separately
|
||||
case 29: return 'z';
|
||||
case 28: return 'x';
|
||||
case 27: return 'c';
|
||||
case 26: return 'v';
|
||||
case 25: return 'b';
|
||||
case 24: return 'n';
|
||||
case 23: return 'm';
|
||||
case 22: return 0; // Symbol key - handled separately
|
||||
case 21: return '\r'; // Enter
|
||||
|
||||
// Row 4 - Shift Mic Space Sym Shift
|
||||
case 35: return 0; // Left shift - handled separately
|
||||
case 34: return 0; // Mic
|
||||
case 33: return ' '; // Space
|
||||
case 32: return 0; // Sym - handled separately
|
||||
case 31: return 0; // Right shift - handled separately
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Map key with Alt modifier - same as Sym for this keyboard
|
||||
char getAltChar(uint8_t keyCode) {
|
||||
return getSymChar(keyCode); // Alt does same as Sym
|
||||
}
|
||||
|
||||
// Map key with Sym modifier - based on actual T-Deck Pro keyboard silk-screen
|
||||
char getSymChar(uint8_t keyCode) {
|
||||
switch (keyCode) {
|
||||
// Row 1: Q W E R T Y U I O P
|
||||
case 10: return '#'; // Q -> #
|
||||
case 9: return '1'; // W -> 1
|
||||
case 8: return '2'; // E -> 2
|
||||
case 7: return '3'; // R -> 3
|
||||
case 6: return '('; // T -> (
|
||||
case 5: return ')'; // Y -> )
|
||||
case 4: return '_'; // U -> _
|
||||
case 3: return '-'; // I -> -
|
||||
case 2: return '+'; // O -> +
|
||||
case 1: return '@'; // P -> @
|
||||
|
||||
// Row 2: A S D F G H J K L
|
||||
case 20: return '*'; // A -> *
|
||||
case 19: return '4'; // S -> 4
|
||||
case 18: return '5'; // D -> 5
|
||||
case 17: return '6'; // F -> 6
|
||||
case 16: return '/'; // G -> /
|
||||
case 15: return ':'; // H -> :
|
||||
case 14: return ';'; // J -> ;
|
||||
case 13: return '\''; // K -> '
|
||||
case 12: return '"'; // L -> "
|
||||
|
||||
// Row 3: Z X C V B N M
|
||||
case 29: return '7'; // Z -> 7
|
||||
case 28: return '8'; // X -> 8
|
||||
case 27: return '9'; // C -> 9
|
||||
case 26: return '?'; // V -> ?
|
||||
case 25: return '!'; // B -> !
|
||||
case 24: return ','; // N -> ,
|
||||
case 23: return '.'; // M -> .
|
||||
|
||||
// Row 4: Mic key -> 0
|
||||
case 34: return '0'; // Mic -> 0
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
TCA8418Keyboard(uint8_t addr = 0x34, TwoWire* wire = &Wire)
|
||||
: _addr(addr), _wire(wire), _initialized(false),
|
||||
_shiftActive(false), _shiftConsumed(false), _shiftHeld(false), _shiftUsedWhileHeld(false), _altActive(false), _symActive(false), _lastShiftTime(0) {}
|
||||
|
||||
bool begin() {
|
||||
// Check if device responds
|
||||
_wire->beginTransmission(_addr);
|
||||
if (_wire->endTransmission() != 0) {
|
||||
Serial.println("TCA8418: Device not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
// --- Warm-reboot safe init sequence ---
|
||||
// The TCA8418 stays powered across ESP32 resets (no dedicated RST pin),
|
||||
// so the scanner may still be active from the previous session.
|
||||
// We must disable it before reconfiguring the matrix.
|
||||
|
||||
// 1. Disable scanner — stop all scanning before touching config
|
||||
writeReg(TCA8418_REG_CFG, 0x00);
|
||||
|
||||
// 2. Drain any stale events from the previous session
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if ((readReg(TCA8418_REG_KEY_LCK_EC) & 0x0F) == 0) break;
|
||||
readReg(TCA8418_REG_KEY_EVENT_A);
|
||||
}
|
||||
writeReg(TCA8418_REG_INT_STAT, 0x1F); // Clear all interrupt flags
|
||||
|
||||
// 3. Explicitly clear GPI event masks (prevent phantom GPI events)
|
||||
writeReg(TCA8418_REG_GPI_EM1, 0x00);
|
||||
writeReg(TCA8418_REG_GPI_EM2, 0x00);
|
||||
writeReg(TCA8418_REG_GPI_EM3, 0x00);
|
||||
|
||||
// 4. Configure keyboard matrix (8 rows x 10 cols)
|
||||
writeReg(TCA8418_REG_KP_GPIO1, 0xFF); // Rows 0-7 as keypad
|
||||
writeReg(TCA8418_REG_KP_GPIO2, 0xFF); // Cols 0-7 as keypad
|
||||
writeReg(TCA8418_REG_KP_GPIO3, 0x03); // Cols 8-9 as keypad
|
||||
|
||||
// 5. Set debounce
|
||||
writeReg(TCA8418_REG_DEBOUNCE, 0x03);
|
||||
|
||||
// 6. Final pre-enable cleanup
|
||||
writeReg(TCA8418_REG_INT_STAT, 0x1F);
|
||||
|
||||
// 7. Enable scanner — matrix config is stable, safe to start scanning
|
||||
writeReg(TCA8418_REG_CFG, 0x11); // KE_IEN + INT_CFG
|
||||
|
||||
// 8. Let scanner stabilise, then flush any spurious first-scan events
|
||||
delay(5);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if ((readReg(TCA8418_REG_KEY_LCK_EC) & 0x0F) == 0) break;
|
||||
readReg(TCA8418_REG_KEY_EVENT_A);
|
||||
}
|
||||
writeReg(TCA8418_REG_INT_STAT, 0x1F);
|
||||
|
||||
_initialized = true;
|
||||
Serial.println("TCA8418: Keyboard initialized OK");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Read a key press - returns character or 0 if no key
|
||||
char readKey() {
|
||||
if (!_initialized) return 0;
|
||||
|
||||
// Check for key events in FIFO
|
||||
uint8_t keyCount = readReg(TCA8418_REG_KEY_LCK_EC) & 0x0F;
|
||||
if (keyCount == 0) return 0;
|
||||
|
||||
// Read key event from FIFO
|
||||
uint8_t keyEvent = readReg(TCA8418_REG_KEY_EVENT_A);
|
||||
|
||||
// Bit 7: 1 = press, 0 = release
|
||||
bool pressed = (keyEvent & 0x80) != 0;
|
||||
uint8_t keyCode = keyEvent & 0x7F;
|
||||
|
||||
// Clear interrupt
|
||||
writeReg(TCA8418_REG_INT_STAT, 0x1F);
|
||||
|
||||
Serial.printf("KB raw: event=0x%02X code=%d pressed=%d count=%d\n",
|
||||
keyEvent, keyCode, pressed, keyCount);
|
||||
|
||||
// Track shift release (before the general release-ignore)
|
||||
if (!pressed && (keyCode == 35 || keyCode == 31)) {
|
||||
_shiftHeld = false;
|
||||
// If shift was used while held (e.g. cursor nav), clear it completely
|
||||
// so the next bare keypress isn't treated as shifted.
|
||||
// If shift was NOT used (tap-then-release), keep _shiftActive for one-shot.
|
||||
if (_shiftUsedWhileHeld) {
|
||||
_shiftActive = false;
|
||||
}
|
||||
_shiftUsedWhileHeld = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Only act on key press, not release
|
||||
if (!pressed || keyCode == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Handle modifier keys - set sticky state and return 0
|
||||
if (keyCode == 35 || keyCode == 31) { // Shift keys
|
||||
_shiftActive = true;
|
||||
_shiftHeld = true;
|
||||
_shiftUsedWhileHeld = false;
|
||||
_lastShiftTime = millis();
|
||||
Serial.println("KB: Shift activated");
|
||||
return 0;
|
||||
}
|
||||
if (keyCode == 30) { // Alt key
|
||||
_altActive = true;
|
||||
Serial.println("KB: Alt activated");
|
||||
return 0;
|
||||
}
|
||||
if (keyCode == 32) { // Sym key (bottom row)
|
||||
_symActive = true;
|
||||
Serial.println("KB: Sym activated");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Handle dedicated $ key (key code 22, next to M)
|
||||
// Bare press = emoji picker, Sym+$ = literal '$'
|
||||
if (keyCode == 22) {
|
||||
if (_symActive) {
|
||||
_symActive = false;
|
||||
Serial.println("KB: Sym+$ -> '$'");
|
||||
return '$';
|
||||
}
|
||||
Serial.println("KB: $ key -> emoji");
|
||||
return KB_KEY_EMOJI;
|
||||
}
|
||||
|
||||
// Handle Mic key - always produces '0' (silk-screened on key)
|
||||
// Sym+Mic also produces '0' (consumes sym so it doesn't leak)
|
||||
if (keyCode == 34) {
|
||||
_symActive = false;
|
||||
Serial.println("KB: Mic -> '0'");
|
||||
return '0';
|
||||
}
|
||||
|
||||
// Get the character
|
||||
char c = 0;
|
||||
|
||||
// Alt+B -> backlight toggle (T-Deck Pro MAX only — working front-light on IO41)
|
||||
if (_altActive && keyCode == 25) { // keyCode 25 = B
|
||||
_altActive = false;
|
||||
Serial.println("KB: Alt+B -> backlight toggle");
|
||||
return KB_KEY_BACKLIGHT;
|
||||
}
|
||||
|
||||
if (_altActive) {
|
||||
c = getAltChar(keyCode);
|
||||
_altActive = false; // Reset sticky alt
|
||||
if (c != 0) {
|
||||
Serial.printf("KB: Alt+key -> '%c'\n", c);
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
if (_symActive) {
|
||||
c = getSymChar(keyCode);
|
||||
_symActive = false; // Reset sticky sym
|
||||
if (c != 0) {
|
||||
Serial.printf("KB: Sym+key -> '%c'\n", c);
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
c = getKeyChar(keyCode);
|
||||
|
||||
if (c != 0 && _shiftActive) {
|
||||
// Apply shift - uppercase letters
|
||||
if (c >= 'a' && c <= 'z') {
|
||||
c = c - 'a' + 'A';
|
||||
}
|
||||
// Track that shift was used while physically held
|
||||
if (_shiftHeld) {
|
||||
_shiftUsedWhileHeld = true;
|
||||
}
|
||||
// Only clear shift if it's one-shot (tap), not held down
|
||||
if (!_shiftHeld) {
|
||||
_shiftActive = false;
|
||||
}
|
||||
_shiftConsumed = true; // Record that shift was active for this key
|
||||
} else {
|
||||
_shiftConsumed = false;
|
||||
}
|
||||
|
||||
if (c != 0) {
|
||||
Serial.printf("KB: code %d -> '%c' (0x%02X)\n", keyCode, c >= 32 ? c : '?', c);
|
||||
} else {
|
||||
Serial.printf("KB: code %d -> UNMAPPED\n", keyCode);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
bool isReady() const { return _initialized; }
|
||||
|
||||
// Check if shift was pressed within the last N milliseconds
|
||||
bool wasShiftRecentlyPressed(unsigned long withinMs = 500) const {
|
||||
return (millis() - _lastShiftTime) < withinMs;
|
||||
}
|
||||
|
||||
// Check if shift was active when the most recent key was produced
|
||||
// (immune to e-ink refresh timing unlike wasShiftRecentlyPressed)
|
||||
bool wasShiftConsumed() const {
|
||||
return _shiftConsumed;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,232 @@
|
||||
; =============================================================================
|
||||
; T-Deck Pro MAX V0.1 — Meck Build Environments
|
||||
;
|
||||
; Hardware: ESP32-S3 + XL9555 I/O expander + combined 4G (A7682E) + Audio (ES8311)
|
||||
;
|
||||
; Key differences from LilyGo_TDeck_Pro (V1.1):
|
||||
; - Peripheral power controlled via XL9555 (not direct GPIO)
|
||||
; - 4G modem and ES8311 audio coexist (no longer mutually exclusive)
|
||||
; - ES8311 I2C codec replaces PCM5102A (different I2S pins, needs I2C config)
|
||||
; - Several GPIO reassignments (see variant.h for full map)
|
||||
; - 1500 mAh battery (was 1400)
|
||||
; - Working e-ink front-light on IO41
|
||||
;
|
||||
; WHAT WORKS OUT OF THE BOX:
|
||||
; LoRa mesh, keyboard, e-ink display, GPS, touchscreen, battery management,
|
||||
; SD card, text reader, notes, contacts, channels, settings, discovery,
|
||||
; last heard, repeater admin, web reader (WiFi builds), OTA update.
|
||||
;
|
||||
; NEEDS ADAPTATION (future work):
|
||||
; - HAS_4G_MODEM: ModemManager uses direct GPIO for MODEM_POWER_EN/PWRKEY
|
||||
; which are XL9555-routed on MAX. Needs board.modemPowerOn() etc.
|
||||
; - MECK_AUDIO_VARIANT: ES8311 needs I2C codec init (PCM5102A didn't).
|
||||
; I2S pins are different. AudiobookPlayerScreen needs ES8311 driver.
|
||||
; - Combined 4G+audio: existing #ifdef guards treat them as mutually
|
||||
; exclusive. Needs restructuring for coexistence.
|
||||
; =============================================================================
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Base environment for T-Deck Pro MAX
|
||||
; ---------------------------------------------------------------------------
|
||||
[LilyGo_TDeck_Pro_Max]
|
||||
extends = esp32_base
|
||||
extra_scripts = post:merge_firmware.py
|
||||
board = t-deck_pro_max
|
||||
board_build.flash_mode = qio
|
||||
board_build.f_flash = 80000000L
|
||||
board_build.arduino.memory_type = qio_qspi
|
||||
board_upload.flash_size = 16MB
|
||||
build_flags =
|
||||
${esp32_base.build_flags}
|
||||
${sensor_base.build_flags}
|
||||
; Include MAX variant first (for variant.h, target.h, TDeckProMaxBoard.h)
|
||||
; then V1.1 variant (for TDeckBoard.h, which TDeckProMaxBoard inherits from)
|
||||
-I variants/LilyGo_TDeck_Pro_Max
|
||||
-I variants/LilyGo_TDeck_Pro
|
||||
; Both defines needed: LilyGo_TDeck_Pro for existing UI code guards,
|
||||
; LilyGo_TDeck_Pro_Max for MAX-specific code paths
|
||||
-D LilyGo_TDeck_Pro
|
||||
-D LilyGo_TDeck_Pro_Max
|
||||
-D HAS_XL9555=1
|
||||
-D HAS_GPS=1
|
||||
-D BOARD_HAS_PSRAM=1
|
||||
-D CORE_DEBUG_LEVEL=1
|
||||
-D FORMAT_SPIFFS_IF_FAILED=1
|
||||
-D FORMAT_LITTLEFS_IF_FAILED=1
|
||||
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||
-D RADIO_CLASS=CustomSX1262
|
||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
||||
-D LORA_TX_POWER=22
|
||||
-D SX126X_DIO2_AS_RF_SWITCH
|
||||
-D SX126X_CURRENT_LIMIT=140
|
||||
-D SX126X_RX_BOOSTED_GAIN=1
|
||||
-D SX126X_DIO3_TCXO_VOLTAGE=2.4f
|
||||
; LoRa SPI pins (direct GPIO — unchanged from V1.1)
|
||||
-D P_LORA_DIO_1=5
|
||||
-D P_LORA_NSS=3
|
||||
-D P_LORA_RESET=4
|
||||
-D P_LORA_BUSY=6
|
||||
-D P_LORA_SCLK=36
|
||||
-D P_LORA_MISO=47
|
||||
-D P_LORA_MOSI=33
|
||||
; P_LORA_EN deliberately NOT defined — LoRa power via XL9555 in board.begin()
|
||||
; GPS pins (direct GPIO — changed from V1.1!)
|
||||
-D ENV_INCLUDE_GPS=1
|
||||
-D ENV_SKIP_GPS_DETECT=1
|
||||
-D PIN_GPS_RX=2
|
||||
-D PIN_GPS_TX=16
|
||||
-D GPS_BAUD_RATE=38400
|
||||
; Sensor exclusions (same as V1.1)
|
||||
-D ENV_INCLUDE_AHTX0=0
|
||||
-D ENV_INCLUDE_BME280=0
|
||||
-D ENV_INCLUDE_BMP280=0
|
||||
-D ENV_INCLUDE_SHTC3=0
|
||||
-D ENV_INCLUDE_SHT4X=0
|
||||
-D ENV_INCLUDE_LPS22HB=0
|
||||
-D ENV_INCLUDE_INA3221=0
|
||||
-D ENV_INCLUDE_INA219=0
|
||||
-D ENV_INCLUDE_INA226=0
|
||||
-D ENV_INCLUDE_INA260=0
|
||||
-D ENV_INCLUDE_MLX90614=0
|
||||
-D ENV_INCLUDE_VL53L0X=0
|
||||
-D ENV_INCLUDE_BME680=0
|
||||
-D ENV_INCLUDE_BMP085=0
|
||||
; E-ink display (pin changes from V1.1: RST=9, BL=41)
|
||||
-D USE_EINK
|
||||
-D DISPLAY_CLASS=GxEPDDisplay
|
||||
-D EINK_DISPLAY_MODEL=GxEPD2_310_GDEQ031T10
|
||||
-D EINK_WIDTH=240
|
||||
-D EINK_HEIGHT=320
|
||||
-D EINK_CS=34
|
||||
-D EINK_DC=35
|
||||
-D EINK_RST=9
|
||||
-D EINK_BUSY=37
|
||||
-D EINK_SCLK=36
|
||||
-D EINK_MOSI=33
|
||||
-D EINK_BL=41
|
||||
-D EINK_NOT_HIBERNATE=1
|
||||
; Battery (1500 mAh on MAX, was 1400 on V1.1)
|
||||
-D HAS_BQ27220=1
|
||||
-D AUTO_SHUTDOWN_MILLIVOLTS=2800
|
||||
; Display rendering parameters
|
||||
-D EINK_LIMIT_FASTREFRESH=10
|
||||
-D EINK_LIMIT_GHOSTING_PX=2000
|
||||
-D DISPLAY_ROTATION=0
|
||||
-D EINK_ROTATION=0
|
||||
-D EINK_SCALE_X=1.875f
|
||||
-D EINK_SCALE_Y=2.5f
|
||||
-D EINK_X_OFFSET=0
|
||||
-D EINK_Y_OFFSET=5
|
||||
; Legacy display pin aliases (for GxEPDDisplay.cpp)
|
||||
-D PIN_DISPLAY_CS=34
|
||||
-D PIN_DISPLAY_DC=35
|
||||
-D PIN_DISPLAY_RST=9
|
||||
-D PIN_DISPLAY_BUSY=37
|
||||
-D PIN_DISPLAY_SCLK=36
|
||||
-D PIN_DISPLAY_MISO=-1
|
||||
-D PIN_DISPLAY_MOSI=33
|
||||
-D PIN_DISPLAY_BL=41
|
||||
-D PIN_USER_BTN=0
|
||||
; Touch (INT is direct GPIO; RST is XL9555, handled by board class)
|
||||
-D HAS_TOUCHSCREEN=1
|
||||
-D CST328_PIN_INT=12
|
||||
-D CST328_PIN_RST=-1
|
||||
-D ARDUINO_LOOP_STACK_SIZE=32768
|
||||
build_src_filter = ${esp32_base.build_src_filter}
|
||||
; Include TDeckBoard.cpp from V1.1 (parent class with BQ27220 code)
|
||||
+<../variants/LilyGo_TDeck_Pro/TDeckBoard.cpp>
|
||||
; Include MAX variant (target.cpp + TDeckProMaxBoard.cpp)
|
||||
+<../variants/LilyGo_TDeck_Pro_Max>
|
||||
+<helpers/sensors/*.cpp>
|
||||
lib_deps =
|
||||
${esp32_base.lib_deps}
|
||||
${sensor_base.lib_deps}
|
||||
zinggjm/GxEPD2@^1.5.9
|
||||
adafruit/Adafruit GFX Library@^1.11.0
|
||||
bitbank2/PNGdec@^1.0.1
|
||||
WebServer
|
||||
Update
|
||||
|
||||
|
||||
; ===========================================================================
|
||||
; Meck MAX builds — LoRa mesh works out of the box on all variants.
|
||||
; 4G modem and ES8311 audio need adaptation before they can be enabled.
|
||||
; ===========================================================================
|
||||
|
||||
; MAX + BLE companion (standard BLE phone bridging)
|
||||
; Both 4G + audio hardware present but not yet enabled in firmware.
|
||||
; BLE_PIN_CODE limit: MAX_CONTACTS=500 (BLE protocol ceiling).
|
||||
[env:meck_max_ble]
|
||||
extends = LilyGo_TDeck_Pro_Max
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro_Max.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=500
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D BLE_PIN_CODE=123456
|
||||
-D OFFLINE_QUEUE_SIZE=256
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.3.MAX"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro_Max.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
+<helpers/ui/GxEPDDisplay.cpp>
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro_Max.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git#2.0.6
|
||||
bitbank2/JPEGDEC
|
||||
|
||||
; MAX + WiFi companion (WiFi app bridging — no BLE, higher contact limit)
|
||||
; WiFi credentials loaded from SD card (/web/wifi.cfg).
|
||||
; Connect via MeshCore web app, meshcore.js, or Python CLI.
|
||||
[env:meck_max_wifi]
|
||||
extends = LilyGo_TDeck_Pro_Max
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro_Max.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D MECK_WIFI_COMPANION=1
|
||||
-D TCP_PORT=5000
|
||||
-D WIFI_DEBUG_LOGGING=1
|
||||
-D OFFLINE_QUEUE_SIZE=256
|
||||
-D MECK_WEB_READER=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.3.MAX.WiFi"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro_Max.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
+<helpers/ui/GxEPDDisplay.cpp>
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro_Max.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git#2.0.6
|
||||
bitbank2/JPEGDEC
|
||||
|
||||
; MAX standalone (no BLE/WiFi — maximum battery life, LoRa mesh only)
|
||||
; Contacts in PSRAM (1500 capacity). OTA enabled (WiFi AP on demand).
|
||||
[env:meck_max_standalone]
|
||||
extends = LilyGo_TDeck_Pro_Max
|
||||
build_flags =
|
||||
${LilyGo_TDeck_Pro_Max.build_flags}
|
||||
-I examples/companion_radio/ui-new
|
||||
-D MAX_CONTACTS=1500
|
||||
-D MAX_GROUP_CHANNELS=20
|
||||
-D OFFLINE_QUEUE_SIZE=1
|
||||
-D MECK_OTA_UPDATE=1
|
||||
-D FIRMWARE_VERSION='"Meck v1.3.MAX.SA"'
|
||||
build_src_filter = ${LilyGo_TDeck_Pro_Max.build_src_filter}
|
||||
+<helpers/esp32/*.cpp>
|
||||
+<helpers/ui/MomentaryButton.cpp>
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
+<../examples/companion_radio/ui-new/*.cpp>
|
||||
+<helpers/ui/GxEPDDisplay.cpp>
|
||||
lib_deps =
|
||||
${LilyGo_TDeck_Pro_Max.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
@@ -0,0 +1,91 @@
|
||||
#include <Arduino.h>
|
||||
#include "variant.h"
|
||||
#include "target.h"
|
||||
|
||||
TDeckProMaxBoard board;
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
static SPIClass loraSpi(HSPI);
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, loraSpi);
|
||||
#else
|
||||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
|
||||
#endif
|
||||
|
||||
WRAPPER_CLASS radio_driver(radio, board);
|
||||
|
||||
ESP32RTCClock fallback_clock;
|
||||
AutoDiscoverRTCClock rtc_clock(fallback_clock);
|
||||
|
||||
#if HAS_GPS
|
||||
// Wrap Serial2 with a sentence counter so the UI can show NMEA throughput.
|
||||
// MicroNMEALocationProvider reads through this wrapper transparently.
|
||||
GPSStreamCounter gpsStream(Serial2);
|
||||
MicroNMEALocationProvider gps(gpsStream, &rtc_clock);
|
||||
EnvironmentSensorManager sensors(gps);
|
||||
#else
|
||||
SensorManager sensors;
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
DISPLAY_CLASS display;
|
||||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
|
||||
#endif
|
||||
|
||||
bool radio_init() {
|
||||
MESH_DEBUG_PRINTLN("radio_init() - starting");
|
||||
|
||||
// NOTE: board.begin() is called by main.cpp setup() before radio_init()
|
||||
// I2C is already initialized there with correct pins
|
||||
|
||||
fallback_clock.begin();
|
||||
MESH_DEBUG_PRINTLN("radio_init() - fallback_clock started");
|
||||
|
||||
// Wire already initialized in board.begin() - just use it for RTC
|
||||
rtc_clock.begin(Wire);
|
||||
MESH_DEBUG_PRINTLN("radio_init() - rtc_clock started");
|
||||
|
||||
#if defined(P_LORA_SCLK)
|
||||
MESH_DEBUG_PRINTLN("radio_init() - initializing LoRa SPI...");
|
||||
loraSpi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, P_LORA_NSS);
|
||||
MESH_DEBUG_PRINTLN("radio_init() - SPI initialized, calling radio.std_init()...");
|
||||
bool result = radio.std_init(&loraSpi);
|
||||
MESH_DEBUG_PRINTLN("radio_init() - radio.std_init() returned: %s", result ? "SUCCESS" : "FAILED");
|
||||
return result;
|
||||
#else
|
||||
MESH_DEBUG_PRINTLN("radio_init() - calling radio.std_init() without custom SPI...");
|
||||
bool result = radio.std_init();
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t radio_get_rng_seed() {
|
||||
return radio.random(0x7FFFFFFF);
|
||||
}
|
||||
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
|
||||
radio.setFrequency(freq);
|
||||
radio.setSpreadingFactor(sf);
|
||||
radio.setBandwidth(bw);
|
||||
radio.setCodingRate(cr);
|
||||
|
||||
// Longer preamble for low SF improves reliability — each symbol is shorter
|
||||
// at low SF, so more symbols are needed for reliable detection.
|
||||
// SF <= 8 gets 32 symbols (~65ms at SF7/62.5kHz); SF >= 9 keeps 16 (already ~131ms+).
|
||||
// See: https://github.com/meshcore-dev/MeshCore/pull/1954
|
||||
uint16_t preamble = (sf <= 8) ? 32 : 16;
|
||||
radio.setPreambleLength(preamble);
|
||||
MESH_DEBUG_PRINTLN("radio_set_params() - bw=%.1f sf=%u preamble=%u", bw, sf, preamble);
|
||||
}
|
||||
|
||||
void radio_set_tx_power(uint8_t dbm) {
|
||||
radio.setOutputPower(dbm);
|
||||
}
|
||||
|
||||
mesh::LocalIdentity radio_new_identity() {
|
||||
RadioNoiseListener rng(radio);
|
||||
return mesh::LocalIdentity(&rng);
|
||||
}
|
||||
|
||||
void radio_reset_agc() {
|
||||
radio.setRxBoostedGainMode(true);
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
// Include variant.h first to ensure all board-specific defines are available
|
||||
#include "variant.h"
|
||||
|
||||
#define RADIOLIB_STATIC_ONLY 1
|
||||
#include <RadioLib.h>
|
||||
#include <helpers/radiolib/RadioLibWrappers.h>
|
||||
#include <helpers/radiolib/CustomSX1262Wrapper.h>
|
||||
#include <TDeckProMaxBoard.h>
|
||||
#include <helpers/AutoDiscoverRTCClock.h>
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
#include <helpers/ui/GxEPDDisplay.h>
|
||||
#include <helpers/ui/MomentaryButton.h>
|
||||
#endif
|
||||
|
||||
#if HAS_GPS
|
||||
#include "helpers/sensors/EnvironmentSensorManager.h"
|
||||
#include "helpers/sensors/MicroNMEALocationProvider.h"
|
||||
#include "GPSStreamCounter.h"
|
||||
#else
|
||||
#include <helpers/SensorManager.h>
|
||||
#endif
|
||||
|
||||
extern TDeckProMaxBoard board;
|
||||
extern WRAPPER_CLASS radio_driver;
|
||||
extern AutoDiscoverRTCClock rtc_clock;
|
||||
|
||||
#if HAS_GPS
|
||||
extern GPSStreamCounter gpsStream;
|
||||
extern EnvironmentSensorManager sensors;
|
||||
#else
|
||||
extern SensorManager sensors;
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
extern DISPLAY_CLASS display;
|
||||
extern MomentaryButton user_btn;
|
||||
#endif
|
||||
|
||||
bool radio_init();
|
||||
uint32_t radio_get_rng_seed();
|
||||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
|
||||
void radio_set_tx_power(uint8_t dbm);
|
||||
mesh::LocalIdentity radio_new_identity();
|
||||
void radio_reset_agc();
|
||||
@@ -0,0 +1,301 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// LilyGo T-Deck Pro MAX V0.1 - Pin Definitions
|
||||
// Hardware revision: HD-V3-250911
|
||||
//
|
||||
// KEY DIFFERENCES FROM T-Deck Pro V1.1:
|
||||
// - XL9555 I/O expander (0x20) controls peripheral power, resets, and switches
|
||||
// (LoRa EN, GPS EN, modem power, touch RST, keyboard RST, antenna sel, etc.)
|
||||
// - 4G (A7682E) and audio (ES8311) coexist on ONE board — no longer mutually exclusive
|
||||
// - ES8311 I2C codec replaces PCM5102A (needs I2C config, different I2S pins)
|
||||
// - E-ink RST moved: IO9 (was IO16)
|
||||
// - E-ink BL moved: IO41 (was IO45, now has working front-light hardware!)
|
||||
// - GPS UART moved: RX=IO2, TX=IO16 (was RX=IO44, TX=IO43)
|
||||
// - GPS/LoRa power via XL9555 (was direct GPIO 39/46)
|
||||
// - Touch RST via XL9555 IO07 (was GPIO 38)
|
||||
// - Modem power/PWRKEY via XL9555 (was direct GPIO 41/40)
|
||||
// - No PIN_PERF_POWERON (IO10 is now modem UART RX)
|
||||
// - Battery: 1500 mAh (was 1400 mAh)
|
||||
// - LoRa antenna switch (SKY13453) controlled by XL9555 IO04
|
||||
// - Audio output mux (A7682E vs ES8311) controlled by XL9555 IO12
|
||||
// - Speaker amplifier (NS4150B) enable via XL9555 IO06
|
||||
// =============================================================================
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// E-Ink Display (GDEQ031T10 - 240x320)
|
||||
// E-ink SHARES the SPI bus with LoRa and SD card (SCK=36, MOSI=33, MISO=47)
|
||||
// They use different chip selects: E-ink CS=34, LoRa CS=3, SD CS=48
|
||||
// -----------------------------------------------------------------------------
|
||||
#define PIN_EINK_CS 34
|
||||
#define PIN_EINK_DC 35
|
||||
#define PIN_EINK_RES 9 // MAX: IO9 (was IO16 on V1.1)
|
||||
#define PIN_EINK_BUSY 37
|
||||
#define PIN_EINK_SCLK 36 // Shared with LoRa + SD
|
||||
#define PIN_EINK_MOSI 33 // Shared with LoRa + SD
|
||||
#define PIN_EINK_BL 41 // MAX: IO41 — working front-light! (was IO45 non-functional on V1.1)
|
||||
|
||||
// Legacy aliases for MeshCore compatibility
|
||||
#define PIN_DISPLAY_CS PIN_EINK_CS
|
||||
#define PIN_DISPLAY_DC PIN_EINK_DC
|
||||
#define PIN_DISPLAY_RST PIN_EINK_RES
|
||||
#define PIN_DISPLAY_BUSY PIN_EINK_BUSY
|
||||
#define PIN_DISPLAY_SCLK PIN_EINK_SCLK
|
||||
#define PIN_DISPLAY_MOSI PIN_EINK_MOSI
|
||||
|
||||
// Display dimensions - native resolution of GDEQ031T10
|
||||
#define LCD_HOR_SIZE 240
|
||||
#define LCD_VER_SIZE 320
|
||||
|
||||
// E-ink model for GxEPD2
|
||||
#define EINK_DISPLAY_MODEL GxEPD2_310_GDEQ031T10
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// SPI Bus - Shared by LoRa, SD Card, AND E-ink display
|
||||
// -----------------------------------------------------------------------------
|
||||
#define BOARD_SPI_SCLK 36
|
||||
#define BOARD_SPI_MISO 47
|
||||
#define BOARD_SPI_MOSI 33
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// I2C Bus
|
||||
// -----------------------------------------------------------------------------
|
||||
#define I2C_SDA 13
|
||||
#define I2C_SCL 14
|
||||
|
||||
// Aliases for ESP32Board base class compatibility
|
||||
#define PIN_BOARD_SDA I2C_SDA
|
||||
#define PIN_BOARD_SCL I2C_SCL
|
||||
|
||||
// I2C Device Addresses
|
||||
#define I2C_ADDR_ES8311 0x18 // ES8311 audio codec (NEW on MAX)
|
||||
#define I2C_ADDR_TOUCH 0x1A // CST328
|
||||
#define I2C_ADDR_XL9555 0x20 // XL9555 I/O expander (NEW on MAX)
|
||||
#define I2C_ADDR_GYROSCOPE 0x28 // BHI260AP
|
||||
#define I2C_ADDR_KEYBOARD 0x34 // TCA8418
|
||||
#define I2C_ADDR_BQ27220 0x55 // Fuel gauge
|
||||
#define I2C_ADDR_DRV2605 0x5A // Motor driver (haptic)
|
||||
#define I2C_ADDR_BQ25896 0x6B // Charger
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// XL9555 I/O Expander — Pin Assignments
|
||||
//
|
||||
// The XL9555 replaces direct GPIO control of peripheral power enables,
|
||||
// resets, and switches. It must be initialised over I2C before LoRa, GPS,
|
||||
// modem, or touch can be used.
|
||||
//
|
||||
// Port 0: pins 0-7, registers 0x02 (output) / 0x06 (direction)
|
||||
// Port 1: pins 8-15, registers 0x03 (output) / 0x07 (direction)
|
||||
// Direction: 0 = output, 1 = input
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_XL9555 1
|
||||
|
||||
// XL9555 I2C registers
|
||||
#define XL9555_REG_INPUT_0 0x00
|
||||
#define XL9555_REG_INPUT_1 0x01
|
||||
#define XL9555_REG_OUTPUT_0 0x02
|
||||
#define XL9555_REG_OUTPUT_1 0x03
|
||||
#define XL9555_REG_INVERT_0 0x04
|
||||
#define XL9555_REG_INVERT_1 0x05
|
||||
#define XL9555_REG_CONFIG_0 0x06 // 0=output, 1=input
|
||||
#define XL9555_REG_CONFIG_1 0x07
|
||||
|
||||
// XL9555 pin assignments (0-7 = Port 0, 8-15 = Port 1)
|
||||
#define XL_PIN_6609_EN 0 // HIGH: Enable A7682E power supply (SGM6609 boost)
|
||||
#define XL_PIN_LORA_EN 1 // HIGH: Enable SX1262 power supply
|
||||
#define XL_PIN_GPS_EN 2 // HIGH: Enable GPS power supply
|
||||
#define XL_PIN_1V8_EN 3 // HIGH: Enable BHI260AP 1.8V power supply
|
||||
#define XL_PIN_LORA_SEL 4 // HIGH: internal antenna, LOW: external antenna (SKY13453)
|
||||
#define XL_PIN_MOTOR_EN 5 // HIGH: Enable DRV2605 power supply
|
||||
#define XL_PIN_AMPLIFIER 6 // HIGH: Enable NS4150B speaker power amplifier
|
||||
#define XL_PIN_TOUCH_RST 7 // LOW: Reset touch controller (active-low)
|
||||
#define XL_PIN_PWRKEY_EN 8 // HIGH: A7682E POWERKEY toggle
|
||||
#define XL_PIN_KEY_RST 9 // LOW: Reset keyboard (active-low)
|
||||
#define XL_PIN_AUDIO_SEL 10 // HIGH: A7682E audio out, LOW: ES8311 audio out
|
||||
// Pins 11-15 are reserved
|
||||
|
||||
// Default XL9555 output state at boot (all power enables ON, resets de-asserted)
|
||||
// Bit layout: [P07..P00] = TOUCH_RST=1, AMP=0, MOTOR_EN=0, LORA_SEL=1, 1V8=1, GPS=1, LORA=1, 6609=0
|
||||
// [P17..P10] = reserved=0, AUDIO_SEL=0, KEY_RST=1, PWRKEY=0
|
||||
//
|
||||
// Conservative boot defaults for Meck:
|
||||
// - LoRa ON, GPS ON, 1.8V ON, internal antenna
|
||||
// - Modem OFF (6609_EN LOW), PWRKEY LOW (toggled later if needed)
|
||||
// - Motor OFF, Amplifier OFF (saves power, enabled on demand)
|
||||
// - Touch RST HIGH (not resetting), Keyboard RST HIGH (not resetting)
|
||||
// - Audio select LOW (ES8311 by default — Meck controls this when needed)
|
||||
#define XL9555_BOOT_PORT0 0b10011110 // 0x9E: T_RST=1, AMP=0, MOT=0, LSEL=1, 1V8=1, GPS=1, LORA=1, 6609=0
|
||||
#define XL9555_BOOT_PORT1 0b00000010 // 0x02: ..., ASEL=0, KRST=1, PKEY=0
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Touch Controller (CST328)
|
||||
// NOTE: Touch RST is via XL9555 pin 7, NOT a direct GPIO!
|
||||
// CST328_PIN_RST is defined as -1 to signal "not a direct GPIO".
|
||||
// The board class handles touch reset via XL9555 in begin().
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_TOUCHSCREEN 1
|
||||
#define CST328_PIN_INT 12
|
||||
#define CST328_PIN_RST -1 // MAX: Routed through XL9555 IO07 — handled by board class
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// GPS
|
||||
// NOTE: GPS power enable is via XL9555 pin 2, NOT a direct GPIO!
|
||||
// PIN_GPS_EN is intentionally NOT defined — the board class handles it via XL9555.
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_GPS 1
|
||||
#define GPS_BAUDRATE 38400
|
||||
// #define PIN_GPS_EN — NOT a direct GPIO on MAX (XL9555 IO02)
|
||||
#define GPS_RX_PIN 2 // MAX: IO2 (was IO44 on V1.1) — ESP32 receives from GPS
|
||||
#define GPS_TX_PIN 16 // MAX: IO16 (was IO43 on V1.1) — ESP32 sends to GPS
|
||||
#define PIN_GPS_PPS 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Buttons & Controls
|
||||
// -----------------------------------------------------------------------------
|
||||
#define BUTTON_PIN 0
|
||||
#define PIN_USER_BTN 0
|
||||
|
||||
// Vibration Motor — DRV2605 driver (same as V1.1)
|
||||
// Motor power enable is via XL9555 pin 5, not a direct GPIO.
|
||||
#define HAS_DRV2605 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// SD Card
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_SDCARD
|
||||
#define SDCARD_USE_SPI1
|
||||
#define SPI_MOSI 33
|
||||
#define SPI_SCK 36
|
||||
#define SPI_MISO 47
|
||||
#define SPI_CS 48
|
||||
#define SDCARD_CS SPI_CS
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Keyboard (TCA8418)
|
||||
// NOTE: Keyboard RST is via XL9555 pin 9 (active-low).
|
||||
// The board class handles keyboard reset via XL9555 in begin().
|
||||
// -----------------------------------------------------------------------------
|
||||
#define KB_BL_PIN 42
|
||||
#define BOARD_KEYBOARD_INT 15
|
||||
#define HAS_PHYSICAL_KEYBOARD 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Audio — ES8311 I2C Codec (NEW on MAX — replaces PCM5102A)
|
||||
//
|
||||
// ES8311 is an I2C-controlled audio codec (unlike PCM5102A which needed no config).
|
||||
// It requires I2C register setup for input source, gain, volume, etc.
|
||||
// Speaker/headphone output is shared with A7682E modem audio, selected via
|
||||
// XL9555 pin AUDIO_SEL: LOW = ES8311, HIGH = A7682E.
|
||||
// Power amplifier (NS4150B) for speaker enabled via XL9555 pin AMPLIFIER.
|
||||
//
|
||||
// I2S pin mapping for ES8311 (completely different from V1.1 PCM5102A!):
|
||||
// MCLK = IO38 (master clock — ES8311 needs this, PCM5102A didn't)
|
||||
// SCLK = IO39 (bit clock, aka BCLK)
|
||||
// LRCK = IO18 (word select, aka LRC/WS)
|
||||
// DSDIN = IO17 (DAC serial data in — ESP32 sends audio TO codec)
|
||||
// ASDOUT= IO40 (ADC serial data out — codec sends mic audio TO ESP32)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_ES8311_AUDIO 1
|
||||
|
||||
#define BOARD_ES8311_MCLK 38
|
||||
#define BOARD_ES8311_SCLK 39
|
||||
#define BOARD_ES8311_LRCK 18
|
||||
#define BOARD_ES8311_DSDIN 17 // ESP32 → ES8311 (speaker/headphone output)
|
||||
#define BOARD_ES8311_ASDOUT 40 // ES8311 → ESP32 (microphone input)
|
||||
|
||||
// Compatibility aliases for ESP32-audioI2S library (setPinout expects BCLK, LRC, DOUT)
|
||||
#define BOARD_I2S_BCLK BOARD_ES8311_SCLK // IO39
|
||||
#define BOARD_I2S_LRC BOARD_ES8311_LRCK // IO18
|
||||
#define BOARD_I2S_DOUT BOARD_ES8311_DSDIN // IO17
|
||||
#define BOARD_I2S_MCLK BOARD_ES8311_MCLK // IO38 (ESP32-audioI2S may need setMCLK)
|
||||
|
||||
// Microphone — ES8311 built-in ADC (replaces separate PDM mic on V1.1)
|
||||
// Mic data comes through I2S ASDOUT pin, not a separate PDM interface.
|
||||
#define BOARD_MIC_I2S_DIN BOARD_ES8311_ASDOUT // IO40
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Sensors
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_BHI260AP // Gyroscope/IMU (1.8V power via XL9555 IO03)
|
||||
#define BOARD_GYRO_INT 21
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Power Management
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_BQ27220 1
|
||||
#define BQ27220_I2C_ADDR 0x55
|
||||
#define BQ27220_I2C_SDA I2C_SDA
|
||||
#define BQ27220_I2C_SCL I2C_SCL
|
||||
#define BQ27220_DESIGN_CAPACITY 1500 // MAX: 1500 mAh (was 1400 on V1.1)
|
||||
#define BQ27220_DESIGN_CAPACITY_MAH 1500 // Alias used by TDeckBoard.h
|
||||
|
||||
#define HAS_PPM 1
|
||||
#define XPOWERS_CHIP_BQ25896
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// LoRa Radio (SX1262)
|
||||
// NOTE: LoRa power enable is via XL9555 pin 1, NOT GPIO 46!
|
||||
// The board class enables LoRa power via XL9555 in begin().
|
||||
// P_LORA_EN is intentionally NOT defined here — handled by board class.
|
||||
// Antenna selection: XL9555 pin 4 (HIGH=internal, LOW=external via SKY13453).
|
||||
// -----------------------------------------------------------------------------
|
||||
#define USE_SX1262
|
||||
#define USE_SX1268
|
||||
|
||||
// LORA_EN is NOT a direct GPIO on MAX — omit the define entirely.
|
||||
// If any code references P_LORA_EN, it must be guarded with #ifndef HAS_XL9555.
|
||||
// #define LORA_EN — NOT DEFINED (was GPIO 46 on V1.1)
|
||||
|
||||
#define LORA_SCK 36
|
||||
#define LORA_MISO 47
|
||||
#define LORA_MOSI 33 // Shared with e-ink and SD card
|
||||
#define LORA_CS 3
|
||||
#define LORA_RESET 4
|
||||
#define LORA_DIO0 -1 // Not connected on SX1262
|
||||
#define LORA_DIO1 5 // SX1262 IRQ
|
||||
#define LORA_DIO2 6 // SX1262 BUSY
|
||||
|
||||
// SX126X driver aliases (Meshtastic compatibility)
|
||||
#define SX126X_CS LORA_CS
|
||||
#define SX126X_DIO1 LORA_DIO1
|
||||
#define SX126X_BUSY LORA_DIO2
|
||||
#define SX126X_RESET LORA_RESET
|
||||
|
||||
// RadioLib/MeshCore compatibility aliases
|
||||
#define P_LORA_NSS LORA_CS
|
||||
#define P_LORA_DIO_1 LORA_DIO1
|
||||
#define P_LORA_RESET LORA_RESET
|
||||
#define P_LORA_BUSY LORA_DIO2
|
||||
#define P_LORA_SCLK LORA_SCK
|
||||
#define P_LORA_MISO LORA_MISO
|
||||
#define P_LORA_MOSI LORA_MOSI
|
||||
// P_LORA_EN is NOT defined — LoRa power is via XL9555, handled in board begin()
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// 4G Modem — A7682E (ALWAYS PRESENT on MAX — no longer optional!)
|
||||
//
|
||||
// On V1.1, 4G and audio were mutually exclusive hardware configurations.
|
||||
// On MAX, both coexist. The XL9555 controls:
|
||||
// - 6609_EN (XL pin 0): modem power supply (SGM6609 boost converter)
|
||||
// - PWRKEY (XL pin 8): modem power key toggle
|
||||
// Audio output from modem vs ES8311 is selected by AUDIO_SEL (XL pin 10).
|
||||
//
|
||||
// MODEM_POWER_EN and MODEM_PWRKEY are NOT direct GPIOs — ModemManager
|
||||
// needs MAX-aware paths (see integration guide).
|
||||
// MODEM_RST does not exist on MAX (IO9 is now LCD_RST).
|
||||
// -----------------------------------------------------------------------------
|
||||
// Direct GPIO modem pins (still accessible as regular GPIO):
|
||||
#define MODEM_RI 7 // Ring indicator (interrupt input)
|
||||
#define MODEM_DTR 8 // Data terminal ready (output)
|
||||
#define MODEM_RX 10 // UART RX (ESP32 receives from modem)
|
||||
#define MODEM_TX 11 // UART TX (ESP32 sends to modem)
|
||||
|
||||
// XL9555-routed modem pins — these are NOT direct GPIO!
|
||||
// MODEM_POWER_EN and MODEM_PWRKEY are intentionally NOT defined.
|
||||
// Existing code guarded by #ifdef MODEM_POWER_EN / #ifdef HAS_4G_MODEM will
|
||||
// be skipped. Use board.modemPowerOn()/modemPwrkeyPulse() instead.
|
||||
// MODEM_RST does not exist on MAX (IO9 is LCD_RST).
|
||||
|
||||
// Compatibility: PIN_PERF_POWERON does not exist on MAX (IO10 is modem UART RX).
|
||||
// Defined as -1 so TDeckBoard.cpp compiles (parent class), but never used at runtime.
|
||||
#define PIN_PERF_POWERON -1
|
||||
@@ -0,0 +1,169 @@
|
||||
// =============================================================================
|
||||
// TechoCardBoard — Implementation for LilyGo T-Echo Card
|
||||
// =============================================================================
|
||||
|
||||
#include "TechoCardBoard.h"
|
||||
#include "variant.h"
|
||||
|
||||
// nRF52840 SAADC includes
|
||||
#include "nrf.h"
|
||||
|
||||
void TechoCardBoard::begin() {
|
||||
NRF52BoardDCDC::begin();
|
||||
|
||||
// Configure battery ADC pin as analog input
|
||||
pinMode(PIN_VBAT_READ, INPUT);
|
||||
|
||||
// Configure button(s)
|
||||
pinMode(PIN_BUTTON_A, INPUT_PULLUP);
|
||||
pinMode(PIN_BUTTON_BOOT, INPUT_PULLUP);
|
||||
|
||||
// Buzzer off
|
||||
#if defined(HAS_BUZZER) && PIN_BUZZER >= 0
|
||||
pinMode(PIN_BUZZER, OUTPUT);
|
||||
digitalWrite(PIN_BUZZER, LOW);
|
||||
#endif
|
||||
|
||||
// RGB LED off at boot
|
||||
#if defined(HAS_RGB_LED)
|
||||
ledOff();
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Battery voltage reading via nRF52840 SAADC
|
||||
//
|
||||
// The T-Echo Card has a voltage divider on AIN0 (P0.02).
|
||||
// nRF52840 SAADC: 12-bit, internal 0.6V reference, configurable gain.
|
||||
// With 1/6 gain: input range 0–3.6V. Multiply by divider ratio (ADC_MULTIPLIER).
|
||||
//
|
||||
// NOTE: The T-Echo Lite has a known issue reading 100% / 6.00V constantly.
|
||||
// This is likely caused by incorrect SAADC configuration (wrong gain, wrong
|
||||
// reference, or the pin being pulled high by the charging circuit).
|
||||
// We use explicit SAADC register programming to avoid that issue.
|
||||
// -----------------------------------------------------------------------------
|
||||
float TechoCardBoard::getBatteryVoltage() {
|
||||
uint32_t now = millis();
|
||||
|
||||
// Cache battery reading — only read every 10 seconds
|
||||
if (_cached_battery_mv > 0 && (now - _last_battery_read) < 10000) {
|
||||
return _cached_battery_mv;
|
||||
}
|
||||
|
||||
// Configure SAADC for single-shot reading
|
||||
NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit;
|
||||
|
||||
// Channel 0: AIN0 (P0.02), 1/6 gain, internal 0.6V reference
|
||||
// Effective range: 0 – 3.6V
|
||||
NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput0; // AIN0
|
||||
NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELN_PSELN_NC; // Single-ended
|
||||
NRF_SAADC->CH[0].CONFIG =
|
||||
(SAADC_CH_CONFIG_GAIN_Gain1_6 << SAADC_CH_CONFIG_GAIN_Pos) |
|
||||
(SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) |
|
||||
(SAADC_CH_CONFIG_TACQ_40us << SAADC_CH_CONFIG_TACQ_Pos) |
|
||||
(SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) |
|
||||
(SAADC_CH_CONFIG_BURST_Disabled << SAADC_CH_CONFIG_BURST_Pos) |
|
||||
(SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) |
|
||||
(SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos);
|
||||
|
||||
// Set up result buffer
|
||||
volatile int16_t result = 0;
|
||||
NRF_SAADC->RESULT.PTR = (uint32_t)&result;
|
||||
NRF_SAADC->RESULT.MAXCNT = 1;
|
||||
|
||||
// Enable, calibrate on first use
|
||||
NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled;
|
||||
|
||||
// Start and wait for sample
|
||||
NRF_SAADC->EVENTS_END = 0;
|
||||
NRF_SAADC->TASKS_START = 1;
|
||||
while (!NRF_SAADC->EVENTS_STARTED);
|
||||
NRF_SAADC->EVENTS_STARTED = 0;
|
||||
|
||||
NRF_SAADC->TASKS_SAMPLE = 1;
|
||||
while (!NRF_SAADC->EVENTS_END);
|
||||
NRF_SAADC->EVENTS_END = 0;
|
||||
|
||||
NRF_SAADC->TASKS_STOP = 1;
|
||||
while (!NRF_SAADC->EVENTS_STOPPED);
|
||||
NRF_SAADC->EVENTS_STOPPED = 0;
|
||||
|
||||
// Disable SAADC to save power
|
||||
NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Disabled;
|
||||
|
||||
// Convert: voltage = (result / 4096) * 3.6V * ADC_MULTIPLIER * 1000 (mV)
|
||||
if (result < 0) result = 0;
|
||||
float voltage_mv = ((float)result / 4096.0f) * 3600.0f * _adc_multiplier;
|
||||
|
||||
_cached_battery_mv = voltage_mv;
|
||||
_last_battery_read = now;
|
||||
|
||||
return voltage_mv;
|
||||
}
|
||||
|
||||
uint8_t TechoCardBoard::getBatteryPercent() {
|
||||
float mv = getBatteryVoltage();
|
||||
if (mv <= 0) return 0;
|
||||
|
||||
// Simple linear approximation for single-cell LiPo
|
||||
// 3200 mV = 0%, 4200 mV = 100%
|
||||
if (mv >= 4200.0f) return 100;
|
||||
if (mv <= 3200.0f) return 0;
|
||||
return (uint8_t)(((mv - 3200.0f) / 1000.0f) * 100.0f);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// GPS power control
|
||||
// -----------------------------------------------------------------------------
|
||||
void TechoCardBoard::enableGPS(bool enable) {
|
||||
#if defined(HAS_GPS) && PIN_GPS_EN >= 0
|
||||
digitalWrite(PIN_GPS_EN, enable ? HIGH : LOW);
|
||||
#endif
|
||||
#if defined(HAS_GPS) && PIN_GPS_RF_EN >= 0
|
||||
digitalWrite(PIN_GPS_RF_EN, enable ? HIGH : LOW);
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Speaker power control
|
||||
// -----------------------------------------------------------------------------
|
||||
void TechoCardBoard::enableSpeaker(bool enable) {
|
||||
#if defined(HAS_SPEAKER)
|
||||
digitalWrite(PIN_SPK_EN, enable ? HIGH : LOW);
|
||||
#if PIN_SPK_EN2 >= 0
|
||||
digitalWrite(PIN_SPK_EN2, enable ? HIGH : LOW);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// RGB LED — WS2812 via NeoPixel protocol
|
||||
// Simple bit-bang implementation for nRF52840 at 64MHz
|
||||
// -----------------------------------------------------------------------------
|
||||
void TechoCardBoard::setLED(uint8_t r, uint8_t g, uint8_t b) {
|
||||
#if defined(HAS_RGB_LED)
|
||||
// TODO: Implement WS2812 bit-bang or use Adafruit_NeoPixel library
|
||||
// For initial bringup, just use the Adafruit_NeoPixel library
|
||||
// which is available in the Adafruit nRF52 Arduino core
|
||||
(void)r; (void)g; (void)b;
|
||||
#endif
|
||||
}
|
||||
|
||||
void TechoCardBoard::ledOff() {
|
||||
setLED(0, 0, 0);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Buzzer — PWM tone generation
|
||||
// -----------------------------------------------------------------------------
|
||||
void TechoCardBoard::buzz(uint16_t freq_hz, uint16_t duration_ms) {
|
||||
#if defined(HAS_BUZZER) && PIN_BUZZER >= 0
|
||||
if (freq_hz == 0 || duration_ms == 0) {
|
||||
noTone(PIN_BUZZER);
|
||||
return;
|
||||
}
|
||||
tone(PIN_BUZZER, freq_hz, duration_ms);
|
||||
#else
|
||||
(void)freq_hz; (void)duration_ms;
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// TechoCardBoard — Board class for LilyGo T-Echo Card
|
||||
//
|
||||
// Extends NRF52BoardDCDC with:
|
||||
// - Battery ADC (AIN0, P0.02) with solar charging via BQ25896
|
||||
// - GPS power control (L76K)
|
||||
// - Speaker/mic enable
|
||||
// - RGB LED control
|
||||
// - Buzzer
|
||||
// - NFC NDEF contact sharing
|
||||
// =============================================================================
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <helpers/NRF52Board.h>
|
||||
#include "variant.h"
|
||||
|
||||
#ifdef NRF52_POWER_MANAGEMENT
|
||||
// Power management config for T-Echo Card
|
||||
// AIN0 (P0.02) for battery voltage sensing
|
||||
// REFSEL=4 → 5/8 VDD ≈ 2.0625V threshold (with 2:1 divider → ~4.125V cell)
|
||||
static const PowerMgtConfig TECHO_CARD_POWER_CONFIG = {
|
||||
.lpcomp_ain_channel = BATTERY_ADC_AIN, // AIN0
|
||||
.lpcomp_refsel = 4, // 5/8 VDD
|
||||
.voltage_bootlock = 3100, // Don't boot below 3.1V
|
||||
};
|
||||
#endif
|
||||
|
||||
class TechoCardBoard : public NRF52BoardDCDC {
|
||||
private:
|
||||
float _adc_multiplier;
|
||||
uint32_t _last_battery_read;
|
||||
float _cached_battery_mv;
|
||||
|
||||
public:
|
||||
TechoCardBoard()
|
||||
: _adc_multiplier(ADC_MULTIPLIER),
|
||||
_last_battery_read(0),
|
||||
_cached_battery_mv(0) {}
|
||||
|
||||
void begin() override;
|
||||
|
||||
// Battery
|
||||
float getBatteryVoltage() override;
|
||||
uint8_t getBatteryPercent() override;
|
||||
float getAdcMultiplier() override { return _adc_multiplier; }
|
||||
void setAdcMultiplier(float mult) { _adc_multiplier = mult; }
|
||||
|
||||
// GPS power control
|
||||
void enableGPS(bool enable);
|
||||
|
||||
// Speaker power control
|
||||
void enableSpeaker(bool enable);
|
||||
|
||||
// RGB LED
|
||||
void setLED(uint8_t r, uint8_t g, uint8_t b);
|
||||
void ledOff();
|
||||
|
||||
// Buzzer
|
||||
void buzz(uint16_t freq_hz, uint16_t duration_ms);
|
||||
|
||||
#ifdef NRF52_POWER_MANAGEMENT
|
||||
const PowerMgtConfig* getPowerConfig() const override {
|
||||
return &TECHO_CARD_POWER_CONFIG;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
@@ -0,0 +1,60 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// Arduino pin compatibility header for LilyGo T-Echo Card
|
||||
//
|
||||
// This file provides Arduino-standard pin name aliases for the nRF52840 GPIOs.
|
||||
// Only needed if creating a custom board variant inside the Adafruit nRF52
|
||||
// Arduino framework package. If using build flag overrides in platformio.ini,
|
||||
// this file is optional.
|
||||
// =============================================================================
|
||||
|
||||
// On nRF52840, Arduino digital pin numbers map 1:1 to nRF GPIO numbers
|
||||
// (0–47 for port 0 and port 1).
|
||||
|
||||
// LED
|
||||
#define LED_BUILTIN PIN_LED1
|
||||
#define PIN_LED1 39 // WS2812 RGB LED data (1, 7)
|
||||
#define LED_STATE_ON 1
|
||||
|
||||
// Buttons
|
||||
#define PIN_BUTTON1 42 // Button A — orange front button (1, 10)
|
||||
#define PIN_BUTTON2 24 // Boot button (0, 24)
|
||||
|
||||
// Serial (USB CDC)
|
||||
// nRF52840 native USB — no UART pin assignment needed for Serial
|
||||
// Serial1 is used for GPS
|
||||
#define PIN_SERIAL1_RX 21 // GPS TX → nRF RX (0, 21)
|
||||
#define PIN_SERIAL1_TX 19 // nRF TX → GPS RX (0, 19)
|
||||
|
||||
// I2C
|
||||
#define PIN_WIRE_SDA 36 // (1, 4)
|
||||
#define PIN_WIRE_SCL 34 // (1, 2)
|
||||
|
||||
// SPI (LoRa — directly mapped, RadioLib handles pin control)
|
||||
#define PIN_SPI_MISO 17 // (0, 17)
|
||||
#define PIN_SPI_MOSI 15 // (0, 15)
|
||||
#define PIN_SPI_SCK 13 // (0, 13)
|
||||
|
||||
// Analog
|
||||
#define PIN_A0 2 // (0, 2) — Battery ADC / AIN0
|
||||
|
||||
// QSPI Flash (ZD25WQ32CEIGR 4MB)
|
||||
// nRF52840 QSPI uses fixed pins — framework handles these
|
||||
// #define PIN_QSPI_SCK 19 // Conflict with GPS TX — check if QSPI is on different pins
|
||||
// NOTE: QSPI pin mapping needs verification on actual hardware.
|
||||
// The T-Echo Card may use SPI (not QSPI) for external flash.
|
||||
|
||||
// NFC (dedicated nRF52840 NFC pins — not GPIO-assignable)
|
||||
// NFC1 = P0.09, NFC2 = P0.10
|
||||
// These are only usable as NFC when NFC is enabled in UICR.
|
||||
// If NFC is disabled, they become GPIO9 and GPIO10.
|
||||
|
||||
// PDM Microphone
|
||||
#define PIN_PDM_CLK 35 // (1, 3)
|
||||
#define PIN_PDM_DIN 37 // (1, 5)
|
||||
|
||||
// I2S Speaker (MAX98357)
|
||||
#define PIN_I2S_SCK 16 // BCLK (0, 16)
|
||||
#define PIN_I2S_LRCK 22 // LRCK / WS (0, 22)
|
||||
#define PIN_I2S_SDOUT 20 // DATA (0, 20)
|
||||
@@ -0,0 +1,106 @@
|
||||
; =============================================================================
|
||||
; LilyGo T-Echo Card — Meck variant configuration
|
||||
;
|
||||
; nRF52840 + SX1262 (HPB16B3) + SSD1315 OLED (72×40) + L76K GPS
|
||||
; + MAX98357 Speaker + MP34DT05 PDM Mic + ICM20948 IMU + Solar + NFC
|
||||
;
|
||||
; Platform: nRF52 (Adafruit nRF52 Arduino)
|
||||
; =============================================================================
|
||||
|
||||
; --- Base configuration for all T-Echo Card builds ---
|
||||
[lilygo_techo_card]
|
||||
extends = nrf52_base
|
||||
platform = https://github.com/maxgerhardt/platform-nordicnrf52.git
|
||||
board = lilygo_techo_card
|
||||
board_check = false
|
||||
extra_scripts =
|
||||
create-uf2.py
|
||||
build_flags = ${nrf52_base.build_flags}
|
||||
-I variants/lilygo_techo_card
|
||||
-D LILYGO_TECHO_CARD
|
||||
-D NRF52_POWER_MANAGEMENT
|
||||
; I2C
|
||||
-D PIN_BOARD_SDA=36
|
||||
-D PIN_BOARD_SCL=34
|
||||
; LoRa SX1262 (HPB16B3 module)
|
||||
-D RADIO_CLASS=CustomSX1262
|
||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
||||
-D P_LORA_NSS=11
|
||||
-D P_LORA_DIO_1=40
|
||||
-D P_LORA_RESET=7
|
||||
-D P_LORA_BUSY=14
|
||||
-D P_LORA_SCLK=13
|
||||
-D P_LORA_MISO=17
|
||||
-D P_LORA_MOSI=15
|
||||
-D LORA_TX_POWER=22
|
||||
-D SX126X_CURRENT_LIMIT=140
|
||||
-D SX126X_RX_BOOSTED_GAIN=1
|
||||
-D SX126X_DIO2_AS_RF_SWITCH=1
|
||||
; Display — SSD1315 OLED (72×40, I2C, SSD1306-compatible)
|
||||
-D DISPLAY_CLASS=SSD1306Display
|
||||
-D PIN_OLED_RESET=-1
|
||||
; GPS — L76K
|
||||
-D HAS_GPS=1
|
||||
-D PIN_GPS_TX=19
|
||||
-D PIN_GPS_RX=21
|
||||
-D PIN_GPS_EN=47
|
||||
-D GPS_BAUDRATE=9600
|
||||
-D ENV_INCLUDE_GPS=1
|
||||
; Battery ADC
|
||||
-D PIN_VBAT_READ=2
|
||||
; User button
|
||||
-D PIN_USER_BTN=42
|
||||
; Board class
|
||||
-D BOARD_CLASS=TechoCardBoard
|
||||
build_src_filter = ${nrf52_base.build_src_filter}
|
||||
+<../variants/lilygo_techo_card/*.cpp>
|
||||
lib_deps = ${nrf52_base.lib_deps}
|
||||
olikraus/U8g2 @ ^2.35.19
|
||||
stevemarple/MicroNMEA @ ^2.0.6
|
||||
|
||||
; =============================================================================
|
||||
; Build Environments
|
||||
; =============================================================================
|
||||
|
||||
; --- BLE Companion Radio ---
|
||||
; Pairs with MeshCore companion app (Android/iOS/Web) over Bluetooth.
|
||||
; Includes GPS for location and time sync.
|
||||
[env:meck_techo_card_companion_radio_ble]
|
||||
extends = lilygo_techo_card
|
||||
build_flags = ${lilygo_techo_card.build_flags}
|
||||
-D FIRMWARE_NAME='"Meck T-Echo Card BLE"'
|
||||
; Debug (disable for release)
|
||||
; -D MESH_DEBUG
|
||||
; -D BLE_DEBUG_LOGGING
|
||||
build_src_filter = ${lilygo_techo_card.build_src_filter}
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
|
||||
; --- Repeater ---
|
||||
; Standalone LoRa repeater node. GPS for position adverts.
|
||||
; OLED shows status. Solar + 800mAh battery for outdoor deployment.
|
||||
[env:meck_techo_card_repeater]
|
||||
extends = lilygo_techo_card
|
||||
build_flags = ${lilygo_techo_card.build_flags}
|
||||
-D FIRMWARE_NAME='"Meck T-Echo Card Repeater"'
|
||||
; -D MESH_DEBUG
|
||||
build_src_filter = ${lilygo_techo_card.build_src_filter}
|
||||
+<../examples/simple_repeater/*.cpp>
|
||||
|
||||
; --- Room Server ---
|
||||
; BBS-style message board node.
|
||||
[env:meck_techo_card_room_server]
|
||||
extends = lilygo_techo_card
|
||||
build_flags = ${lilygo_techo_card.build_flags}
|
||||
-D FIRMWARE_NAME='"Meck T-Echo Card Room"'
|
||||
build_src_filter = ${lilygo_techo_card.build_src_filter}
|
||||
+<../examples/simple_room_server/*.cpp>
|
||||
|
||||
; --- Sensor Node ---
|
||||
; Telemetry node with GPS position reporting.
|
||||
; IMU data (ICM20948) can be added as a custom sensor source.
|
||||
[env:meck_techo_card_sensor]
|
||||
extends = lilygo_techo_card
|
||||
build_flags = ${lilygo_techo_card.build_flags}
|
||||
-D FIRMWARE_NAME='"Meck T-Echo Card Sensor"'
|
||||
build_src_filter = ${lilygo_techo_card.build_src_filter}
|
||||
+<../examples/simple_sensor/*.cpp>
|
||||
@@ -0,0 +1,95 @@
|
||||
// =============================================================================
|
||||
// MeshCore target implementation for LilyGo T-Echo Card
|
||||
//
|
||||
// nRF52840 + SX1262 (HPB16B3 module) + SSD1315 OLED + L76K GPS
|
||||
// =============================================================================
|
||||
|
||||
#include "target.h"
|
||||
#include "variant.h"
|
||||
|
||||
// --- SPI for LoRa radio (software SPI on nRF52) ---
|
||||
// The HPB16B3 SX1262 module uses dedicated SPI pins, not shared with anything else.
|
||||
// RadioLib Module handles the SPI internally when given pin numbers.
|
||||
static Module radio_module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
|
||||
|
||||
// --- Radio driver ---
|
||||
RADIO_CLASS radio_driver(&radio_module);
|
||||
WRAPPER_CLASS radio_wrapper(radio_driver);
|
||||
|
||||
// --- Board ---
|
||||
TechoCardBoard board;
|
||||
|
||||
// --- Display (SSD1306-compatible, SSD1315 at 0x3C, 72x40) ---
|
||||
#ifdef DISPLAY_CLASS
|
||||
DISPLAY_CLASS display(OLED_WIDTH, OLED_HEIGHT);
|
||||
#endif
|
||||
|
||||
// --- MeshCore stores ---
|
||||
mesh::IdentityStore identity_store;
|
||||
mesh::NodePrefs node_prefs;
|
||||
mesh::DataStore data_store;
|
||||
|
||||
// --- Sensor manager ---
|
||||
#if defined(ENV_INCLUDE_GPS) && ENV_INCLUDE_GPS
|
||||
#include <helpers/sensors/MicroNMEALocationProvider.h>
|
||||
static MicroNMEALocationProvider gps_provider(Serial1);
|
||||
EnvironmentSensorManager sensor_manager(gps_provider);
|
||||
#else
|
||||
EnvironmentSensorManager sensor_manager;
|
||||
#endif
|
||||
|
||||
// --- Target initialization ---
|
||||
void target_setup() {
|
||||
// Enable OLED power
|
||||
#if PIN_OLED_EN >= 0
|
||||
pinMode(PIN_OLED_EN, OUTPUT);
|
||||
digitalWrite(PIN_OLED_EN, HIGH);
|
||||
delay(10);
|
||||
#endif
|
||||
|
||||
// Enable GPS power
|
||||
#if defined(HAS_GPS) && PIN_GPS_EN >= 0
|
||||
pinMode(PIN_GPS_EN, OUTPUT);
|
||||
digitalWrite(PIN_GPS_EN, HIGH);
|
||||
delay(10);
|
||||
#endif
|
||||
|
||||
// GPS RF/LNA enable
|
||||
#if defined(HAS_GPS) && PIN_GPS_RF_EN >= 0
|
||||
pinMode(PIN_GPS_RF_EN, OUTPUT);
|
||||
digitalWrite(PIN_GPS_RF_EN, HIGH);
|
||||
#endif
|
||||
|
||||
// Initialize GPS UART
|
||||
#if defined(HAS_GPS)
|
||||
Serial1.setPins(PIN_GPS_RX, PIN_GPS_TX);
|
||||
Serial1.begin(GPS_BAUDRATE);
|
||||
#endif
|
||||
|
||||
// Speaker off by default (save power)
|
||||
#if defined(HAS_SPEAKER)
|
||||
pinMode(PIN_SPK_EN, OUTPUT);
|
||||
digitalWrite(PIN_SPK_EN, LOW);
|
||||
#if PIN_SPK_EN2 >= 0
|
||||
pinMode(PIN_SPK_EN2, OUTPUT);
|
||||
digitalWrite(PIN_SPK_EN2, LOW);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Initialize I2C
|
||||
Wire.setPins(I2C_SDA, I2C_SCL);
|
||||
Wire.begin();
|
||||
Wire.setClock(400000);
|
||||
|
||||
// Initialize display
|
||||
#ifdef DISPLAY_CLASS
|
||||
display.begin(OLED_I2C_ADDR);
|
||||
#endif
|
||||
|
||||
// Board-level init
|
||||
board.begin();
|
||||
|
||||
// Initialize LoRa radio
|
||||
// SX1262 DIO2 as RF switch control (common for HPB16B3 modules)
|
||||
radio_driver.setDio2AsRfSwitch(true);
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// MeshCore target declarations for LilyGo T-Echo Card
|
||||
// =============================================================================
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <RadioLib.h>
|
||||
#include <helpers/ArduinoHelpers.h>
|
||||
#include <helpers/RadioLibWrappers.h>
|
||||
#include <helpers/NRF52Board.h>
|
||||
#include <helpers/CustomSX1262Wrapper.h>
|
||||
#include <helpers/IdentityStore.h>
|
||||
#include <helpers/NodePrefs.h>
|
||||
#include <helpers/DataStore.h>
|
||||
#include <helpers/SensorManager.h>
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
#include <helpers/ui/DisplaySSD1306.h>
|
||||
#endif
|
||||
|
||||
#include "TechoCardBoard.h"
|
||||
|
||||
// Hardware object declarations (instantiated in target.cpp)
|
||||
extern RADIO_CLASS radio_driver;
|
||||
extern WRAPPER_CLASS radio_wrapper;
|
||||
extern TechoCardBoard board;
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
extern DISPLAY_CLASS display;
|
||||
#endif
|
||||
|
||||
extern mesh::IdentityStore identity_store;
|
||||
extern mesh::NodePrefs node_prefs;
|
||||
extern mesh::DataStore data_store;
|
||||
extern EnvironmentSensorManager sensor_manager;
|
||||
|
||||
// Target initialization
|
||||
void target_setup();
|
||||
@@ -0,0 +1,193 @@
|
||||
#pragma once
|
||||
|
||||
// =============================================================================
|
||||
// LilyGo T-Echo Card — Pin Definitions for Meck Firmware
|
||||
//
|
||||
// nRF52840 + SX1262 + SSD1315 (72×40 OLED) + L76K GPS + MAX98357 Speaker
|
||||
// + MP34DT05 PDM Microphone + ICM20948 IMU + BQ25896 Charger + Solar
|
||||
//
|
||||
// Pin notation from LilyGo pinmap: (port, pin) → nRF GPIO = port*32 + pin
|
||||
// =============================================================================
|
||||
|
||||
#define LILYGO_TECHO_CARD
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// I2C Bus (shared: OLED, IMU ICM20948, fuel gauge BQ27220 if present)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define I2C_SDA 36 // (1, 4)
|
||||
#define I2C_SCL 34 // (1, 2)
|
||||
#define PIN_BOARD_SDA I2C_SDA
|
||||
#define PIN_BOARD_SCL I2C_SCL
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// SX1262 LoRa Radio (SPI bit-bang on nRF52)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define P_LORA_NSS 11 // (0, 11) — CS
|
||||
#define P_LORA_RESET 7 // (0, 7) — RST
|
||||
#define P_LORA_SCLK 13 // (0, 13) — SCK
|
||||
#define P_LORA_MOSI 15 // (0, 15) — MOSI
|
||||
#define P_LORA_MISO 17 // (0, 17) — MISO
|
||||
#define P_LORA_BUSY 14 // (0, 14) — BUSY
|
||||
#define P_LORA_DIO_1 40 // (1, 8) — DIO1 / interrupt
|
||||
|
||||
// RF switch control (HPB16B3 module)
|
||||
#define LORA_DIO2 5 // (0, 5) — DIO2 (TXCO / RF switch)
|
||||
#define LORA_RF_VC1 27 // (0, 27) — RF_VC1
|
||||
#define LORA_RF_VC2 33 // (1, 1) — RF_VC2
|
||||
|
||||
// LoRa radio power enable (from schematic: LORA_EN drives RT9080 for LORA_VDD)
|
||||
// NOTE: Confirm actual GPIO — pinmap shows dedicated enable pin
|
||||
// For now use -1 if always powered
|
||||
#define PIN_LORA_EN -1
|
||||
|
||||
// Default radio settings (Australia)
|
||||
#ifndef LORA_TX_POWER
|
||||
#define LORA_TX_POWER 22
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// 0.42" OLED Display — SSD1315 (SSD1306-compatible), 72×40, I2C
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_OLED 1
|
||||
#define OLED_I2C_ADDR 0x3C
|
||||
#define OLED_WIDTH 72
|
||||
#define OLED_HEIGHT 40
|
||||
#define OLED_SDA I2C_SDA
|
||||
#define OLED_SCL I2C_SCL
|
||||
|
||||
// OLED power control via RT9080 enable pin
|
||||
#define PIN_OLED_EN 30 // (0, 30) — RT9080_EN
|
||||
|
||||
// No hardware reset pin for OLED on T-Echo Card
|
||||
#define PIN_OLED_RESET -1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// GPS — L76K Multi-GNSS (GPS, GLONASS, BeiDou, QZSS)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_GPS 1
|
||||
#define GPS_BAUDRATE 9600
|
||||
#define PIN_GPS_TX 19 // (0, 19) — nRF TX → GPS RX
|
||||
#define PIN_GPS_RX 21 // (0, 21) — nRF RX ← GPS TX
|
||||
#define PIN_GPS_EN 47 // (1, 15) — GPS power enable
|
||||
#define PIN_GPS_WAKEUP 25 // (0, 25) — GPS wakeup
|
||||
#define PIN_GPS_1PPS 23 // (0, 23) — 1PPS time pulse
|
||||
#define PIN_GPS_RF_EN 29 // (0, 29) — GPS RF / LNA enable
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Battery & Power
|
||||
// -----------------------------------------------------------------------------
|
||||
#define PIN_VBAT_READ 2 // (0, 2) = AIN0 — battery voltage ADC
|
||||
#define BATTERY_ADC_AIN 0 // nRF SAADC AIN channel number
|
||||
#define BATTERY_CAPACITY_MAH 800
|
||||
|
||||
// Battery voltage divider calibration
|
||||
// The T-Echo Lite has issues reading battery correctly — we'll need to
|
||||
// calibrate this with actual hardware. Starting with a reasonable default.
|
||||
// nRF52840 SAADC: 0.6V internal ref, 1/6 gain → 0–3.6V range
|
||||
// If there's a voltage divider (e.g. 2:1), multiply by 2.
|
||||
// Adjust ADC_MULTIPLIER after measuring real voltage vs ADC reading.
|
||||
#ifndef ADC_MULTIPLIER
|
||||
#define ADC_MULTIPLIER 2.0f
|
||||
#endif
|
||||
|
||||
// BQ25896 charger is on I2C but managed by hardware — no software control needed
|
||||
// Solar panel input: 0.25W 5V via VBUS
|
||||
|
||||
// Auto-shutdown threshold (millivolts)
|
||||
#define AUTO_SHUTDOWN_MILLIVOLTS 3200
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Speaker — MAX98357 I2S Class-D Mono Amp (8Ω, 1W)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_SPEAKER 1
|
||||
#define PIN_SPK_EN 43 // (1, 11) — speaker amplifier enable
|
||||
#define PIN_SPK_EN2 3 // (0, 3) — secondary enable
|
||||
#define PIN_SPK_BCLK 16 // (0, 16) — I2S bit clock
|
||||
#define PIN_SPK_DATA 20 // (0, 20) — I2S data out
|
||||
#define PIN_SPK_LRCK 22 // (0, 22) — I2S word select / LRCK
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Microphone — MP34DT05 Digital MEMS PDM
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_MICROPHONE 1
|
||||
#define PIN_MIC_CLK 35 // (1, 3) — PDM clock
|
||||
#define PIN_MIC_DATA 37 // (1, 5) — PDM data
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Buttons
|
||||
// -----------------------------------------------------------------------------
|
||||
#define PIN_BUTTON_A 42 // (1, 10) — orange button (front, main user button)
|
||||
#define PIN_BUTTON_BOOT 24 // (0, 24) — boot button (nRF52840 BOOT)
|
||||
#define PIN_USER_BTN PIN_BUTTON_A
|
||||
|
||||
// Button_B is RESET — hardware only, no GPIO
|
||||
|
||||
// Active LOW for nRF52 buttons (internal pull-up, press = LOW)
|
||||
#define BUTTON_ACTIVE_LOW 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Buzzer
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_BUZZER 1
|
||||
#define PIN_BUZZER 38 // (1, 6) — piezo buzzer data / PWM
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// WS2812 RGB LED (3 LEDs in series)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_RGB_LED 1
|
||||
#define PIN_RGB_LED_1 39 // (1, 7) — WS2812 data 1
|
||||
#define PIN_RGB_LED_2 44 // (1, 12) — WS2812 data 2
|
||||
#define PIN_RGB_LED_3 28 // (0, 28) — WS2812 data 3
|
||||
// Typically only one data pin drives the chain; confirm wiring on hardware
|
||||
#define PIN_NEOPIXEL PIN_RGB_LED_1
|
||||
#define NUM_NEOPIXELS 3
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// IMU — ICM20948 9-axis MotionTracking (accelerometer + gyro + compass)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_IMU 1
|
||||
#define IMU_I2C_ADDR 0x68
|
||||
#define IMU_SDA I2C_SDA
|
||||
#define IMU_SCL I2C_SCL
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// NFC — nRF52840 NFC-A (Type 2 Tag)
|
||||
// NFC uses dedicated NFC1/NFC2 pins on nRF52840 (P0.09 / P0.10)
|
||||
// These are fixed by silicon — no GPIO config needed.
|
||||
// NFC is handled by the nRF52 SDK nfc_t2t_lib.
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_NFC 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// External Flash — ZD25WQ32CEIGR (4MB SPI Flash)
|
||||
// Uses QSPI interface on nRF52840
|
||||
// Pin mapping from nRF52840 QSPI peripheral (typically fixed)
|
||||
// -----------------------------------------------------------------------------
|
||||
#define HAS_EXT_FLASH 1
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// No SD Card on T-Echo Card (unlike T-Echo which has e-paper + no SD either)
|
||||
// Settings stored in LittleFS on internal/external flash
|
||||
// -----------------------------------------------------------------------------
|
||||
// #define HAS_SDCARD
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// No dedicated RTC chip — time from GPS or BLE companion sync
|
||||
// nRF52840 has a 32.768 kHz RTC peripheral for timekeeping while running
|
||||
// -----------------------------------------------------------------------------
|
||||
// #define HAS_PCF85063_RTC
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Misc / Compatibility
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// No e-ink display
|
||||
// #define HAS_EINK
|
||||
|
||||
// This board has no physical keyboard
|
||||
// #define HAS_PHYSICAL_KEYBOARD
|
||||
|
||||
// Fallback for code that references GPS_BAUDRATE without HAS_GPS guard
|
||||
#ifndef GPS_BAUDRATE
|
||||
#define GPS_BAUDRATE 9600
|
||||
#endif
|
||||
Reference in New Issue
Block a user