diff --git a/CHANGELOG.md b/CHANGELOG.md index 78dfc0332b2e17a5281d7f17759dd1754d468fdd..fd038e68ab066387c44deccacdc661acab3210e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,80 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] + + +## [v1.11] - 2019-09-24 - [Karotte] +[Karotte]: https://card10.badge.events.ccc.de/release/card10-v1.11-Karotte.zip + ### Added -- `micropython.mem_use()` function. +- **Support for sleep-mode instead of full power-off. This means the RTC now + retains its state!** +- For debugger users: A GDB macro `task_backtrace` which allows to view + backtraces of tasks which are currently swapped out. Use like + ```text + (gdb) task_backtrace serial_task_id + ... + (gdb) task_backtrace dispatcher_task_id + ... + (gdb) task_backtrace ble_task_id + ``` +- BHI160 magnetometer sensor +- ESB API in Pycardium. +- Monotonic clock API +- New FOSS font ... + +### Changed +- `Display.print()` uses a transparent background when printing with `bg == fg`. +- Try different crc16 module during build because different environments might + have different ones installed. +- Improved ECG app, it can now blink on pulse and more! +- Improved BHI160 and BME680 apps. + +### Fixed +- Fixed a regression which made it impossible to turn off the flashlight. +- Fixed CRT for l0dables not allowing to overwrite interrupt handlers. +- Fixed ECG App not closing the sensor on `KeyboardInterrupt`. +- Fixed a bug which made the power-button unresponsive when pressed during boot + (Interrupts were getting ignored). +- Fixed `simple_menu.Menu.exit()` not actually working. +- Added a few missing locks in `leds` module. +- Added a workaround for BHI160 axis mapping not being applied in some cases. +- Added a critical-section in BLE stack initialization to prevent weird lock-ups. +- Fixed vibra module crashing when calling `vibra.vibrate()` while already running. +- Fixed sensor-sample overflow leading to I2C bus lockup. + + +## [v1.10] - 2019-09-05 21:42 - [JerusalemArtichoke] +[JerusalemArtichoke]: https://card10.badge.events.ccc.de/release/card10-v1.10-JerusalemArtichoke.zip + +### Added +- **ws2812**: Connect Neopixels to the wristband GPIOs and make your card10 + even more colorful! +- DigiClk is now in the default prelude! - High-pass filter and pulse detection in default ECG app. +- Actually added `uuid` module - it was not built into the firmware before, + by accident. +- `leds.get_rgb()`: Get the current color of an LED. +- `leds.get_rocket()`: Get the current brightness of one of the rockets. +- `micropython.mem_use()` function. +- The analog-clock can now also set the time using the buttons. + +### Changed +- **Pycardium**: Switched from `long-long` to `mpz` integer representation. + This should resolve any issues with large numbers which had popped up so far. +- Refactored BME680 sensor interface. +- Made OpenOCD scripts work with more debuggers out of the box. +- Internal changes in preparation for button-interrupts. ### Fixed - Backlight and Vibration motor were not reset when switching apps. - Mismatch in default settings of the *Card10 Nickname* app. +- Fixed the PMIC ADC muxer not being properly reset to neutral after a + measurement. +- Fixed wrong timezone offset calculation in `utime.time_ms()`. +- Fixed bug where `\` characters were not parsed as path separators. +- Fixed the alignment request check in our ELF l0der. +- Fixed a buffer-overflow in the config-parser. ## [v1.9] - 2019-08-28 23:23 - [IcebergLettuce] @@ -214,7 +281,9 @@ fbf7c8c0 fix(menu.py) Refactored menu.py based on !138 ## [v1.0] - 2019-08-21 00:50 Initial release. -[Unreleased]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.9...master +[Unreleased]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.11...master +[v1.11]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.10...v1.11 +[v1.10]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.9...v1.10 [v1.9]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.8...v1.9 [v1.8]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.7...v1.8 [v1.7]: https://git.card10.badge.events.ccc.de/card10/firmware/compare/v1.6...v1.7 diff --git a/Documentation/bluetooth/card10.rst b/Documentation/bluetooth/card10.rst index 16bf38e18c5beabcd78523b2b7626b6d232739ca..d6e67d87316339a555e40754721ab9836206d7e3 100644 --- a/Documentation/bluetooth/card10.rst +++ b/Documentation/bluetooth/card10.rst @@ -28,7 +28,7 @@ The current draft uses following service specification: - Rockets characteristic: UUID: ``42230210-2342-2342-2342-234223422342`` - write no response + read and write no response - Background LED Bottom Left characteristic: @@ -104,6 +104,9 @@ Rockets characteristic The Rockets characteristic makes it possible to address every three rockets. Just write there three byte array, one for evey rocket. +On read you get the current value of all three rockets. +Range is between 0 and 31 (``0x1f``) if send higher value it will set to max of 31. + Dataformat: @@ -113,8 +116,8 @@ Dataformat: Rocket0 Rocket1 Rocket2 ======= ======= ======= -- Enable only Rocket0: ``0xff0000`` -- Enable all rockets with 50% brightness: ``0x7f7f7f`` +- Enable only Rocket0: ``0x1f0000`` +- Enable all rockets with 50% brightness: ``0x0f0f0f`` Background LED <Position> characteristic ---------------------------------------- diff --git a/Documentation/card10-cfg.rst b/Documentation/card10-cfg.rst new file mode 100644 index 0000000000000000000000000000000000000000..d60b4c552ebf3e43ffea33073f5981ba75b531fe --- /dev/null +++ b/Documentation/card10-cfg.rst @@ -0,0 +1,41 @@ +.. _card10_cfg: + +card10.cfg +========== + +Certain high-level settings can be configured using a filed named ``card10.cfg``. It is accessed from the :ref:`usb_file_transfer` of the bootloader. Once you are in this mode and have mounted the badge's flash device, you can either create or update a file named ``card10.cfg``. + +The file is in the well-known INI-style format, with one setting per line. For instance, if there were an option called ``answer_to_life``, you could set it by writing the following line in the ``card10.cfg`` file: + +.. code-block:: text + + answer_to_life = 42 + +Don't forget to unmount the filesystem before rebooting your badge after changing any setting. + +Syntax and Types +---------------- + +Lines that start with a ``#`` character are ignored. + +Any other line will have the overall syntax of ``option_name = option_value``, with spaces around the ``=`` character optional. + +Option names are internal to card10 and described below. Each option has a defined type. + +========= =========== +Type name Description +========= =========== +Boolean A true/false value. ``1`` or ``true`` is true, ``0`` or ``false`` is false. Example: ``foo = true``. +String An unquoted string value of maximum 20 bytes. Values longer than 20 bytes are trimmed. Example: ``foo = bar``. +Integer A signed 32-bit integer in base 10. Example: ``foo = 42`` or ``bar = -1337``. +Float A single-precision (32-bit) floating-point number in base 10. Example: ``foo = 13.37``. +========= =========== + +Supported options +----------------- + +=============== ========== =========== +Option name Type Description +=============== ========== =========== +``execute_elf`` Boolean Allow running of binary :ref:`l0dables`. These files can be nefarious, so this option is off by default. +=============== ========== =========== diff --git a/Documentation/conf.py b/Documentation/conf.py index bb211aa0cf679dd8486cc21ed5bcbc56418a3d7f..c7a3ee6efa69b223ee9feb4d57f6dbcd1478b910 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -90,6 +90,8 @@ html_context = { autodoc_mock_imports = [ "buttons", "interrupt", + "sys_bme680", + "sys_bhi160", "sys_display", "sys_leds", "sys_max30001", diff --git a/Documentation/debugger.rst b/Documentation/debugger.rst index b0207c489ee3237a995880501285a52c73c18e2d..4c34ca0290a243dd264bddf33edc65ff240a4cdd 100644 --- a/Documentation/debugger.rst +++ b/Documentation/debugger.rst @@ -115,6 +115,12 @@ command to soft-reset card10. ... (gdb) +.. note:: + You will also find the following self-describing gdb files in the firmware + root directory, which do not require additional arguments: + ``flash-all.gdb, flash-bootloader.gdb, + flash-both.gdb, flash-epicardium.gdb, flash-pycardium.gdb`` + .. warning:: If you are used to use ``mon reset halt``, be aware that the card10 prototypes do not connect the reset line to the debugger. OpenOCD is configured to only do diff --git a/Documentation/how-to-build.rst b/Documentation/how-to-build.rst index 0b616ab2624888f18b7460221d229e6a3513a57d..b8b1311c31e31fccc29456b9689a4f0b4cc9be19 100644 --- a/Documentation/how-to-build.rst +++ b/Documentation/how-to-build.rst @@ -107,7 +107,6 @@ firmware features: info related to BLE. - ``-Ddebug_core1=true``: Enable the core 1 SWD lines which are exposed on the SAO connector. Only use this if you have a debugger which is modified for core 1. -- ``-Djailbreak_card10=true``: Enable execution of .elf l0dables on core 1. .. warning:: @@ -144,6 +143,15 @@ In order to do a rebuild you can issue a clean command to ninja via Otherwise, rerunning ``./bootstrap.sh`` will also clean the build-directory. +.. note:: + + **macOS**: If ``strip`` fails to work on the freshly compiled ``mpy-cross``: + "strip: object: (...)/lib/micropython/micropython/mpy-cross/mpy-cross + malformed object (unknown load command 9)", you a likely not using the + `strip` that matches to your ``clang``. Do ``which strip && which clang``, + and if the paths don't match, clean up your PATHs, or as a quick hack, + create a symlink for strip. + .. note:: If you try to flash pycardium_epicardium.bin (renamed to card10.bin) @@ -152,4 +160,4 @@ Otherwise, rerunning ``./bootstrap.sh`` will also clean the build-directory. was >1MB. This was caused by the ``tr`` tool in the build process (it's supposed to create a large file with 0xff in it) - this requires the LC_ALL environment variable to be not set, or set to "C" - (but not UTF8 or similar). \ No newline at end of file + (but not UTF8 or similar). diff --git a/Documentation/how-to-flash.rst b/Documentation/how-to-flash.rst index 5be7bb06833f91b4051897bca46d2d36610481ad..c9349e3242f8ddd48cf6a6440f477bedd3627f69 100644 --- a/Documentation/how-to-flash.rst +++ b/Documentation/how-to-flash.rst @@ -5,27 +5,14 @@ method of flashing: Flash Without Debugger ---------------------- -If you do not have a debugger, you have to update the firmware using our -bootloader. To do so, you need to reboot card10 while keeping the buttom on -the bottom right pressed. Rebooting is done by either short pressing the power -button (top left) while you have a working firmware, or turning the card10 off -completely (by pressing the power button for 8 seconds) and then starting it again. - -.. image:: static/bootloader-buttons.png - -If you did everything correctly, the bootloader will display: -.. code-block:: text - - Bootloader - Jul 28 2019 - USB activated. - Ready. +If you do not have a debugger, you have to update the firmware using our +bootloader by going into :ref:`usb_file_transfer`. -On your host, you should now see an 8MB flash-device appear. You can now drop -the firmware's ``.bin`` (from ``build/pycardium/pycardium_epicardium.bin`` in -most cases) into this flash-storage. You **must** call the file ``card10.bin`` -for the bootloader to use it. +After you get your badge into :ref:`usb_file_transfer`, you can drop the firmware's +``.bin`` (from ``build/pycardium/pycardium_epicardium.bin`` in most cases) into +this flash-storage. You **must** call the file ``card10.bin`` for the +bootloader to use it. The bootloader will then display ``Writing.`` in red while it is actually writing the file to external flash. Please wait until it displays ``Ready.`` diff --git a/Documentation/index.rst b/Documentation/index.rst index 0607bdaa5c89d6b1508c25c809375db529a9ee36..44ecfcd04f8fb330aea3ae070643895bc70d9511 100644 --- a/Documentation/index.rst +++ b/Documentation/index.rst @@ -38,12 +38,15 @@ Last but not least, if you want to start hacking the lower-level firmware, the pycardium/simple_menu pycardium/utime pycardium/vibra + pycardium/ws2812 .. toctree:: :maxdepth: 1 :caption: Firmware overview + card10-cfg + usb-file-transfer how-to-build how-to-flash debugger diff --git a/Documentation/overview.rst b/Documentation/overview.rst index 7fd03bf4aef93b5f18158256db0d964fee5fe607..55c07dffd20ff97c4682bf4783d8d951072b37bd 100644 --- a/Documentation/overview.rst +++ b/Documentation/overview.rst @@ -14,24 +14,38 @@ Epicardium Epicardium is based on `FreeRTOS <https://www.freertos.org/>`_. There are a number of tasks that will have been keeping card10 running. These are: -* **Dispatcher**: The dispatcher task handles API calls from core 1. -* **PMIC**: The power manager task checks the battery level and other interesting - statistics that can be gathered from our power manager IC (MAX77650). -* **Serial**: Handles serial communication via *UART*, *CDC ACM* and possibly - Bluetooth. -* **BHI160**: Housekeeping task for interaction with the `BHI160`_. - ++-------------------+-------------------------------+----------+-------------------------------------------+ +| Name | ID Global | Priority | Description | ++===================+===============================+==========+===========================================+ +| `vPmicTask`_ | ``pmic_task_id`` (static) | +4 | Power Management (and Reset Button) | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vLifecycleTask`_ | ``lifecycle_task`` (static) | +3 | Control of the payload running on core 1. | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vBleTask`_ | ``ble_task_id`` (static) | +3 | Bluetooth Low Energy Stack | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vSerialTask`_ | ``serial_task_id`` | +3 | Serial Output via UART/CDC-ACM/BLE | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vApiDispatcher`_ | ``dispatcher_task_id`` | +2 | Epicardium API dispatcher | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vLedTask`_ | -/- | +1 | LED Animations | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vMAX30001Task`_ | ``max30001_task_id`` (static) | +1 | `MAX30001`_ ECG driver | ++-------------------+-------------------------------+----------+-------------------------------------------+ +| `vBhi160Task`_ | ``bhi160_task_id`` (static) | +1 | `BHI160`_ sensor fusion driver | ++-------------------+-------------------------------+----------+-------------------------------------------+ + +.. _vPmicTask: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/pmic.c#L281 +.. _vLifecycleTask: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/lifecycle.c#L361 +.. _vBleTask: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/ble/ble.c#L237 +.. _vSerialTask: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/serial.c#L289 +.. _vApiDispatcher: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/dispatcher.c#L25 +.. _vLedTask: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/personal_state.c#L58 +.. _vMAX30001Task: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/max30001.c#L378 +.. _vBhi160Task: https://git.card10.badge.events.ccc.de/card10/firmware/blob/master/epicardium/modules/bhi.c#L419 + +.. _MAX30001: https://www.maximintegrated.com/en/products/analog/data-converters/analog-front-end-ics/MAX30001.html .. _BHI160: https://www.bosch-sensortec.com/bst/products/all_products/bhi160 -.. todo:: - - The following tasks have not yet been implemented/are currently in the works: - - - **Bluetooth**: The bluetooth stack (`#23`_) - - **Payload Controller**: Control what is running on core 1 - - .. _#23: https://git.card10.badge.events.ccc.de/card10/firmware/issues/23 - Epicardium API -------------- Epicardium exposes lots of functionality via the *Epicardium API*. The @@ -41,23 +55,28 @@ you should probably read the :ref:`epicardium_api_guide` guide. Pycardium --------- + Pycardium is our MicroPython fork. Its purpose is to make it as easy as possible to interact with card10. If you are interested in working on Pycardium, take a look at the :ref:`pycardium_guide` guide. -L0dables +.. _l0dables: + +l0dables -------- + Next to Pycardium, other bare-metal code can also run on core 1. For example, -a Rustcardium or C-cardium. These l0dables must be compiled using our special +a `Rustcardium`_ or C-cardium. These l0dables must be compiled using our special linker script and should link against the api-caller library so they can interface with the :ref:`epicardium_api`. -Note: this feature is disabled by default and has to be enabled at build time. -To do this, run ``bootstrap.sh`` with the option ``-Djailbreak_card10=true`` -and rebuild the firmware as described in :ref:`how_to_build`. -.. todo:: +Note: this feature is disabled by default and has to be enabled in :ref:`card10_cfg`. A :ref:`card10_cfg` file dropped into the :ref:`usb_file_transfer` of the badge containing ``execute_elf = true`` is enough. + +l0dables are currently built within the source tree of the main repository. See ``l0dables/blinky`` for an example of a hello-world-like program. Within those programs, you can access the :ref:`epicardium_api` to control the hardware and behaviour of the badge. + +Once you have a built ELF file, you can drop it into the FAT filesystem of the flash (eg. via :ref:`usb_file_transfer`) and it will be available from the menu program of the badge. - Provide more details how this works +.. _Rustcardium: https://git.card10.badge.events.ccc.de/astro/rust-card10 Program Flow Diagram -------------------- diff --git a/Documentation/pycardium/bhi160.rst b/Documentation/pycardium/bhi160.rst index 6905f779c29d0d92b5a73a0c0020bdeace2c1df1..342e8bfcdb29e5ffcd13f54a23a508700b167f61 100644 --- a/Documentation/pycardium/bhi160.rst +++ b/Documentation/pycardium/bhi160.rst @@ -2,9 +2,18 @@ ``bhi160`` - Sensor Fusion ========================== + .. versionadded:: 1.4 -Supports the BHI160 sensor on the card10 for accelerometer, gyroscope... +Supports the BHI160 sensor on the card10 for accelerometer, gyroscope, +magnetometer and orientation. + +The coordinate system of the BHI160 sensor data looks like this: + +.. image:: ../static/bhi160-coordinates.png + +All angles and angular velocities (like gyroscope, orientation) rotate counter +clockwise around their respective axis. **Example**: @@ -12,91 +21,33 @@ Supports the BHI160 sensor on the card10 for accelerometer, gyroscope... import bhi160 import utime - + bhi = bhi160.BHI160Orientation() while True: samples = bhi.read() - print(samples) - utime.sleep(0.5) - - -.. class:: bhi160.BHI160Orientation(sample_rate,dynamic_range,callback,sample_buffer_len) - - Orientation of the BHI160 - - Parameters: - sample_rate: int, optional - Sample rate (default is 4) - dynamic_range: int, optional - Dynamic range (default is 2) - callback: callable, optional - Call this callback when enough data is collected (default is None) - - .. todo:: The callback functionality is untested, so do not be confused if it does not work. - sample_buffer_len: int, optional - Length of sample buffer (default is 200) - - .. py:method:: read(): - - Read sensor values - - :returns: Collected sensor values as list - - .. py:method:: close(): - - Close the connection to the sensor - - -.. class:: bhi160.BHI160Accelerometer - - Accelerometer of the BHI160 - - Parameters: - sample_rate: int, optional - Sample rate (default is 4) - dynamic_range: int, optional - Dynamic range (default is 2) - callback: callable, optional - Call this callback when enough data is collected (default is None) - - .. todo:: The callback functionality is untested, so do not be confused if it does not work. - sample_buffer_len: int, optional - Length of sample buffer (default is 200) - - .. py:method:: read(): - - Read sensor values - - :returns: Collected sensor values as list - - .. py:method:: close(): - - Close the connection to the sensor - -.. class:: bhi160.BHI160Gyroscope - - Gyroscope of the BHI160 - - Parameters: - sample_rate: int, optional - Sample rate (default is 4) - dynamic_range: int, optional - Dynamic range (default is 2) - callback: callable, optional - Call this callback when enough data is collected (default is None) - - .. todo:: The callback functionality is untested, so do not be confused if it does not work. - sample_buffer_len: int, optional - Length of sample buffer (default is 200) + if len(samples) == 0: + utime.sleep(0.25) + continue + # print the latest sample + print(samples[-1]) + utime.sleep(0.25) - .. py:method:: read(): - Read sensor values +.. autoclass:: bhi160.BHI160 - :returns: Collected sensor values as list +.. autoclass:: bhi160.BHI160Orientation + :members: + :inherited-members: - .. py:method:: close(): +.. autoclass:: bhi160.BHI160Accelerometer + :members: + :inherited-members: - Close the connection to the sensor +.. autoclass:: bhi160.BHI160Gyroscope + :members: + :inherited-members: +.. autoclass:: bhi160.BHI160Magnetometer + :members: + :inherited-members: diff --git a/Documentation/pycardium/bme680.rst b/Documentation/pycardium/bme680.rst index e657d49bf35988652dd015e6ea42ec731b6499c9..812173a625593f879580e196acff741cfcae13cf 100644 --- a/Documentation/pycardium/bme680.rst +++ b/Documentation/pycardium/bme680.rst @@ -2,6 +2,7 @@ ``bme680`` - Environmental Sensor ================================= +Allows access to environmental data of card10's surroundings. **Example**: @@ -9,17 +10,28 @@ import bme680, utime - bme680.init() + with bme680.Bme680() as environment: + while True: + d = environment.get_data() - while True: - temperature, humidity, pressure, resistance = bme680.get_data() + print("Temperature: {:10.2f} °C".format(d.temperature)) + print("Humidity: {:10.2f} % r.h.".format(d.humidity)) + print("Pressure: {:10.2f} hPa".format(d.pressure)) + print("Gas Resistance: {:10.2f} Ω".format(d.resistance)) - print("Temperature: {:10.2f} °C".format(temperature)) - print("Humidity: {:10.2f} % r.h.".format(humidity)) - print("Pressure: {:10.2f} hPa".format(pressure)) - print("Gas Resistance: {:10.2f} Ω".format(resistance)) + utime.sleep(1) - utime.sleep(1) +Sensor Class +------------ + +.. autoclass:: bme680.Bme680 + :members: + +Deprecated Interface +-------------------- +The following functions should no longer be used directly. The only exist for +compatibility as they were the old BME680 interface in previous firmware +versions. .. py:function:: init() @@ -29,6 +41,8 @@ :py:func:`bme680.init`. .. versionadded:: 1.4 + .. deprecated:: 1.10 + Use the :py:class:`bme680.Bme680` class instead. .. py:function:: get_data() @@ -38,9 +52,13 @@ ``pressure`` (hPa) and ``gas resistance`` (Ohm). .. versionadded:: 1.4 + .. deprecated:: 1.10 + Use the :py:class:`bme680.Bme680` class instead. .. py:function:: deinit() Deinitialize the sensor. .. versionadded:: 1.4 + .. deprecated:: 1.10 + Use the :py:class:`bme680.Bme680` class instead. diff --git a/Documentation/pycardium/display.rst b/Documentation/pycardium/display.rst index 08bd0274c80f6d28a6d834a06ca59f1b70ce1a7a..ab2ee8aed618200acbc059b7b3ab5de1a8d1d143 100644 --- a/Documentation/pycardium/display.rst +++ b/Documentation/pycardium/display.rst @@ -1,5 +1,21 @@ ``display`` - Display ===================== +The display module let's you draw on the card10's display. +Pixels are addressed from top left to bottom right with a range of x: 0 to 159 and y: 0 to 79. + +.. code-block:: text + + 0,0 + +---------------------+ + | | + | | + | | + | | + +---------------------+ + 159,79 + +Drawing operations are clipped, pixels outside of the screen will be ignored. + .. automodule:: display :members: diff --git a/Documentation/pycardium/os.rst b/Documentation/pycardium/os.rst index ce71c1b476921a81435393fc0383ff7070c51a30..2447ccfe88494b385e8ec9544b08eb5146a65b48 100644 --- a/Documentation/pycardium/os.rst +++ b/Documentation/pycardium/os.rst @@ -72,3 +72,30 @@ Card10-Specific Please only call this function if absolutely necessary. In most cases you'll want to just :py:func:`os.exit` instead. + +.. py:function:: usbconfig(config_type) + + Change active USB configuration. By default, card10 boots with + :py:data:`os.USB_SERIAL` active. + + This will deactivate the currently active USB configuration. This means + that, if you activate :py:data:`os.USB_FLASH` while :py:data:`os.USB_SERIAL` + was active, the USB serial will be disconnected. + + :param config_type: Selects which config to activate. Possible + values are :py:data:`os.USB_SERIAL`, :py:data:`os.USB_FLASH`, + or :py:data:`os.USB_NONE`. + + .. versionadded:: 1.11 + +.. py:data:: USB_NONE + + No USB device active. + +.. py:data:: USB_SERIAL + + CDC-ACM serial device active. + +.. py:data:: USB_FLASH + + Mass-Storage device active. diff --git a/Documentation/pycardium/overview.rst b/Documentation/pycardium/overview.rst index 49370ada31cf7aa532e67928c5a21d3301cdbdb3..20bef548063503eff8c26291021b94e8f1a68f54 100644 --- a/Documentation/pycardium/overview.rst +++ b/Documentation/pycardium/overview.rst @@ -49,10 +49,19 @@ and power it on:: leds.set_rocket(0, 31) +.. note:: + + If you're using iOS/Mac then you can connect to your serial console using: + + .. code-block:: shell-session + + screen /dev/tty.usbmodem* 115200 + + You can now see in your console what buttons you have pressed and your + console outputs/logs. With ``CTRL+C`` you exit the console. REPL modes ^^^^^^^^^^ - MicroPython supports a different REPL modes over the serial console. The modes can be changed on every new line. @@ -77,5 +86,3 @@ or give you tracebacks if an error occured. You can use **pycard10** (tools/pycard10.py) to execute python files from your PC directly on the card10. - - diff --git a/Documentation/pycardium/stdlib.rst b/Documentation/pycardium/stdlib.rst index 7a1f51c852d1f27247eb7f0a19c97c6576e912db..161f8204ec40df71314b988bb19cf2d50b5873be 100644 --- a/Documentation/pycardium/stdlib.rst +++ b/Documentation/pycardium/stdlib.rst @@ -201,6 +201,8 @@ Struct module. UUID(bytes='\x12\x34\x56\x78' * 4) UUID(int=0x12345678123456781234567812345678) + .. versionadded:: 1.10 + .. py:attribute:: bytes UUID as ``bytes()`` object @@ -221,7 +223,4 @@ Struct module. Generate a new UUID version 4 (random UUID). - .. todo:: - - This function is not yet usable because we don't have - :py:func:`os.urandom` yet. + .. versionadded:: 1.10 diff --git a/Documentation/pycardium/utime.rst b/Documentation/pycardium/utime.rst index a2900145d06d197b9492c57d3269fd7b152cb5b1..a592abcb10fcd006057caaff2a29cb46e245790c 100644 --- a/Documentation/pycardium/utime.rst +++ b/Documentation/pycardium/utime.rst @@ -33,6 +33,18 @@ alarm. Return the current timestamp in milliseconds since 2000-01-01 00:00 in the local timezone. +.. py:function:: monotonic() + + Return a monotonically increasing timestamp. + + .. versionadded:: 1.11 + +.. py:function:: monotonic_ms() + + Return a monotonically increasing timestamp in milliseconds. + + .. versionadded:: 1.11 + .. py:function:: set_time(secs) Sets the time to ``secs`` seconds since 2000-01-01 00:00 in the local diff --git a/Documentation/pycardium/ws2812.rst b/Documentation/pycardium/ws2812.rst new file mode 100644 index 0000000000000000000000000000000000000000..fe36f95926d813b07ed6bce395ee912d0f168811 --- /dev/null +++ b/Documentation/pycardium/ws2812.rst @@ -0,0 +1,33 @@ +.. py:module:: ws2812 + +``ws2812`` - Neopixel LEDs +========================== +The ``ws2812`` module controls LEDs of the WS2812 type. Just as the ``leds`` module, it exposes a function :py:func:`ws2812.set_all`, which works a similar fashion. + +.. versionadded:: 1.10 + +.. py:function:: set_all(pin, colors) + + Set multiple of the LEDs to RGB values. + + Filling starts at the LED connected to the specified gpio pin. + + :param int pin: ID of the pin to use for sending the data. + :param colors: List of RGB triplets. + + **Example** + + .. code-block:: python + + import color, utime, ws2812, gpio + + i = 0 + while True: + col1 = color.from_hsv(i % 360, 1.0, 0.1) + col2 = color.from_hsv((i + 20) % 360, 1.0, 0.1) + col3 = color.from_hsv((i + 40) % 360, 1.0, 0.1) + ws2812.set_all(gpio.WRISTBAND_2, [col1, col2, col3]) + i += 1 + utime.sleep_ms(10) + + .. versionadded:: 1.10 diff --git a/Documentation/static/bhi160-coordinates.png b/Documentation/static/bhi160-coordinates.png new file mode 100644 index 0000000000000000000000000000000000000000..9e61a8f6bbb4c5f4e7b66c1cbd5a801e98e4dd62 Binary files /dev/null and b/Documentation/static/bhi160-coordinates.png differ diff --git a/Documentation/usb-file-transfer.rst b/Documentation/usb-file-transfer.rst new file mode 100644 index 0000000000000000000000000000000000000000..efaf4b16d1a7f6e6c195132bfb5e6c15e4e91c28 --- /dev/null +++ b/Documentation/usb-file-transfer.rst @@ -0,0 +1,40 @@ +.. _usb_file_transfer: + +USB File Transfer +================= + +The card10 badge bootloader offers a USB Mass Storage mode to access its 8MB external flash. + +This flash contains a FAT32 filesystem and files on it will be visible to software running on the badge. + +Getting to the USB mode +----------------------- + +To get to the USB mode, you will need to boot the badge while keeping the bottom-right button pressed. + +.. image:: static/bootloader-buttons.png + +1. If the badge is on, hold the top-left (power) button until the sleep screen appears, then release. +2. Start holding the bottom-right button. +3. Quickly press and release the top-left (power) button to turn the badge on. +4. Your badge should now be in file transfer mode, and you can then release the bottom-right button. + +If you succesfully got into USB File Transfer mode, the screen will display its version and notify about the USB mode by displaying ``USB activated. Ready.``. If you connect the badge via USB to your computer, it should now detect 8MB of flash storage that you can mount in the same way as a pendrive. + +This pendrive can contain multiple files with different functions, some of them outlined here: + +============== ======== +File name Function +============== ======== +``card10.bin`` Firmware update file for the badge. If this file is present, the bootloader will perform an internal update to boot from this firmware file, then it will be deleted. +``main.py`` This file contains the default `application` to be run on power on. +``menu.py`` This file contains the default `menu` to be run when the power button is short-pressed. +``*.py`` These are application files written in (Micro)Python that can be run from the menu. +``*.elf`` These are :ref:`l0dables` that can be run from the menu. +============== ======== + +Updating files and rebooting +---------------------------- + +No matter which file you are writing, the bootloader will display a red ``Writing`` status message while write operations are pending. Please wait until it displays ``Ready`` again before resetting the badge by pressing the power button again. + diff --git a/bootloader/bootloader-display.c b/bootloader/bootloader-display.c index 8c13116d78e937292ce8499c7014dce19b536f07..d04db551d6833aca9391cd5aad80139792ecfdf4 100644 --- a/bootloader/bootloader-display.c +++ b/bootloader/bootloader-display.c @@ -6,31 +6,18 @@ #include "gfx.h" #include "display.h" -/* - * "Decompress" splash-screen image. The algorithm works as follows: - * - * Each byte encodes up to 127 pixels in either white or black. The most - * significant bit determines the color, the remaining 7 bits determine the - * amount. - */ static void bootloader_display_splash(void) { - int idx = 0; - - Color white = gfx_color(&display_screen, WHITE); - Color black = gfx_color(&display_screen, BLACK); - for (int i = 0; i < sizeof(splash); i++) { - Color color = (splash[i] & 0x80) ? white : black; - uint8_t length = splash[i] & 0x7f; - - for (int j = 0; j < length; j++) { - uint16_t x = idx % 160; - uint16_t y = idx / 160; - gfx_setpixel(&display_screen, x, y, color); - idx++; - } - } - + gfx_copy_region( + &display_screen, + 0, + 0, + 160, + 80, + GFX_RLE_MONO, + sizeof(splash), + (const void *)(splash) + ); gfx_update(&display_screen); } diff --git a/bootloader/crc_patch.py b/bootloader/crc_patch.py index 59ec6befb14a5dc625139e8042363ce2ac86f3ed..7d93353d507531c097a3e69d2186c15c1b8ebded 100755 --- a/bootloader/crc_patch.py +++ b/bootloader/crc_patch.py @@ -1,19 +1,37 @@ #!/usr/bin/env python3 import sys -import crc16 + +try: + import crc16 + + crcfun = crc16.crc16xmodem +except ImportError: + try: + import crcmod + + crcfun = crcmod.predefined.mkCrcFun("xmodem") + except ImportError: + try: + import crcelk + + crcfun = crcelk.CRC_XMODEM.calc_bytes + except ImportError: + raise Exception( + "Could not find a CRC implementation. Tried: crc16, crcmod, crcelk." + ) def main(): - data = open(sys.argv[1], 'rb').read() - crc = crc16.crc16xmodem(data) + data = open(sys.argv[1], "rb").read() + crc = crcfun(data) # print(crc) padded = data + bytes([crc >> 8, crc & 0xFF]) - crc = crc16.crc16xmodem(padded) + crc = crcfun(padded) # print(crc) - open(sys.argv[1], 'wb').write(padded) + open(sys.argv[1], "wb").write(padded) if __name__ == "__main__": diff --git a/default.nix b/default.nix index dc9649bc1c1e44e23232062d5672fdc1202f5293..9e11828e85d9a13e2095e047ef692de89a0d5a38 100644 --- a/default.nix +++ b/default.nix @@ -18,6 +18,7 @@ in stdenv.mkDerivation rec { bash crc16 gcc-arm-embedded + git meson ninja py diff --git a/epicardium/FreeRTOSConfig.h b/epicardium/FreeRTOSConfig.h index f1d3aa46915e9c4373d281a1a4ab37707a918bf9..b731f6a9abdee7556f073936d86aba649e72a8d1 100644 --- a/epicardium/FreeRTOSConfig.h +++ b/epicardium/FreeRTOSConfig.h @@ -1,11 +1,10 @@ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H -#define MXC_ASSERT_ENABLE -#include "mxc_assert.h" - #include "max32665.h" +#include <assert.h> + /* CMSIS keeps a global updated with current system clock in Hz */ #define configCPU_CLOCK_HZ ((unsigned long)96000000) @@ -69,7 +68,7 @@ #define xPortSysTickHandler SysTick_Handler /* Assert */ -#define configASSERT(x) MXC_ASSERT(x) +#define configASSERT(x) assert(x) /* Tickless idle hooks */ typedef uint32_t TickType_t; diff --git a/epicardium/ble/ble.c b/epicardium/ble/ble.c index a6f840f76b6ca14fb6d3a9dd8942a81cccd86d3a..a7f10ea50aa207903bf09dce56e91e117afddd59 100644 --- a/epicardium/ble/ble.c +++ b/epicardium/ble/ble.c @@ -16,7 +16,7 @@ #include <string.h> #include <stdbool.h> -#define FACTOR 2 +#define FACTOR 2 #define WSF_BUF_POOLS 6 #define WSF_BUF_SIZE (0x1048 * FACTOR) @@ -161,12 +161,17 @@ void WsfTimerNotify(void) //printf("WsfTimerNotify\n"); // TODO: Can we do this without waking up the task? // xTimerChangePeriodFromISR exists - notify(); + NVIC->STIR = RSV11_IRQn; } /*************************************************************************************************/ void wsf_ble_signal_event(void) { //printf("wsf_ble_signal_event\n"); + NVIC->STIR = RSV11_IRQn; +} +/*************************************************************************************************/ +void RSV11_IRQHandler(void) +{ notify(); } /*************************************************************************************************/ @@ -243,14 +248,22 @@ void vBleTask(void *pvParameters) */ vTaskDelay(pdMS_TO_TICKS(500)); + /* We are going to execute FreeRTOS functions from callbacks + * coming from this interrupt. Its priority needs to be + * reduced to allow this. */ + NVIC_SetPriority(RSV11_IRQn, 2); + NVIC_EnableIRQ(RSV11_IRQn); + WsfInit(); + taskENTER_CRITICAL(); + /* Critical section to prevent a loop in iq_capture2 / meas_freq in + * /home/maxim/Documents/src/BLE/mcbusw/Hardware/Micro/ME14/Firmware/trunk/NDALibraries/BTLE/phy/dbb/prot/ble/pan2g5/afe/max32665/board_config.c:275 + * if BHI160 and -Ddebug_prints=true is enabled*/ StackInit(); + taskEXIT_CRITICAL(); BbBleDrvSetTxPower(0); setAddress(); - NVIC_SetPriority(BTLE_SFD_TO_IRQn, 2); - NVIC_SetPriority(BTLE_TX_DONE_IRQn, 2); - NVIC_SetPriority(BTLE_RX_RCVD_IRQn, 2); AppInit(); BleStart(); AttsDynInit(); diff --git a/epicardium/ble/card10.c b/epicardium/ble/card10.c index ebea5b3a09a339548ab59f3f080d3605b6ce9223..7f896bfe47fe90aa2992848c37ecc716efd29a0a 100644 --- a/epicardium/ble/card10.c +++ b/epicardium/ble/card10.c @@ -114,7 +114,7 @@ static const uint8_t UUID_attChar_vibra[] = { /* BLE UUID for card10 char rockets */ static const uint8_t UUID_char_rockets[] = { - ATT_PROP_WRITE_NO_RSP, + ATT_PROP_READ | ATT_PROP_WRITE_NO_RSP, UINT16_TO_BYTES(CARD10_ROCKETS_VAL_HDL), CARD10_UUID_SUFFIX, 0x10, CARD10_UUID_PREFIX }; @@ -123,6 +123,9 @@ static const uint8_t UUID_attChar_rockets[] = { CARD10_UUID_SUFFIX, 0x10, CARD10_UUID_PREFIX }; +static uint8_t rocketsValue[] = { 0, 0, 0 }; +static uint16_t rocketsLen = sizeof(rocketsValue); + /* BLE UUID for card10 led background bottom left */ static const uint8_t UUID_char_led_bg_bottom_left[] = { ATT_PROP_READ | ATT_PROP_WRITE_NO_RSP, @@ -338,11 +341,13 @@ static const attsAttr_t card10SvcAttrList[] = { }, { .pUuid = UUID_attChar_rockets, - .pValue = NULL, + .pValue = rocketsValue, + .pLen = &rocketsLen, .maxLen = 3 * sizeof(uint8_t), - .settings = ATTS_SET_WRITE_CBACK, + .settings = ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK, .permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | - ATTS_PERMIT_WRITE_AUTH, + ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ | + ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH, }, // BG LED Bottom left @@ -771,25 +776,20 @@ static uint8_t writeCard10CB( } // leds above case CARD10_LEDS_ABOVE_VAL_HDL: + APP_TRACE_INFO0("ble-card10: update LEDs above"); + for (ui16 = 0; ui16 < 11; ui16++) { - epic_leds_set( - ui16, - pValue[ui16 * 3], - pValue[ui16 * 3 + 1], - pValue[ui16 * 3 + 2] - ); - APP_TRACE_INFO4( - "ble-card10: set led %ld above to #%02x%02x%02x\n", + epic_leds_prep( ui16, pValue[ui16 * 3], pValue[ui16 * 3 + 1], pValue[ui16 * 3 + 2] ); } + epic_leds_update(); + return ATT_SUCCESS; default: - APP_TRACE_INFO1( - "ble-card10: unsupported characteristic: %c\n", handle - ); + APP_TRACE_INFO1("ble-card10: unsupported handle: %x\n", handle); return ATT_ERR_HANDLE; } } @@ -820,6 +820,17 @@ static uint8_t readCard10CB( APP_TRACE_INFO0("ble-card10: read time\n"); return ATT_SUCCESS; + case CARD10_ROCKETS_VAL_HDL: + pAttr->pValue[0] = epic_leds_get_rocket(0); + pAttr->pValue[1] = epic_leds_get_rocket(1); + pAttr->pValue[2] = epic_leds_get_rocket(2); + APP_TRACE_INFO3( + "ble-card10: get rockets 0:%d, 1:%d, 2:%d\n", + pAttr->pValue[0], + pAttr->pValue[1], + pAttr->pValue[2] + ); + return ATT_SUCCESS; // background leds case CARD10_LED_BG_BOTTOM_LEFT_VAL_HDL: return getRGBLed(11, pAttr); diff --git a/epicardium/ble/filetransfer.c b/epicardium/ble/filetransfer.c index 88b31308bf19cf9c02f45615a34b58fa19d5300f..df888a744442b814656bc44224457c602f815fb5 100644 --- a/epicardium/ble/filetransfer.c +++ b/epicardium/ble/filetransfer.c @@ -396,9 +396,7 @@ static uint8_t writeCallback( connId, handle, operation, offset, len, pValue, pAttr ); default: - LOG_ERR("filetrans", - "unsupported characteristic: %c\n", - handle); + LOG_ERR("filetrans", "unsupported handle: %x\n", handle); return ATT_ERR_HANDLE; } } diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 7e9aba5aa203beccdacc9fc7f22d11b1c95c2b70..21a7511c90324c5fd1f8157d3c31f1bdc4c8edba 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -82,6 +82,8 @@ typedef _Bool bool; #define API_RTC_SCHEDULE_ALARM 0x51 #define API_RTC_SET_MILLISECONDS 0x52 #define API_RTC_GET_MILLISECONDS 0x53 +#define API_RTC_GET_MONOTONIC_SECONDS 0x54 +#define API_RTC_GET_MONOTONIC_MILLISECONDS 0x55 #define API_LEDS_SET 0x60 #define API_LEDS_SET_HSV 0x61 @@ -97,6 +99,7 @@ typedef _Bool bool; #define API_LEDS_SET_ALL_HSV 0x6b #define API_LEDS_SET_GAMMA_TABLE 0x6c #define API_LEDS_CLEAR_ALL 0x6d +#define API_LEDS_GET_ROCKET 0x6e #define API_LEDS_GET 0x6f #define API_VIBRA_SET 0x70 @@ -139,6 +142,8 @@ typedef _Bool bool; #define API_USB_STORAGE 0x111 #define API_USB_CDCACM 0x112 +#define API_WS2812_WRITE 0x0120 + /* clang-format on */ typedef uint32_t api_int_id_t; @@ -186,17 +191,19 @@ API(API_INTERRUPT_DISABLE, int epic_interrupt_disable(api_int_id_t int_id)); #define EPIC_INT_UART_RX 2 /** RTC Alarm interrupt. See :c:func:`epic_isr_rtc_alarm`. */ #define EPIC_INT_RTC_ALARM 3 -/** BHI180 Accelerometer. See :c:func:`epic_isr_bhi160_accelerometer`. */ +/** BHI160 Accelerometer. See :c:func:`epic_isr_bhi160_accelerometer`. */ #define EPIC_INT_BHI160_ACCELEROMETER 4 -/** BHI180 Orientation Sensor. See :c:func:`epic_isr_bhi160_orientation`. */ +/** BHI160 Orientation Sensor. See :c:func:`epic_isr_bhi160_orientation`. */ #define EPIC_INT_BHI160_ORIENTATION 5 -/** BHI180 Gyroscope. See :c:func:`epic_isr_bhi160_gyroscope`. */ +/** BHI160 Gyroscope. See :c:func:`epic_isr_bhi160_gyroscope`. */ #define EPIC_INT_BHI160_GYROSCOPE 6 /** MAX30001 ECG. See :c:func:`epic_isr_max30001_ecg`. */ #define EPIC_INT_MAX30001_ECG 7 +/** BHI160 Magnetometer. See :c:func:`epic_isr_bhi160_magnetometer`. */ +#define EPIC_INT_BHI160_MAGNETOMETER 8 /* Number of defined interrupts. */ -#define EPIC_INT_NUM 8 +#define EPIC_INT_NUM 9 /* clang-format on */ /* @@ -602,6 +609,8 @@ API(API_LEDS_SET, void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)); * are the 4 "ambient" LEDs. * :param uint8_t * rgb: need tree byte array to get the value of red, green and blue. * :returns: ``0`` on success or ``-EPERM`` if the LED is blocked by personal-state. + * + * .. versionadded:: 1.10 */ API(API_LEDS_GET, int epic_leds_get_rgb(int led, uint8_t * rgb)); @@ -738,6 +747,26 @@ API(API_LEDS_UPDATE, void epic_leds_update(void)); */ API(API_LEDS_SET_ROCKET, void epic_leds_set_rocket(int led, uint8_t value)); +/** + * Get the brightness of one of the rocket LEDs. + * + * :param int led: Which LED to get. + * + * +-------+--------+----------+ + * | ID | Color | Location | + * +=======+========+==========+ + * | ``0`` | Blue | Left | + * +-------+--------+----------+ + * | ``1`` | Yellow | Top | + * +-------+--------+----------+ + * | ``2`` | Green | Right | + * +-------+--------+----------+ + * :returns value: Brightness of LED (value between 0 and 31) or ``-EINVAL`` if the LED/rocket does not exists. + * + * .. versionadded:: 1.10 + */ +API(API_LEDS_GET_ROCKET, int epic_leds_get_rocket(int led)); + /** * Turn on the bright side LED which can serve as a flashlight if worn on the left wrist or as a rad tattoo illuminator if worn on the right wrist. * @@ -1021,7 +1050,12 @@ enum bhi160_sensor_type { * - Dynamic range: g's (1x Earth Gravity, ~9.81m*s^-2) */ BHI160_ACCELEROMETER = 0, - /** Magnetometer (**Unimplemented**) */ + /** + * Magnetometer + * + * - Data type: :c:type:`bhi160_data_vector` + * - Dynamic range: -1000 to 1000 microtesla + */ BHI160_MAGNETOMETER = 1, /** Orientation */ BHI160_ORIENTATION = 2, @@ -1153,6 +1187,14 @@ API(API_BHI160_DISABLE_ALL, void epic_bhi160_disable_all_sensors()); */ API_ISR(EPIC_INT_BHI160_ACCELEROMETER, epic_isr_bhi160_accelerometer); +/** + * **Interrupt Service Routine** for :c:data:`EPIC_INT_BHI160_MAGNETOMETER` + * + * :c:func:`epic_isr_bhi160_magnetometer` is called whenever the BHI160 + * magnetometer has new data available. + */ +API_ISR(EPIC_INT_BHI160_MAGNETOMETER, epic_isr_bhi160_magnetometer); + /** * **Interrupt Service Routine** for :c:data:`EPIC_INT_BHI160_ORIENTATION` * @@ -1286,8 +1328,8 @@ API(API_DISP_UPDATE, int epic_disp_update()); /** * Prints a string into the display framebuffer * - * :param posx: x position to print to. 0 <= x <= 160 - * :param posy: y position to print to. 0 <= y <= 80 + * :param posx: x position to print to. + * :param posy: y position to print to. * :param pString: string to print * :param fg: foreground color in rgb565 * :param bg: background color in rgb565 @@ -1297,8 +1339,8 @@ API(API_DISP_UPDATE, int epic_disp_update()); */ API(API_DISP_PRINT, int epic_disp_print( - uint16_t posx, - uint16_t posy, + int16_t posx, + int16_t posy, const char *pString, uint16_t fg, uint16_t bg) @@ -1319,19 +1361,19 @@ enum disp_font_name { * Prints a string into the display framebuffer with font type selectable * * :param fontName: number of font, use FontName enum - * :param posx: x position to print to. 0 <= x <= 160 - * :param posy: y position to print to. 0 <= y <= 80 + * :param posx: x position to print to. + * :param posy: y position to print to. * :param pString: string to print * :param fg: foreground color in rgb565 - * :param bg: background color in rgb565 + * :param bg: background color in rgb565, no background is drawn if bg==fg * :return: ``0`` on success or a negative value in case of an error: * * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_PRINT_ADV, int epic_disp_print_adv( uint8_t font, - uint16_t posx, - uint16_t posy, + int16_t posx, + int16_t posy, const char *pString, uint16_t fg, uint16_t bg @@ -1350,15 +1392,15 @@ API(API_DISP_CLEAR, int epic_disp_clear(uint16_t color)); /** * Draws a pixel on the display * - * :param x: x position; 0 <= x <= 160 - * :param y: y position; 0 <= y <= 80 + * :param x: x position; + * :param y: y position; * :param color: pixel color in rgb565 * :return: ``0`` on success or a negative value in case of an error: * * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_PIXEL, int epic_disp_pixel( - uint16_t x, uint16_t y, uint16_t color + int16_t x, int16_t y, uint16_t color )); /** @@ -1376,10 +1418,10 @@ API(API_DISP_PIXELS, /** * Draws a line on the display * - * :param xstart: x starting position; 0 <= x <= 160 - * :param ystart: y starting position; 0 <= y <= 80 - * :param xend: x ending position; 0 <= x <= 160 - * :param yend: y ending position; 0 <= y <= 80 + * :param xstart: x starting position + * :param ystart: y starting position + * :param xend: x ending position + * :param yend: y ending position * :param color: line color in rgb565 * :param linestyle: 0 for solid, 1 for dottet (almost no visual difference) * :param pixelsize: thickness of the line; 1 <= pixelsize <= 8 @@ -1388,10 +1430,10 @@ API(API_DISP_PIXELS, * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_LINE, int epic_disp_line( - uint16_t xstart, - uint16_t ystart, - uint16_t xend, - uint16_t yend, + int16_t xstart, + int16_t ystart, + int16_t xend, + int16_t yend, uint16_t color, enum disp_linestyle linestyle, uint16_t pixelsize @@ -1400,10 +1442,10 @@ API(API_DISP_LINE, int epic_disp_line( /** * Draws a rectangle on the display * - * :param xstart: x coordinate of top left corner; 0 <= x <= 160 - * :param ystart: y coordinate of top left corner; 0 <= y <= 80 - * :param xend: x coordinate of bottom right corner; 0 <= x <= 160 - * :param yend: y coordinate of bottom right corner; 0 <= y <= 80 + * :param xstart: x coordinate of top left corner + * :param ystart: y coordinate of top left corner + * :param xend: x coordinate of bottom right corner + * :param yend: y coordinate of bottom right corner * :param color: line color in rgb565 * :param fillstyle: 0 for empty, 1 for filled * :param pixelsize: thickness of the rectangle outline; 1 <= pixelsize <= 8 @@ -1412,10 +1454,10 @@ API(API_DISP_LINE, int epic_disp_line( * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_RECT, int epic_disp_rect( - uint16_t xstart, - uint16_t ystart, - uint16_t xend, - uint16_t yend, + int16_t xstart, + int16_t ystart, + int16_t xend, + int16_t yend, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize @@ -1435,8 +1477,8 @@ API(API_DISP_RECT, int epic_disp_rect( * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_CIRC, int epic_disp_circ( - uint16_t x, - uint16_t y, + int16_t x, + int16_t y, uint16_t rad, uint16_t color, enum disp_fillstyle fillstyle, @@ -1706,6 +1748,28 @@ API(API_FILE_MKDIR, int epic_file_mkdir(const char *dirname)); * === */ +/** + * Get the monotonic time in seconds. + * + * :return: monotonic time in seconds + * + * .. versionadded:: 1.11 + */ +API(API_RTC_GET_MONOTONIC_SECONDS, + uint32_t epic_rtc_get_monotonic_seconds(void) +); + +/** + * Get the monotonic time in ms. + * + * :return: monotonic time in milliseconds + * + * .. versionadded:: 1.11 + */ +API(API_RTC_GET_MONOTONIC_MILLISECONDS, + uint64_t epic_rtc_get_monotonic_milliseconds(void) +); + /** * Read the current RTC value. * @@ -1856,4 +1920,22 @@ API(API_USB_STORAGE, int epic_usb_storage(void)); */ API(API_USB_CDCACM, int epic_usb_cdcacm(void)); +/** + * WS2812 + * ====== + */ + +/** + * Takes a gpio pin specified with the gpio module and transmits + * the led data. The format `GG:RR:BB` is expected. + * + * :param uint8_t pin: The gpio pin to be used for data. + * :param uint8_t * pixels: The buffer, in which the pixel data is stored. + * :param uint32_t n_bytes: The size of the buffer. + * + * .. versionadded:: 1.10 + */ +API(API_WS2812_WRITE, void epic_ws2812_write(uint8_t pin, uint8_t *pixels, uint32_t n_bytes)); + #endif /* _EPICARDIUM_H */ + diff --git a/epicardium/l0der/l0der.c b/epicardium/l0der/l0der.c index bf02ad2dcfcb4cd18c7edc7d7510b2927afc5bb6..deb55571e3b96fe72c89d96dcc555424035116ef 100644 --- a/epicardium/l0der/l0der.c +++ b/epicardium/l0der/l0der.c @@ -545,7 +545,8 @@ _load_pie(int fd, int size, Elf32_Ehdr *hdr, struct l0dable_info *info) if (phdr.p_type == PT_LOAD) { // Check alignment request. - if ((phdr.p_vaddr % phdr.p_align) != 0) { + if ((phdr.p_offset % phdr.p_align) != + (phdr.p_vaddr % phdr.p_align)) { LOG_ERR("l0der", "_load_pie: phdr %d alignment too strict", i); diff --git a/epicardium/main.c b/epicardium/main.c index 51edbe93d6f1abe06bf5a15fbb01bf48f99ff383..f741183bc035f305de91c235feaa2eb21fd9f9f0 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -4,6 +4,11 @@ #include "modules/config.h" #include "card10-version.h" +#include "gfx.h" +#include "display.h" +#include "leds.h" +#include "version-splash.h" + #include "FreeRTOS.h" #include "task.h" #include "mxc_delay.h" @@ -27,10 +32,39 @@ int main(void) * Version Splash */ const char *version_buf = CARD10_VERSION; - const int off = (160 - (int)strlen(version_buf) * 14) / 2; + + //LED feedback in case of dead display + epic_leds_set(11, 0, 0, 1); + epic_leds_set(12, 0, 0, 1); + epic_leds_set(13, 0, 0, 1); + epic_leds_set(14, 0, 0, 1); + for (int i = 0; i < 3; i++) { + epic_leds_set_rocket(i, 31); + mxc_delay(166666); + epic_leds_set_rocket(i, 0); + } + epic_leds_clear_all(0, 0, 0); + epic_disp_clear(0x0000); - epic_disp_print(10, 20, "Epicardium", 0xfe20, 0x0000); - epic_disp_print(off > 0 ? off : 0, 40, version_buf, 0xfe20, 0x0000); + + if (strcmp(CARD10_VERSION, "v1.11") == 0) { + gfx_copy_region( + &display_screen, + 0, + 0, + 160, + 80, + GFX_RAW, + sizeof(version_splash), + version_splash + ); + } else { + const int off = (160 - (int)strlen(version_buf) * 14) / 2; + epic_disp_print(10, 20, "Epicardium", 0xfe20, 0x0000); + epic_disp_print( + off > 0 ? off : 0, 40, version_buf, 0xfe20, 0x0000 + ); + } epic_disp_update(); mxc_delay(2000000); @@ -44,8 +78,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 3, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "Serial"); - abort(); + panic("Failed to create %s task!", "Serial"); } /* PMIC */ @@ -56,8 +89,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 4, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "PMIC"); - abort(); + panic("Failed to create %s task!", "PMIC"); } /* BHI160 */ @@ -68,8 +100,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "BHI160"); - abort(); + panic("Failed to create %s task!", "BHI160"); } /* MAX30001 */ @@ -80,8 +111,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "MAX30001"); - abort(); + panic("Failed to create %s task!", "MAX30001"); } /* API */ if (xTaskCreate( @@ -91,12 +121,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 2, &dispatcher_task_id) != pdPASS) { - LOG_CRIT( - "startup", - "Failed to create %s task!", - "API Dispatcher" - ); - abort(); + panic("Failed to create %s task!", "API Dispatcher"); } /* BLE */ @@ -106,10 +131,9 @@ int main(void) (const char *)"BLE", configMINIMAL_STACK_SIZE * 10, NULL, - tskIDLE_PRIORITY + 1, + tskIDLE_PRIORITY + 3, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "BLE"); - abort(); + panic("Failed to create %s task!", "BLE"); } } @@ -121,8 +145,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "LED"); - abort(); + panic("Failed to create %s task!", "LED"); } /* Lifecycle */ @@ -133,8 +156,7 @@ int main(void) NULL, tskIDLE_PRIORITY + 3, NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "Lifecycle"); - abort(); + panic("Failed to create %s task!", "Lifecycle"); } /* @@ -145,6 +167,5 @@ int main(void) LOG_DEBUG("startup", "Starting FreeRTOS ..."); vTaskStartScheduler(); - LOG_CRIT("startup", "FreeRTOS did not start due to unknown error!"); - abort(); + panic("FreeRTOS did not start due to unknown error!"); } diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c index 66f8bb7ea42f4f679f9247c85b323d04ddf621f9..b88e1dc217d087e93d286a488a81ccef3cac619c 100644 --- a/epicardium/modules/bhi.c +++ b/epicardium/modules/bhi.c @@ -1,3 +1,4 @@ +#include <assert.h> #include <stdio.h> #include <string.h> @@ -91,6 +92,8 @@ static bhy_virtual_sensor_t bhi160_lookup_vs_id(enum bhi160_sensor_type type) switch (type) { case BHI160_ACCELEROMETER: return VS_ID_ACCELEROMETER; + case BHI160_MAGNETOMETER: + return VS_ID_MAGNETOMETER; case BHI160_ORIENTATION: return VS_ID_ORIENTATION; case BHI160_GYROSCOPE: @@ -108,6 +111,8 @@ static int bhi160_lookup_sd(enum bhi160_sensor_type type) switch (type) { case BHI160_ACCELEROMETER: return SD_BHI160_ACCELEROMETER; + case BHI160_MAGNETOMETER: + return SD_BHI160_MAGNETOMETER; case BHI160_ORIENTATION: return SD_BHI160_ORIENTATION; case BHI160_GYROSCOPE: @@ -255,23 +260,25 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) wakeup = true; /* fall through */ case VS_ID_TIMESTAMP_MSW: - MXC_ASSERT(data_type == BHY_DATA_TYPE_SCALAR_U16); + assert(data_type == BHY_DATA_TYPE_SCALAR_U16); timestamp = sensor_data->data_scalar_u16.data << 16; break; case VS_ID_TIMESTAMP_LSW_WAKEUP: wakeup = true; /* fall through */ case VS_ID_TIMESTAMP_LSW: - MXC_ASSERT(data_type == BHY_DATA_TYPE_SCALAR_U16); + assert(data_type == BHY_DATA_TYPE_SCALAR_U16); timestamp = (timestamp & 0xFFFF0000) | sensor_data->data_scalar_u16.data; break; case VS_ID_ACCELEROMETER_WAKEUP: + case VS_ID_MAGNETOMETER_WAKEUP: case VS_ID_ORIENTATION_WAKEUP: case VS_ID_GYROSCOPE_WAKEUP: wakeup = true; /* fall through */ case VS_ID_ACCELEROMETER: + case VS_ID_MAGNETOMETER: case VS_ID_ORIENTATION: case VS_ID_GYROSCOPE: switch (sensor_id) { @@ -280,6 +287,11 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) sensor_type = BHI160_ACCELEROMETER; epic_int = EPIC_INT_BHI160_ACCELEROMETER; break; + case VS_ID_MAGNETOMETER_WAKEUP: + case VS_ID_MAGNETOMETER: + sensor_type = BHI160_MAGNETOMETER; + epic_int = EPIC_INT_BHI160_MAGNETOMETER; + break; case VS_ID_ORIENTATION_WAKEUP: case VS_ID_ORIENTATION: sensor_type = BHI160_ORIENTATION; @@ -292,7 +304,7 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) break; } - MXC_ASSERT(data_type == BHY_DATA_TYPE_VECTOR); + assert(data_type == BHY_DATA_TYPE_VECTOR); if (bhi160_streams[sensor_type].queue == NULL) { break; } @@ -301,11 +313,15 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) data_vector.y = sensor_data->data_vector.y; data_vector.z = sensor_data->data_vector.z; data_vector.status = sensor_data->data_vector.status; - xQueueSend( - bhi160_streams[sensor_type].queue, - &data_vector, - BHI160_MUTEX_WAIT_MS - ); + + /* Discard overflow. See discussion in !316. */ + if (xQueueSend( + bhi160_streams[sensor_type].queue, + &data_vector, + 0) != pdTRUE) { + LOG_WARN("bhi160", "queue full for %d", sensor_type); + } + if (wakeup) { api_interrupt_trigger(epic_int); } @@ -460,6 +476,11 @@ void vBhi160Task(void *pvParameters) } /* Remap axes to match card10 layout */ + /* Due to a known issue (#133) the first call to + * bhy_mapping_matrix_set might fail. */ + bhy_mapping_matrix_set( + PHYSICAL_SENSOR_INDEX_ACC, bhi160_mapping_matrix + ); bhy_mapping_matrix_set( PHYSICAL_SENSOR_INDEX_ACC, bhi160_mapping_matrix ); diff --git a/epicardium/modules/buttons.c b/epicardium/modules/buttons.c index 91f5ad02d9000e22cbf13b93c9d2170891856da6..14e9e613719e3e5279f811393afdfaf843025430 100644 --- a/epicardium/modules/buttons.c +++ b/epicardium/modules/buttons.c @@ -26,7 +26,7 @@ uint8_t epic_buttons_read(uint8_t mask) * Not using PB_Get() here as that performs one I2C transcation * per button. */ - uint8_t pin_status = ~portexpander_get(); + uint8_t pin_status = ~portexpander_in_get(0xFF); hwlock_release(HWLOCK_I2C); diff --git a/epicardium/modules/config.c b/epicardium/modules/config.c index 47396e2195b8b262f41279dbdad4e588430efdef..cb0094c22fcd5c826cbde040ebb195939a9e39e6 100644 --- a/epicardium/modules/config.c +++ b/epicardium/modules/config.c @@ -31,17 +31,17 @@ struct config_option { static struct config_option s_options[_EpicOptionCount] = { /* clang-format off */ - #define INIT_Boolean(v) { .boolean = (v) } - #define INIT_Int(v) { .integer = (v) } - #define INIT_Float(v) { .floating_point = (v) } - #define INIT_String(v) { .string = (v) } - #define INIT_(tp, v) INIT_ ## tp (v) - #define INIT(tp, v) INIT_ (tp, v) + #define INIT_Boolean(v) { .boolean = (v) } + #define INIT_Int(v) { .integer = (v) } + #define INIT_Float(v) { .floating_point = (v) } + #define INIT_String(v) { .string = (v) } + #define INIT_(tp, v) INIT_ ## tp (v) + #define INIT(tp, v) INIT_ (tp, v) - #define CARD10_SETTING(identifier, spelling, tp, default_value) \ + #define CARD10_SETTING(identifier, spelling, tp, default_value) \ [Option ## identifier] = { .name = (spelling), \ - .type = OptionType_ ## tp, \ - .value = INIT(tp, (default_value)) }, + .type = OptionType_ ## tp, \ + .value = INIT(tp, (default_value)) }, #include "modules/config.def" /* clang-format on */ @@ -175,7 +175,7 @@ static void configure(const char *key, const char *value, int lineNumber) static void doline(char *line, char *eol, int lineNumber) { //skip leading whitespace - while (*line && isspace(*line)) + while (*line && isspace((int)*line)) ++line; char *key = line; @@ -199,7 +199,7 @@ static void doline(char *line, char *eol, int lineNumber) char *e_key = eq - 1; //skip trailing whitespace in key - while (e_key > key && isspace(*e_key)) + while (e_key > key && isspace((int)*e_key)) --e_key; e_key[1] = '\0'; if (*key == '\0') { @@ -209,12 +209,12 @@ static void doline(char *line, char *eol, int lineNumber) char *value = eq + 1; //skip leading whitespace - while (*value && isspace(*value)) + while (*value && isspace((int)*value)) ++value; char *e_val = eol - 1; //skip trailing whitespace - while (e_val > value && isspace(*e_val)) + while (e_val > value && isspace((int)*e_val)) --e_val; if (*value == '\0') { LOG_WARN( @@ -270,17 +270,17 @@ void load_config(void) ); return; } - char buf[CONFIG_MAX_LINE_LENGTH]; + char buf[CONFIG_MAX_LINE_LENGTH + 1]; int lineNumber = 0; int nread; do { - //zero-terminate in case file is empty - buf[0] = '\0'; - nread = epic_file_read(fd, buf, sizeof(buf)); - if (nread < sizeof(buf)) { + nread = epic_file_read(fd, buf, CONFIG_MAX_LINE_LENGTH); + if (nread < CONFIG_MAX_LINE_LENGTH) { //add fake EOL to ensure termination - buf[nread] = '\n'; + buf[nread++] = '\n'; } + //zero-terminate buffer + buf[nread] = '\0'; char *line = buf; char *eol = NULL; int last_eol = 0; @@ -344,4 +344,5 @@ void load_config(void) } } } while (nread == sizeof(buf)); + epic_file_close(fd); } diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index abd7fcf5e730417a48c525defb025501a7a02486..b50e64931fbca6538d612269f6d8fbbed9716ff0 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -22,8 +22,8 @@ static int check_lock() } int epic_disp_print( - uint16_t posx, - uint16_t posy, + int16_t posx, + int16_t posy, const char *pString, uint16_t fg, uint16_t bg @@ -39,8 +39,8 @@ static const sFONT *font_map[] = { int epic_disp_print_adv( uint8_t font, - uint16_t posx, - uint16_t posy, + int16_t posx, + int16_t posy, const char *pString, uint16_t fg, uint16_t bg @@ -100,7 +100,7 @@ int epic_disp_pixels( } } -int epic_disp_pixel(uint16_t x, uint16_t y, uint16_t color) +int epic_disp_pixel(int16_t x, int16_t y, uint16_t color) { int cl = check_lock(); if (cl < 0) { @@ -113,10 +113,10 @@ int epic_disp_pixel(uint16_t x, uint16_t y, uint16_t color) } int epic_disp_line( - uint16_t xstart, - uint16_t ystart, - uint16_t xend, - uint16_t yend, + int16_t xstart, + int16_t ystart, + int16_t xend, + int16_t yend, uint16_t color, enum disp_linestyle linestyle, uint16_t pixelsize @@ -140,10 +140,10 @@ int epic_disp_line( } int epic_disp_rect( - uint16_t xstart, - uint16_t ystart, - uint16_t xend, - uint16_t yend, + int16_t xstart, + int16_t ystart, + int16_t xend, + int16_t yend, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize @@ -179,8 +179,8 @@ int epic_disp_rect( } int epic_disp_circ( - uint16_t x, - uint16_t y, + int16_t x, + int16_t y, uint16_t rad, uint16_t color, enum disp_fillstyle fillstyle, diff --git a/epicardium/modules/gpio.c b/epicardium/modules/gpio.c index 6b6977391f878fa58ad6618b98d08dcd9cf7f5a7..a923812f5f49d90604bdce150a29d01821dc9ff6 100644 --- a/epicardium/modules/gpio.c +++ b/epicardium/modules/gpio.c @@ -11,7 +11,7 @@ * Despite what the schematic (currently, 2019-08-18) says these are the correct * pins for wristband GPIO 1-4 (not 0-3 as the schematic states) */ -static gpio_cfg_t gpio_configs[] = { +gpio_cfg_t gpio_configs[] = { [EPIC_GPIO_WRISTBAND_1] = { PORT_0, PIN_21, GPIO_FUNC_OUT, diff --git a/epicardium/modules/hardware.c b/epicardium/modules/hardware.c index 370f9afbe33f00046b9d55084bb934d068cef573..800cb9c65d0334939a319f66af82af895512dd01 100644 --- a/epicardium/modules/hardware.c +++ b/epicardium/modules/hardware.c @@ -54,6 +54,13 @@ int hardware_early_init(void) */ GPIO_Init(); + /* Set the power hold pin, so the PMIC does not turn off again */ + const gpio_cfg_t pwr_hold_pin = { + PORT_0, PIN_30, GPIO_FUNC_OUT, GPIO_PAD_NONE + }; + GPIO_Config(&pwr_hold_pin); + GPIO_OutSet(&pwr_hold_pin); + /* * PMIC (MAX77650) */ @@ -187,6 +194,9 @@ int hardware_early_init(void) */ max30001_mutex_init(); + /* Allow user space to trigger interrupts. + * Used for BLE, not sure if needed. */ + SCB->CCR |= SCB_CCR_USERSETMPEND_Msk; return 0; } diff --git a/epicardium/modules/leds.c b/epicardium/modules/leds.c index aab84c86e2d80dddf7617cb1e667068421bc5753..ad08487d10d02b61e192cf6414aa4126d02f264f 100644 --- a/epicardium/modules/leds.c +++ b/epicardium/modules/leds.c @@ -95,26 +95,64 @@ void epic_leds_set_all_hsv(float *pattern_ptr, uint8_t len) void epic_leds_dim_top(uint8_t value) { leds_set_dim_top(value); - if (personal_state_enabled() == 0) + if (personal_state_enabled() == 0) { + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + leds_update(); + + hwlock_release(HWLOCK_I2C); + } } void epic_leds_dim_bottom(uint8_t value) { leds_set_dim_bottom(value); - if (personal_state_enabled() == 0) + if (personal_state_enabled() == 0) { + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + leds_update(); + + hwlock_release(HWLOCK_I2C); + } } void epic_leds_set_rocket(int led, uint8_t value) { + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + value = value > 31 ? 31 : value; pmic_set_led(led, value); + + hwlock_release(HWLOCK_I2C); +} + +int epic_leds_get_rocket(int led) +{ + int ret = 0; + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + + ret = pmic_get_led(led); + hwlock_release(HWLOCK_I2C); + return ret; } void epic_set_flashlight(bool power) { + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + leds_flashlight(power); + + hwlock_release(HWLOCK_I2C); } void epic_leds_update(void) @@ -124,7 +162,13 @@ void epic_leds_update(void) void epic_leds_set_powersave(bool eco) { + while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + leds_powersave(eco); + + hwlock_release(HWLOCK_I2C); } void epic_leds_set_gamma_table(uint8_t rgb_channel, uint8_t gamma_table[256]) diff --git a/epicardium/modules/lifecycle.c b/epicardium/modules/lifecycle.c index 650664d2e97ee15ecbd35199e176ded925a78bfb..a1f8627aa53d648bc67be12455052d6a19352910 100644 --- a/epicardium/modules/lifecycle.c +++ b/epicardium/modules/lifecycle.c @@ -364,10 +364,7 @@ void vLifecycleTask(void *pvParameters) core1_mutex = xSemaphoreCreateMutexStatic(&core1_mutex_data); if (xSemaphoreTake(core1_mutex, 0) != pdTRUE) { - LOG_CRIT( - "lifecycle", "Failed to acquire mutex after creation." - ); - vTaskDelay(portMAX_DELAY); + panic("lifecycle: Failed to acquire mutex after creation."); } LOG_DEBUG("lifecycle", "Booting core 1 ..."); diff --git a/epicardium/modules/max30001.c b/epicardium/modules/max30001.c index 811af4bf8aa274443abb1415a7586c2766660991..e3ad57da09bbcea572a336a7b5bb0a7ce343908a 100644 --- a/epicardium/modules/max30001.c +++ b/epicardium/modules/max30001.c @@ -155,13 +155,10 @@ static void max30001_handle_samples(int16_t *sensor_data, int16_t n) while (n--) { uint16_t data = -*sensor_data++; - if (xQueueSend( - max30001_stream.queue, - &data, - MAX30001_MUTEX_WAIT_MS) != pdTRUE) { - LOG_WARN( - "max30001", - "queue full"); // TODO; handle queue full + + /* Discard overflow. See discussion in !316. */ + if (xQueueSend(max30001_stream.queue, &data, 0) != pdTRUE) { + LOG_WARN("max30001", "queue full"); } } api_interrupt_trigger(EPIC_INT_MAX30001_ECG); diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build index 628249a305098911b6dfe3c861b8759d6d5a5a62..022397ca26e3866ef9a72472a7621e4cd6dbfec2 100644 --- a/epicardium/modules/meson.build +++ b/epicardium/modules/meson.build @@ -2,6 +2,7 @@ module_sources = files( 'bhi.c', 'bme680.c', 'buttons.c', + 'config.c', 'dispatcher.c', 'display.c', 'fileops.c', @@ -13,14 +14,16 @@ module_sources = files( 'light_sensor.c', 'log.c', 'max30001.c', + 'panic.c', 'personal_state.c', 'pmic.c', 'rtc.c', 'serial.c', + 'sleep.c', 'stream.c', 'trng.c', + 'usb.c', 'vibra.c', 'watchdog.c', - 'usb.c', - 'config.c', + 'ws2812.c' ) diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index 2d51f786373cea0bb108212b225df7badf0bdc25..bf59566b3e7ef168977ccf7606d55f445961da86 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -3,10 +3,15 @@ #include "FreeRTOS.h" #include "semphr.h" +#include "gpio.h" #include <stdint.h> #include <stdbool.h> +/* ---------- Panic -------------------------------------------------------- */ +void panic(const char *format, ...) + __attribute__((noreturn, format(printf, 1, 2))); + /* ---------- Dispatcher --------------------------------------------------- */ void vApiDispatcher(void *pvParameters); void dispatcher_mutex_init(void); @@ -28,7 +33,10 @@ void return_to_menu(void); void serial_init(); void vSerialTask(void *pvParameters); void serial_enqueue_char(char chr); +void serial_flush(void); extern TaskHandle_t serial_task_id; +/* Turn off the print queue and do prints synchroneous from now on. */ +void serial_return_to_synchronous(); // For the eSetBit xTaskNotify task semaphore trigger enum serial_notify{ @@ -52,6 +60,7 @@ void watchdog_clearer_init(); #define BATTERY_CRITICAL 3.40f enum pmic_amux_signal { + PMIC_AMUX_DISABLED = 0x0, PMIC_AMUX_CHGIN_U = 0x1, PMIC_AMUX_CHGIN_I = 0x2, PMIC_AMUX_BATT_U = 0x3, @@ -105,4 +114,11 @@ void vBhi160Task(void *pvParameters); void vMAX30001Task(void *pvParameters); void max30001_mutex_init(void); +/* ---------- GPIO --------------------------------------------------------- */ +#define MAX30001_MUTEX_WAIT_MS 50 +extern gpio_cfg_t gpio_configs[]; + + +/* ---------- Sleep -------------------------------------------------------- */ +void sleep_deepsleep(void); #endif /* MODULES_H */ diff --git a/epicardium/modules/panic.c b/epicardium/modules/panic.c new file mode 100644 index 0000000000000000000000000000000000000000..aa27b4de5ae7a856ed6beee6e8cc29cdab43e1bf --- /dev/null +++ b/epicardium/modules/panic.c @@ -0,0 +1,76 @@ +/* + * Panic + * ===== + * + * Under some conditions the firmware should crash and reboot automatically. + * This module provides the necessary facilities to do so. + * + * Note that a panic should indicate **only** logic-errors in the firmware or + * unrecoverable hardware conditions. + */ + +#include "modules/log.h" +#include "modules/modules.h" + +#include "card10.h" +#include "card10-version.h" + +#include <stdio.h> +#include <stdarg.h> + +void __attribute__((noreturn)) panic(const char *format, ...) +{ + /* Turn off interrupts. We won't get back from here anyway. */ + __asm volatile("cpsid i" ::: "memory"); + + /* + * Turn off asynchronous printing because that won't ever work from + * here ... + */ + serial_return_to_synchronous(); + + printf("\x1b[31;1m --- SYSTEM PANIC ---\n" + "\x1b[0;31m --- ---\n" + " --- ---\n" + "\x1b[0m A fatal error occured:\n \x1b[1m"); + + va_list ap; + va_start(ap, format); + vprintf(format, ap); + va_end(ap); + + printf("\n" + "\x1b[0m\n" + " Firmware Version:\n" + "\x1b[35m %s\n", + CARD10_VERSION); + + printf("\x1b[0m\n" + " Stack Trace:\n" + "\x1b[36m %p\n", + __builtin_return_address(0)); + + printf("\x1b[33m\n" + " Please report this error to the card10 firmware team!\n" + "\x1b[0m -> https://git.card10.badge.events.ccc.de/card10/firmware/issues/new?issue <-\n" + "\x1b[31m --- ====== ===== ---\x1b[0m\n"); + + for (int i = 0; i < 96000000; i++) { + __asm volatile("nop"); + } + + card10_reset(); +} + +void __attribute__((noreturn)) __assert_func( + const char *file, int line, const char *func, const char *failedexpr +) { + panic("Assertion failure:\n" + " \"%s\"\n" + " failed in \"%s:%d\",\n" + " function: %s()", + failedexpr, + file, + line, + func); +} diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c index 4df12ea91d49aaf666e73e609160a0bd5e3024e4..6c95fa46f193520724f04653ce985ef603a55604 100644 --- a/epicardium/modules/pmic.c +++ b/epicardium/modules/pmic.c @@ -86,7 +86,7 @@ int pmic_read_amux(enum pmic_amux_signal sig, float *result) ADC_GetData(&adc_data); /* Turn MUX back to neutral so it does not waste power. */ - MAX77650_setMUX_SEL(sig); + MAX77650_setMUX_SEL(PMIC_AMUX_DISABLED); /* Convert ADC measurement to SI Volts */ float adc_voltage = (float)adc_data / 1023.0f * 1.22f; @@ -136,37 +136,22 @@ done: * Read the interrupt flag register and handle all interrupts which the PMIC has * sent. In most cases this will be the buttons. */ -static void -pmic_poll_interrupts(TickType_t *button_start_tick, TickType_t duration) +static uint8_t pmic_poll_interrupts(void) { while (hwlock_acquire(HWLOCK_I2C, LOCK_WAIT) < 0) { LOG_WARN("pmic", "Failed to acquire I2C. Retrying ..."); - xTaskNotify(pmic_task_id, PMIC_NOTIFY_IRQ, eSetBits); - return; + vTaskDelay(pdMS_TO_TICKS(100)); } uint8_t int_flag = MAX77650_getINT_GLBL(); hwlock_release(HWLOCK_I2C); - if (int_flag & MAX77650_INT_nEN_F) { - /* Button was pressed */ - *button_start_tick = xTaskGetTickCount(); - } - if (int_flag & MAX77650_INT_nEN_R) { - /* Button was released */ - *button_start_tick = 0; - if (duration < pdMS_TO_TICKS(400)) { - return_to_menu(); - } else { - LOG_WARN("pmic", "Resetting ..."); - card10_reset(); - } - } - /* TODO: Remove when all interrupts are handled */ if (int_flag & ~(MAX77650_INT_nEN_F | MAX77650_INT_nEN_R)) { LOG_WARN("pmic", "Unhandled PMIC Interrupt: %x", int_flag); } + + return int_flag; } __attribute__((noreturn)) static void pmic_die(float u_batt) @@ -192,11 +177,13 @@ __attribute__((noreturn)) static void pmic_die(float u_batt) for (int i = 0; i < 50000000; i++) __NOP(); - LOG_WARN("pmic", "Poweroff"); - MAX77650_setSFT_RST(0x2); + /* We have some of headroom to keep the RTC going. + * The battery protection circuit will shut down + * the system at 3.0 V */ - while (1) - __WFI(); + /* TODO: Wake-up when USB is attached again */ + sleep_deepsleep(); + card10_reset(); } /* @@ -291,7 +278,9 @@ static void vPmicTimerCb(TimerHandle_t xTimer) void vPmicTask(void *pvParameters) { - pmic_task_id = xTaskGetCurrentTaskHandle(); + pmic_task_id = xTaskGetCurrentTaskHandle(); + uint8_t interrupts = 0; + uint32_t reason = 0; ADC_Init(0x9, NULL); GPIO_Config(&gpio_cfg_adc0); @@ -314,26 +303,109 @@ void vPmicTask(void *pvParameters) } xTimerStart(pmic_timer, 0); + /* Clear all pending interrupts. */ + pmic_poll_interrupts(); + while (1) { - uint32_t reason; - if (button_start_tick == 0) { - reason = ulTaskNotifyTake(pdTRUE, portMAX_DELAY); - } else { - reason = ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(100)); + interrupts |= pmic_poll_interrupts(); + if (interrupts == 0) { + reason |= ulTaskNotifyTake(pdTRUE, portMAX_DELAY); } - TickType_t duration = xTaskGetTickCount() - button_start_tick; + /* New interrupts */ + if (reason & PMIC_NOTIFY_IRQ) { + reason ^= PMIC_NOTIFY_IRQ; + interrupts |= pmic_poll_interrupts(); + } - if (button_start_tick != 0 && duration > pdMS_TO_TICKS(1000)) { - LOG_WARN("pmic", "Poweroff"); - MAX77650_setSFT_RST(0x2); + if (interrupts & MAX77650_INT_nEN_R) { + /* Ignored in this state */ + /* This can happen if the button is pressed + * during boot and released now. */ + interrupts ^= MAX77650_INT_nEN_R; /* Mark as handled. */ } - if (reason & PMIC_NOTIFY_IRQ) { - pmic_poll_interrupts(&button_start_tick, duration); + if (interrupts & MAX77650_INT_nEN_F) { + /* Button was pressed */ + interrupts ^= MAX77650_INT_nEN_F; /* Mark as handled. */ + + button_start_tick = xTaskGetTickCount(); + while (true) { + TickType_t duration = + xTaskGetTickCount() - button_start_tick; + + if (duration > 1000) { + disp_forcelock(); + epic_disp_clear(0x0000); + + char buf[20]; + sprintf(buf, + "Off in %d", + 7 - (int)(duration + 500) / + 1000); + epic_disp_print( + 0, + 0, + "Sleep zZz..", + 0xffff, + 0x0000 + ); + epic_disp_print( + 0, 25, buf, 0xf000, 0x0000 + ); + epic_disp_print( + 0, + 50, + " Reset ->", + 0xffff, + 0x0000 + ); + epic_disp_update(); + } + + if (duration >= pdMS_TO_TICKS(1000)) { + if (epic_buttons_read( + BUTTON_RIGHT_TOP)) { + serial_return_to_synchronous(); + LOG_WARN( + "pmic", + "Resetting ..." + ); + card10_reset(); + } + } + + if (interrupts & MAX77650_INT_nEN_R) { + /* Button is released */ + interrupts ^= + MAX77650_INT_nEN_R; /* Mark as handled. */ + + if (duration < pdMS_TO_TICKS(1000)) { + return_to_menu(); + } + + if (duration > pdMS_TO_TICKS(1000)) { + serial_return_to_synchronous(); + LOG_WARN("pmic", "Poweroff"); + sleep_deepsleep(); + card10_reset(); + } + break; + } + + reason |= ulTaskNotifyTake( + pdTRUE, pdMS_TO_TICKS(200) + ); + if (reason & PMIC_NOTIFY_IRQ) { + /* New interrupts */ + reason ^= PMIC_NOTIFY_IRQ; + interrupts |= pmic_poll_interrupts(); + } + } } if (reason & PMIC_NOTIFY_MONITOR) { + reason ^= PMIC_NOTIFY_MONITOR; pmic_check_battery(); } } diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c index de1ef70d26653a8b1f2441b8bf6a62a3d0124ef7..b563462dbc242194e7f931721d82fcd21d0b344e 100644 --- a/epicardium/modules/rtc.c +++ b/epicardium/modules/rtc.c @@ -9,6 +9,18 @@ #include <stdint.h> +uint64_t monotonic_offset = 0; + +uint32_t epic_rtc_get_monotonic_seconds(void) +{ + return epic_rtc_get_seconds() + monotonic_offset / 1000ULL; +} + +uint64_t epic_rtc_get_monotonic_milliseconds(void) +{ + return epic_rtc_get_milliseconds() + monotonic_offset; +} + uint32_t epic_rtc_get_seconds(void) { uint32_t sec, subsec; @@ -32,12 +44,31 @@ uint64_t epic_rtc_get_milliseconds(void) while (RTC_GetTime(&sec, &subsec) == E_BUSY) { vTaskDelay(pdMS_TO_TICKS(4)); } - return subsec * 1000ULL / 4096 + sec * 1000ULL; + + // Without the bias of 999 (0.24 milliseconds), this decoding function is + // numerically unstable: + // + // Encoding 5 milliseconds into 20 subsecs (using the encoding function in + // epic_rtc_set_milliseconds) and decoding it without the bias of 999 yields + // 4 milliseconds. + // + // The following invariants should hold when encoding / decoding from and to + // milliseconds / subseconds: + // + // - 0 <= encode(ms) < 4096 for 0 <= ms < 1000 + // - decode(encode(ms)) == ms for 0 <= ms < 1000 + // - 0 <= decode(subsec) < 1000 for 0 <= subsec < 4096 + // + // These invariants were proven experimentally. + return (subsec * 1000ULL + 999ULL) / 4096 + sec * 1000ULL; } void epic_rtc_set_milliseconds(uint64_t milliseconds) { uint32_t sec, subsec; + uint64_t old_milliseconds, diff; + + old_milliseconds = epic_rtc_get_milliseconds(); sec = milliseconds / 1000; subsec = (milliseconds % 1000); @@ -48,6 +79,9 @@ void epic_rtc_set_milliseconds(uint64_t milliseconds) ; while (RTC_EnableRTCE(MXC_RTC) == E_BUSY) ; + + diff = old_milliseconds - milliseconds; + monotonic_offset += diff; } void RTC_IRQHandler(void) diff --git a/epicardium/modules/serial.c b/epicardium/modules/serial.c index 3292ab9330c973a83243b9aad0c3e7b63a6d0200..ef5b65edda24b9ce828afcec18cb84f2ff7f27ef 100644 --- a/epicardium/modules/serial.c +++ b/epicardium/modules/serial.c @@ -46,6 +46,11 @@ void serial_init() ); } +void serial_return_to_synchronous() +{ + write_stream_buffer = NULL; +} + /* * API-call to write a string. Output goes to both CDCACM and UART */ @@ -121,6 +126,92 @@ void epic_uart_write_str(const char *str, intptr_t length) } } +static void serial_flush_from_isr(void) +{ + uint8_t rx_data[32]; + size_t received_bytes; + + BaseType_t resched = pdFALSE; + BaseType_t woken = pdFALSE; + + uint32_t basepri = __get_BASEPRI(); + taskENTER_CRITICAL_FROM_ISR(); + + do { + received_bytes = xStreamBufferReceiveFromISR( + write_stream_buffer, + (void *)rx_data, + sizeof(rx_data), + &woken + ); + resched |= woken; + + if (received_bytes == 0) { + break; + } + + /* + * The SDK-driver for UART is not reentrant + * which means we need to perform UART writes + * in a critical section. + */ + + UART_Write(ConsoleUart, (uint8_t *)&rx_data, received_bytes); + } while (received_bytes > 0); + + taskEXIT_CRITICAL_FROM_ISR(basepri); + + portYIELD_FROM_ISR(&resched); +} + +static void serial_flush_from_thread(void) +{ + uint8_t rx_data[32]; + size_t received_bytes; + + do { + taskENTER_CRITICAL(); + received_bytes = xStreamBufferReceive( + write_stream_buffer, + (void *)rx_data, + sizeof(rx_data), + 0 + ); + taskEXIT_CRITICAL(); + + if (received_bytes == 0) { + break; + } + + /* + * The SDK-driver for UART is not reentrant + * which means we need to perform UART writes + * in a critical section. + */ + taskENTER_CRITICAL(); + UART_Write(ConsoleUart, (uint8_t *)&rx_data, received_bytes); + taskEXIT_CRITICAL(); + + cdcacm_write((uint8_t *)&rx_data, received_bytes); + ble_uart_write((uint8_t *)&rx_data, received_bytes); + } while (received_bytes > 0); +} + +/* + * Flush all characters which are currently waiting to be printed. + * + * If this function is called from an ISR, it will only flush to hardware UART + * while a call from thread mode will flush to UART, CDC-ACM, and BLE Serial. + */ +void serial_flush(void) +{ + if (xPortIsInsideInterrupt()) { + serial_flush_from_isr(); + } else { + serial_flush_from_thread(); + } +} + /* * API-call to read a character from the queue. */ @@ -217,9 +308,6 @@ void vSerialTask(void *pvParameters) .callback = uart_callback, }; - uint8_t rx_data[20]; - size_t received_bytes; - while (1) { int ret = UART_ReadAsync(ConsoleUart, &read_req); if (ret != E_NO_ERROR && ret != E_BUSY) { @@ -230,38 +318,7 @@ void vSerialTask(void *pvParameters) ret = ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if (ret & SERIAL_WRITE_NOTIFY) { - do { - received_bytes = xStreamBufferReceive( - write_stream_buffer, - (void *)rx_data, - sizeof(rx_data), - 0 - ); - - if (received_bytes == 0) { - break; - } - - /* - * The SDK-driver for UART is not reentrant - * which means we need to perform UART writes - * in a critical section. - */ - taskENTER_CRITICAL(); - UART_Write( - ConsoleUart, - (uint8_t *)&rx_data, - received_bytes - ); - taskEXIT_CRITICAL(); - - cdcacm_write( - (uint8_t *)&rx_data, received_bytes - ); - ble_uart_write( - (uint8_t *)&rx_data, received_bytes - ); - } while (received_bytes > 0); + serial_flush_from_thread(); } if (ret & SERIAL_READ_NOTIFY) { diff --git a/epicardium/modules/sleep.c b/epicardium/modules/sleep.c new file mode 100644 index 0000000000000000000000000000000000000000..a87bcb0ce47cc601c96b67c247a32b933cb09393 --- /dev/null +++ b/epicardium/modules/sleep.c @@ -0,0 +1,202 @@ +#include "epicardium.h" +#include "modules/modules.h" +#include "modules/log.h" + +#include "card10.h" +#include "simo.h" +#include "lp.h" +#include "max86150.h" +#include "MAX77650-Arduino-Library.h" + +#include "max32665.h" +#include "mxc_sys.h" +#include "mxc_pins.h" + +#include <stdint.h> + +/* Most code is taken and adapted rom EvKitExamples/LP/main.c */ + +static uint32_t old_clkcn; +static uint32_t old_perckcn0, old_perckcn1; + +void GPIOWAKE_IRQHandler(void) +{ + /* Nothing to do here */ +} + +static void switchToHIRC(void) +{ + MXC_GCR->clkcn &= ~(MXC_S_GCR_CLKCN_PSC_DIV128); + MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV4; + MXC_GCR->clkcn |= MXC_F_GCR_CLKCN_HIRC_EN; + + MXC_SETFIELD( + MXC_GCR->clkcn, + MXC_F_GCR_CLKCN_CLKSEL, + MXC_S_GCR_CLKCN_CLKSEL_HIRC + ); + + while (!(MXC_GCR->clkcn & MXC_F_GCR_CLKCN_CKRDY)) + ; /* Wait for the clock switch to occur */ + + /* Disable the now unused 96 MHz clock */ + MXC_GCR->clkcn &= ~(MXC_F_GCR_CLKCN_HIRC96M_EN); + + SystemCoreClockUpdate(); +} + +static void deepsleep(void) +{ + SIMO_setVregO_B(810); /* Reduce VCOREB to 0.81 V */ + LP_FastWakeupEnable(); + LP_EnterDeepSleepMode(); + SIMO_setVregO_B(1000); /* Restore VCOREB to 1 V */ +} + +static void turnOffClocks(void) +{ + old_perckcn0 = MXC_GCR->perckcn0; + old_perckcn1 = MXC_GCR->perckcn1; + + /* Allow the USB Switch to be turned off in deepsleep and backup modes. */ + /* TODO: should this be the default setting? */ + LP_USBSWLPDisable(); + + /* Disable all peripheral clocks except GPIO0 (needed for interrupt wakeup) */ + MXC_GCR->perckcn0 = 0xFFFFFFFE; + MXC_GCR->perckcn1 = 0xFFFFFFFF; +} + +static void turnOnClocks(void) +{ + MXC_GCR->perckcn0 = old_perckcn0; + MXC_GCR->perckcn1 = old_perckcn1; +} + +/* + * Move most GPIOs into a special low power state with the fact + * in mind that the external 3.3 V are switched off. + * + * E.g. this means that the SD card pins need to be pulled low + * to preven them from backfeeding into the 3.3 V rail via their + * external pull-up resistors. + * + * Pins needed to talk to the PMIC are left untouched. + * ECG AOUT and 32 kHz out as well. + */ +static void gpio_low_power(void) +{ + /* clang-format off */ + const gpio_cfg_t pins_low_power[] = { + { PORT_0, PIN_0, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // FLash + { PORT_0, PIN_1, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Flash + { PORT_0, PIN_2, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Flash + { PORT_0, PIN_3, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Flash + { PORT_0, PIN_4, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Flash + { PORT_0, PIN_5, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Flash + { PORT_0, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // I2C 3.3V + { PORT_0, PIN_7, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // I2C 3.3V + { PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // Motor + { PORT_0, PIN_9, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // UART TX + { PORT_0, PIN_10, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // UART RX + { PORT_0, PIN_11, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // BMA400 interrupt + // 0, 12: PMIC IRQ + { PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_NONE }, // BHI160 interrupt, not sure if PP + // 0, 14: PMIC I2C + // 0, 15: PMIC I2C + { PORT_0, PIN_16, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // PMIC AMUX + { PORT_0, PIN_17, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // SOA GPIO + // 0, 18: ECG AOUT + // 0, 19: 32 kHz + { PORT_0, PIN_20, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // Wristband 1 + { PORT_0, PIN_21, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // Wristband 2 + { PORT_0, PIN_22, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // Wristband 3 + { PORT_0, PIN_23, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // IR-LED + { PORT_0, PIN_24, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // display SS + { PORT_0, PIN_25, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // display MOSI + { PORT_0, PIN_26, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // SOA GPIO + { PORT_0, PIN_27, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // display SCK + { PORT_0, PIN_28, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // Backlight + { PORT_0, PIN_29, GPIO_FUNC_IN, GPIO_PAD_PULL_DOWN }, // Wristband 4 + // 0, 30: PMIC power hold + { PORT_0, PIN_31, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // ECG switch + + { PORT_1, PIN_0, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_1, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_2, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_3, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_4, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_5, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // SDHC + { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // display RS + { PORT_1, PIN_7, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // Portexpander interrupt + { PORT_1, PIN_8, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // ECG CS TODO: better OUT high + { PORT_1, PIN_9, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // ECG SDI + { PORT_1, PIN_10, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // ECG SDO + { PORT_1, PIN_11, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // ECG SCK + { PORT_1, PIN_11, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, // ECG INT + { PORT_1, PIN_13, GPIO_FUNC_IN, GPIO_PAD_NONE }, // PPG Interrupt + { PORT_1, PIN_14, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // RGB LEDs + { PORT_1, PIN_15, GPIO_FUNC_OUT, GPIO_PAD_NONE }, // RGB LEDs + }; + /* clang-format on */ + + const unsigned int num_pins = + (sizeof(pins_low_power) / sizeof(gpio_cfg_t)); + int i; + for (i = 0; i < num_pins; i++) { + GPIO_OutClr(&pins_low_power[i]); + GPIO_Config(&pins_low_power[i]); + } +} + +/* + * Go to deepsleep, turning off peripherals. + * + * This functions returns after waking up again. + * Currently the only wakeup source is an interrupt + * from the PMIC. + * + * Some peripherals and GPIOs are moved into a low + * power state before going to sleep. There is no guarantee + * that all peripherals will be moved to a low power state + * + * TODO: Move BHI160, BMA400, BME680, MAX30001 into a low + * power state. + * + * The state of the GPIOs and generally all peripherials + * on board is not restored after a wakeup. + */ +void sleep_deepsleep(void) +{ + LOG_WARN("pmic", "Powersave"); + epic_disp_backlight(0); + epic_leds_set_rocket(0, 0); + epic_leds_set_rocket(1, 0); + epic_leds_set_rocket(2, 0); +#if 1 + /* This will fail if there is no + * harmonic board attached */ + max86150_begin(); + max86150_getINT1(); + max86150_getINT2(); + max86150_shutDown(); +#endif + MAX77650_setEN_SBB2(0b100); + MAX77650_setSBIA_LPM(true); + core1_stop(); + MAX77650_getINT_GLBL(); + gpio_low_power(); + turnOffClocks(); + old_clkcn = MXC_GCR->clkcn; + switchToHIRC(); + deepsleep(); + + /* Now wait for an interrupt to wake us up */ + + turnOnClocks(); + MXC_GCR->clkcn = old_clkcn; + while (!(MXC_GCR->clkcn & MXC_F_GCR_CLKCN_CKRDY)) + ; /* Wait for the clock switch to occur */ + SystemCoreClockUpdate(); + MAX77650_setEN_SBB2(0b110); +} diff --git a/epicardium/modules/stream.h b/epicardium/modules/stream.h index 1b4cba074035c6b8d6e276f9b01b5c0fecbe19f3..ca6bc0f6bae04dc0c33a79686aade0dda523a327 100644 --- a/epicardium/modules/stream.h +++ b/epicardium/modules/stream.h @@ -4,14 +4,15 @@ #include <stdint.h> #ifndef __SPHINX_DOC -/* stddef.h is not recognized by hawkmoth for some odd reason */ +/* Some headers are not recognized by hawkmoth for some odd reason */ #include <stddef.h> -#else -typedef unsigned int size_t; -#endif /* __SPHINX_DOC */ #include "FreeRTOS.h" #include "queue.h" +#else +typedef unsigned int size_t; +typedef void *QueueHandle_t; +#endif /* __SPHINX_DOC */ /* Time to wait for the descriptor table lock to become available */ #define STREAM_MUTEX_WAIT pdMS_TO_TICKS(100) @@ -27,6 +28,7 @@ typedef unsigned int size_t; enum stream_descriptor { /** BHI160 */ SD_BHI160_ACCELEROMETER, + SD_BHI160_MAGNETOMETER, SD_BHI160_ORIENTATION, SD_BHI160_GYROSCOPE, SD_MAX30001_ECG, diff --git a/epicardium/modules/vibra.c b/epicardium/modules/vibra.c index dd7c3131d88f5d1a656a1371ea2f2bda0ac7098c..8b10d19b64815d7ae9d46b8bbc58bb60b74be065 100644 --- a/epicardium/modules/vibra.c +++ b/epicardium/modules/vibra.c @@ -6,7 +6,8 @@ static const gpio_cfg_t motor_pin = { PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE }; -static TimerHandle_t vibra_timer; +static StaticTimer_t vibra_timer_data; +static TimerHandle_t vibra_timer = NULL; void epic_vibra_set(int status) { @@ -25,8 +26,19 @@ void vTimerCallback() void epic_vibra_vibrate(int millis) { int ticks = millis * (configTICK_RATE_HZ / 1000); - epic_vibra_set(1); - vibra_timer = - xTimerCreate("vibratimer", ticks, pdFALSE, 0, vTimerCallback); - xTimerStart(vibra_timer, 0); + + if (vibra_timer == NULL) { + vibra_timer = xTimerCreateStatic( + "vibratimer", + ticks, + pdFALSE, + 0, + vTimerCallback, + &vibra_timer_data + ); + } + if (vibra_timer != NULL) { + epic_vibra_set(1); + xTimerChangePeriod(vibra_timer, ticks, 0); + } } diff --git a/epicardium/modules/ws2812.c b/epicardium/modules/ws2812.c new file mode 100644 index 0000000000000000000000000000000000000000..9221b6a223d55b03798159538dae412961c3d59e --- /dev/null +++ b/epicardium/modules/ws2812.c @@ -0,0 +1,76 @@ +#include "leds.h" +#include "pmic.h" +#include "FreeRTOS.h" +#include "task.h" +#include "epicardium.h" +#include "max32665.h" +#include "gpio.h" +#include "modules.h" + +#include <stdbool.h> + +#define OVERHEAD 33 + +#define EPIC_WS2812_ZERO_HIGH_TICKS (34 - OVERHEAD) +#define EPIC_WS2812_ZERO_LOW_TICKS (86 - OVERHEAD) +#define EPIC_WS2812_ONE_HIGH_TICKS (86 - OVERHEAD) +#define EPIC_WS2812_ONE_LOW_TICKS (34 - OVERHEAD) +#define EPIC_WS2812_RESET_TCKS (4800 - OVERHEAD) + +static volatile uint32_t counter = 0; + +static inline __attribute__((always_inline)) void +epic_ws2812_delay_ticks(uint32_t ticks) +{ + counter = ticks; + while (--counter) { + }; +} + +static inline __attribute__((always_inline)) void +epic_ws2812_transmit_bit(gpio_cfg_t *pin, uint8_t bit) +{ + if (bit != 0) { + GPIO_OutSet(pin); + epic_ws2812_delay_ticks(EPIC_WS2812_ONE_HIGH_TICKS); + GPIO_OutClr(pin); + epic_ws2812_delay_ticks(EPIC_WS2812_ONE_LOW_TICKS); + } else { + GPIO_OutSet(pin); + epic_ws2812_delay_ticks(EPIC_WS2812_ZERO_HIGH_TICKS); + GPIO_OutClr(pin); + epic_ws2812_delay_ticks(EPIC_WS2812_ZERO_LOW_TICKS); + } +} + +static inline __attribute__((always_inline)) void +epic_ws2812_transmit_byte(gpio_cfg_t *pin, uint8_t byte) +{ + epic_ws2812_transmit_bit(pin, byte & 0b10000000); + epic_ws2812_transmit_bit(pin, byte & 0b01000000); + epic_ws2812_transmit_bit(pin, byte & 0b00100000); + epic_ws2812_transmit_bit(pin, byte & 0b00010000); + epic_ws2812_transmit_bit(pin, byte & 0b00001000); + epic_ws2812_transmit_bit(pin, byte & 0b00000100); + epic_ws2812_transmit_bit(pin, byte & 0b00000010); + epic_ws2812_transmit_bit(pin, byte & 0b00000001); +} + +void epic_ws2812_write(uint8_t pin, uint8_t *pixels, uint32_t n_bytes) +{ + uint8_t *pixels_end = pixels + n_bytes; + gpio_cfg_t *pin_cfg = &gpio_configs[pin]; + + taskENTER_CRITICAL(); + + epic_gpio_set_pin_mode(pin, EPIC_GPIO_MODE_OUT); + + do { + epic_ws2812_transmit_byte(pin_cfg, *pixels); + } while (++pixels != pixels_end); + + GPIO_OutClr(pin_cfg); + epic_ws2812_delay_ticks(EPIC_WS2812_RESET_TCKS); + + taskEXIT_CRITICAL(); +} diff --git a/epicardium/support.c b/epicardium/support.c index e6925203767dc84ddc44e7c56c9e932f8464f4a1..ac58cf03170eb09b1dc96b0a66b036a155bdc73f 100644 --- a/epicardium/support.c +++ b/epicardium/support.c @@ -117,5 +117,5 @@ void vApplicationGetTimerTaskMemory( void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName) { - LOG_CRIT("rtos", "Task \"%s\" overflowed stack!", pcTaskName); + panic("Task \"%s\" overflowed stack!", pcTaskName); } diff --git a/epicardium/version-splash.h b/epicardium/version-splash.h new file mode 100644 index 0000000000000000000000000000000000000000..81d232a125efd8c55816849b604079aebc3e6907 --- /dev/null +++ b/epicardium/version-splash.h @@ -0,0 +1,12802 @@ +const unsigned char version_splash[] = { +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0x00, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0x20, 0xfe, +0xa0, 0xed, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x39, +0x00, 0xf6, +0x20, 0xfe, +0x20, 0xfe, +0xa0, 0xc4, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x28, +0xc0, 0xed, +0x60, 0xb4, +0x20, 0xfe, +0x00, 0xd5, +0xe0, 0xf5, +0x00, 0xa4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x40, 0xdd, +0xe0, 0xcc, +0x40, 0x08, +0x20, 0xfe, +0x60, 0xb4, +0xc0, 0x49, +0x00, 0xfe, +0x40, 0x83, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0xc0, 0xc4, +0x80, 0xe5, +0xa0, 0x18, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x60, 0x62, +0x20, 0xfe, +0xa0, 0x6a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xb4, +0xc0, 0xf5, +0x00, 0x29, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x40, 0x83, +0x20, 0xfe, +0xe0, 0x51, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x93, +0x00, 0xfe, +0xa0, 0x41, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xa3, +0xe0, 0xf5, +0x40, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x7a, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x80, 0xbc, +0xa0, 0xed, +0xe0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x10, +0x20, 0xd5, +0x40, 0xdd, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x41, +0x00, 0xfe, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x18, +0xe0, 0xa3, +0xe0, 0xf5, +0x20, 0xfe, +0x20, 0xfe, +0x40, 0xdd, +0x80, 0x62, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x18, +0x80, 0xe5, +0xa0, 0xc4, +0x20, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x29, +0xc0, 0xf5, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x40, 0x5a, +0x20, 0xd5, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0xb4, +0x80, 0xe5, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xfe, +0x20, 0xac, +0xc0, 0x20, +0x00, 0x00, +0x20, 0x31, +0xe0, 0xf5, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x10, 0x84, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0x51, 0x8c, +0xe7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x65, 0x29, +0xaa, 0x52, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xaa, 0x52, +0x8a, 0x52, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xaa, 0x52, +0xaa, 0x52, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x18, +0x60, 0xe5, +0xe0, 0xcc, +0xe0, 0x20, +0x00, 0xa4, +0xe0, 0xf5, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xa0, 0xed, +0xa0, 0x41, +0x00, 0x00, +0x20, 0x00, +0x80, 0x93, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0xe5, +0xc0, 0x72, +0xa0, 0x41, +0x00, 0xfe, +0x60, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xae, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0x00, 0xd5, +0x20, 0xfe, +0x80, 0xe5, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0xe5, +0xa0, 0xc4, +0x00, 0xfe, +0xa0, 0xc4, +0xa0, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x49, +0xc0, 0xed, +0x80, 0xe5, +0xa0, 0xc4, +0x00, 0xf6, +0x20, 0xfe, +0x00, 0xfe, +0x80, 0xe5, +0x20, 0xfe, +0xa0, 0x6a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x79, 0xce, +0xd7, 0xbd, +0xd7, 0xbd, +0xd7, 0xbd, +0xd7, 0xbd, +0xd7, 0xbd, +0xd7, 0xbd, +0xaa, 0x52, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0x80, 0xe5, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xfe, +0x40, 0xac, +0x20, 0x31, +0x20, 0xac, +0x20, 0xfe, +0x20, 0x83, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x20, +0xe0, 0xcc, +0xe0, 0xf5, +0x20, 0x5a, +0x60, 0x62, +0x40, 0xdd, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x69, 0x4a, +0x51, 0x8c, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0x51, 0x8c, +0x51, 0x8c, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x62, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xf6, +0x60, 0x8b, +0x80, 0x39, +0x40, 0xdd, +0xa0, 0xed, +0xc0, 0x49, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x08, +0xa0, 0x93, +0x20, 0xfe, +0xc0, 0x9b, +0xe0, 0x51, +0xe0, 0xcc, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x18, +0x20, 0xfe, +0xc0, 0xc4, +0xc0, 0xf5, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0xdd, +0xa0, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x62, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xd5, +0x40, 0xdd, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xfe, +0x60, 0x62, +0x00, 0x00, +0x60, 0x8b, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x28, +0x20, 0xd5, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x08, +0x00, 0x00, +0x00, 0xd5, +0x60, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa6, 0x31, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xe7, 0x39, +0x8a, 0x52, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0x49, 0x4a, +0xeb, 0x5a, +0xc7, 0x39, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0x69, 0x4a, +0x49, 0x4a, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x86, 0x31, +0x8a, 0x52, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x45, 0x29, +0x69, 0x4a, +0xe7, 0x39, +0x82, 0x10, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x65, 0x29, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0x49, 0x4a, +0x49, 0x4a, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa6, 0x31, +0x8a, 0x52, +0x28, 0x42, +0x41, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xdd, +0x20, 0x83, +0x00, 0x00, +0xe0, 0x7a, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xf6, +0xa0, 0xc4, +0x80, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0xe0, 0xf5, +0xe0, 0xf5, +0x20, 0xfe, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xf5, +0xa0, 0x6a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x0c, 0x63, +0xff, 0xff, +0x34, 0xa5, +0x18, 0xc6, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xb6, 0xb5, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x51, 0x8c, +0xbe, 0xf7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x9e, 0xf7, +0x51, 0x8c, +0x00, 0x00, +0x00, 0x00, +0xcb, 0x5a, +0x55, 0xad, +0x5d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x9e, 0xf7, +0x6d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x4d, 0x6b, +0x9e, 0xf7, +0x6d, 0x6b, +0xdb, 0xde, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xfb, 0xde, +0x2c, 0x63, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0x18, 0xc6, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x18, 0xc6, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xaa, 0x52, +0xdf, 0xff, +0x14, 0xa5, +0x59, 0xce, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xb6, 0xb5, +0xe3, 0x18, +0x00, 0x00, +0x4d, 0x6b, +0x5d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x5d, 0xef, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xbc, +0xc0, 0x9b, +0x00, 0x00, +0x40, 0x83, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0x62, +0x60, 0xdd, +0xa0, 0xed, +0x80, 0x41, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x8b, +0x20, 0xfe, +0xe0, 0xa3, +0x00, 0xd5, +0x20, 0xfe, +0x00, 0xfe, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0xe0, 0x49, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xeb, 0x5a, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xdf, 0xff, +0xdb, 0xde, +0x18, 0xc6, +0xbe, 0xf7, +0xff, 0xff, +0x59, 0xce, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x34, 0xa5, +0xff, 0xff, +0xff, 0xff, +0x59, 0xce, +0x55, 0xad, +0x59, 0xce, +0xdf, 0xff, +0xd3, 0x9c, +0x00, 0x00, +0x00, 0x00, +0xd3, 0x9c, +0xff, 0xff, +0xff, 0xff, +0x5d, 0xef, +0xd7, 0xbd, +0x38, 0xc6, +0xff, 0xff, +0xff, 0xff, +0xcf, 0x7b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xdf, 0xff, +0x9a, 0xd6, +0x1c, 0xe7, +0xff, 0xff, +0xdf, 0xff, +0x65, 0x29, +0x00, 0x00, +0x61, 0x08, +0xfb, 0xde, +0xff, 0xff, +0x9e, 0xf7, +0x18, 0xc6, +0xfb, 0xde, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xcb, 0x5a, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x79, 0xce, +0x59, 0xce, +0xdf, 0xff, +0xff, 0xff, +0xdb, 0xde, +0x51, 0x8c, +0xff, 0xff, +0xff, 0xff, +0xfb, 0xde, +0xd7, 0xbd, +0x1c, 0xe7, +0xff, 0xff, +0xdf, 0xff, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xa3, +0x80, 0xbc, +0x00, 0x00, +0x80, 0x93, +0x20, 0xfe, +0x20, 0xfe, +0x40, 0xb4, +0x60, 0x10, +0x60, 0xb4, +0x00, 0xfe, +0xe0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x80, 0xbc, +0x00, 0xfe, +0xa0, 0x6a, +0x00, 0x00, +0x20, 0xfe, +0x00, 0xfe, +0x20, 0xfe, +0x00, 0x00, +0x20, 0x29, +0x20, 0xfe, +0x20, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xff, 0xff, +0x8e, 0x73, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0x1c, 0xe7, +0xff, 0xff, +0xeb, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x28, 0x42, +0xff, 0xff, +0xdf, 0xff, +0x49, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xc3, 0x18, +0x00, 0x00, +0x00, 0x00, +0xc7, 0x39, +0x4d, 0x6b, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xcb, 0x5a, +0xdf, 0xff, +0xdf, 0xff, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0xff, 0xff, +0x10, 0x84, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x8a, 0x52, +0x6d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0xef, 0x7b, +0xff, 0xff, +0x79, 0xce, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0x71, 0x8c, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0xcf, 0x7b, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0x79, 0xce, +0xff, 0xff, +0xff, 0xff, +0xbe, 0xf7, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x75, 0xad, +0xff, 0xff, +0x75, 0xad, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x83, +0x40, 0xdd, +0x00, 0x00, +0xc0, 0x9b, +0x20, 0xfe, +0x60, 0xdd, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x72, +0x20, 0xfe, +0x00, 0xa4, +0x40, 0x08, +0x40, 0x31, +0x60, 0xe5, +0x80, 0xe5, +0x40, 0x39, +0x00, 0x00, +0xa0, 0x6a, +0x20, 0xfe, +0x00, 0xd5, +0x20, 0xfe, +0x00, 0x00, +0xc0, 0x49, +0x20, 0xfe, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x92, 0x94, +0x2c, 0x63, +0x2c, 0x63, +0x2c, 0x63, +0x2c, 0x63, +0xeb, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x4d, 0x6b, +0xff, 0xff, +0x34, 0xa5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd3, 0x9c, +0xff, 0xff, +0x30, 0x84, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x92, 0x94, +0xff, 0xff, +0xb2, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x38, 0xc6, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x45, 0x29, +0xff, 0xff, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x24, 0x21, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x62, +0x00, 0xfe, +0x00, 0x00, +0x00, 0xa4, +0x20, 0xfe, +0x20, 0x83, +0x20, 0xfe, +0x80, 0x41, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x49, +0xc0, 0xed, +0x80, 0xe5, +0x00, 0xfe, +0x80, 0xbc, +0x80, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0xd5, +0x00, 0xfe, +0xe0, 0x9b, +0x20, 0xfe, +0x00, 0x00, +0x80, 0x6a, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x3c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x28, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xf7, 0xbd, +0xff, 0xff, +0x49, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x86, 0x31, +0xff, 0xff, +0xdb, 0xde, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xe7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xbe, 0xf7, +0xff, 0xff, +0xc3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x41, +0x20, 0xfe, +0x80, 0x18, +0x40, 0xac, +0x20, 0xfe, +0x40, 0x08, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x20, +0x20, 0xfe, +0x00, 0xcd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x20, 0xfe, +0xc0, 0xc4, +0x80, 0x93, +0x20, 0xfe, +0x20, 0x00, +0x40, 0x8b, +0x20, 0xd5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x3c, 0xe7, +0xfb, 0xde, +0xfb, 0xde, +0xfb, 0xde, +0xfb, 0xde, +0x59, 0xce, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xef, 0x7b, +0x14, 0xa5, +0x92, 0x94, +0x6d, 0x6b, +0x45, 0x29, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x20, +0x20, 0xfe, +0x40, 0x31, +0x60, 0xbc, +0x00, 0xfe, +0x00, 0x00, +0x40, 0xdd, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x72, +0x20, 0xfe, +0xe0, 0x51, +0x40, 0x8b, +0x20, 0xfe, +0x80, 0x10, +0x00, 0xa4, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x8a, 0x52, +0xbe, 0xf7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x08, +0x20, 0xfe, +0x00, 0x52, +0xa0, 0xc4, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x7b, +0x20, 0xfe, +0xa0, 0x41, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xdd, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x7b, +0x20, 0xfe, +0xc0, 0x20, +0xc0, 0xc4, +0xa0, 0x9b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x45, 0x29, +0xbe, 0xf7, +0xff, 0xff, +0x96, 0xb5, +0x6d, 0x6b, +0xef, 0x7b, +0x96, 0xb5, +0xdf, 0xff, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xed, +0xc0, 0x72, +0xc0, 0xc4, +0x00, 0xf6, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0xc0, 0x72, +0x20, 0xfe, +0x40, 0x31, +0x80, 0xe5, +0x00, 0x7b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xb2, 0x94, +0xff, 0xff, +0x14, 0xa5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x24, 0x21, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xcc, +0x80, 0x93, +0x00, 0xcd, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x40, 0xdd, +0x00, 0xf6, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x83, +0x20, 0xfe, +0xc0, 0x49, +0x00, 0x00, +0x80, 0x62, +0x20, 0xfe, +0xa0, 0x41, +0x20, 0xfe, +0x40, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x59, 0xce, +0xff, 0xff, +0xe7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x40, 0xb4, +0x20, 0xd5, +0xc0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x7a, +0x20, 0xfe, +0xe0, 0x49, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x60, 0xdd, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0x80, 0x6a, +0x20, 0xfe, +0x80, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x18, 0xc6, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xba, 0xd6, +0xff, 0xff, +0x65, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0xff, 0xff, +0x9e, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x8b, +0x00, 0xcd, +0x40, 0xdd, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x20, 0x08, +0x20, 0xfe, +0xa0, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x49, +0x20, 0xfe, +0x60, 0x8b, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x08, 0x42, +0xff, 0xff, +0xf7, 0xbd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xf7, 0xbd, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xba, 0xd6, +0xff, 0xff, +0x65, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xdb, 0xde, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xdf, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0xa0, 0xed, +0x60, 0xe5, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xd5, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0x40, 0x8b, +0x20, 0xfe, +0x80, 0x39, +0x00, 0x00, +0x00, 0x00, +0x60, 0x39, +0x20, 0xfe, +0x40, 0xac, +0x20, 0xfe, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x69, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xeb, 0x5a, +0xff, 0xff, +0x75, 0xad, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd3, 0x9c, +0xff, 0xff, +0x30, 0x84, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x38, 0xc6, +0xff, 0xff, +0x49, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xdf, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x59, 0xce, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xbe, 0xf7, +0xff, 0xff, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0x20, 0xfe, +0xa0, 0xed, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0x20, 0xfe, +0xe0, 0x51, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xac, +0x00, 0x00, +0x60, 0xe5, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x29, +0x20, 0xfe, +0xe0, 0xcc, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0x2c, 0x63, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xff, 0xff, +0x8a, 0x52, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0x9a, 0xd6, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x28, 0x42, +0xff, 0xff, +0xbe, 0xf7, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x30, 0x84, +0xff, 0xff, +0xf7, 0xbd, +0x41, 0x08, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0x30, 0x84, +0xff, 0xff, +0xdf, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0xb6, 0xb5, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xcb, 0x5a, +0xff, 0xff, +0xbe, 0xf7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x34, 0xa5, +0xff, 0xff, +0x96, 0xb5, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x41, 0x08, +0x6d, 0x6b, +0xff, 0xff, +0xff, 0xff, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x31, +0x20, 0xfe, +0xe0, 0xf5, +0x60, 0xdd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x20, 0xfe, +0xa0, 0xc4, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x80, 0x10, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x20, +0x20, 0xfe, +0xa0, 0xed, +0xc0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x30, 0x84, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x7d, 0xef, +0x96, 0xb5, +0x14, 0xa5, +0x1c, 0xe7, +0xff, 0xff, +0xfb, 0xde, +0x41, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x14, 0xa5, +0xff, 0xff, +0xff, 0xff, +0x18, 0xc6, +0xd3, 0x9c, +0xb6, 0xb5, +0x9e, 0xf7, +0x14, 0xa5, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0x5d, 0xef, +0xff, 0xff, +0x1c, 0xe7, +0x55, 0xad, +0x59, 0xce, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xe7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0x5d, 0xef, +0xff, 0xff, +0xdb, 0xde, +0xf3, 0x9c, +0x96, 0xb5, +0x5d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xdf, 0xff, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xbe, 0xf7, +0xff, 0xff, +0xfb, 0xde, +0xf3, 0x9c, +0x75, 0xad, +0x7d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x28, 0x42, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xd5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xd5, +0x00, 0xfe, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x80, 0x93, +0x20, 0xfe, +0x40, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x10, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0xa4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x7d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x30, 0x84, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0xdf, 0xff, +0x5d, 0xef, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xba, 0xd6, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xff, 0xff, +0x92, 0x94, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x30, 0x84, +0xbe, 0xf7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x38, 0xc6, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa6, 0x31, +0x3c, 0xe7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xba, 0xd6, +0x18, 0xc6, +0x9e, 0xf7, +0xc7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xff, 0xff, +0x1c, 0xe7, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc7, 0x39, +0x1c, 0xe7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x3c, 0xe7, +0x59, 0xce, +0xff, 0xff, +0x0c, 0x63, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0xff, 0xff, +0xff, 0xff, +0x61, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe7, 0x39, +0x3c, 0xe7, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0xff, 0xff, +0x9a, 0xd6, +0xd7, 0xbd, +0xff, 0xff, +0xcb, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0xff, 0xff, +0xff, 0xff, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xff, 0xff, +0xff, 0xff, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x5d, 0xef, +0xff, 0xff, +0x24, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xf5, +0x20, 0xfe, +0x00, 0xd5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x6a, +0x20, 0xfe, +0x00, 0x52, +0x20, 0xfe, +0x20, 0xac, +0x80, 0xe5, +0xc0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xfe, +0x40, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x04, 0x21, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x20, 0x00, +0x08, 0x42, +0x4d, 0x6b, +0xae, 0x73, +0x69, 0x4a, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe3, 0x18, +0x86, 0x31, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0x8a, 0x52, +0x2c, 0x63, +0x8a, 0x52, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x61, 0x08, +0xaa, 0x52, +0xae, 0x73, +0xeb, 0x5a, +0x65, 0x29, +0x00, 0x00, +0x20, 0x00, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x04, 0x21, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x41, 0x08, +0x8a, 0x52, +0x6d, 0x6b, +0xcb, 0x5a, +0x86, 0x31, +0x00, 0x00, +0x41, 0x08, +0x49, 0x4a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x86, 0x31, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x28, 0x42, +0x2c, 0x63, +0x8a, 0x52, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0xc7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x86, 0x31, +0x86, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x86, 0x31, +0x86, 0x31, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x65, 0x29, +0x86, 0x31, +0x41, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xdd, +0x20, 0xfe, +0xe0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x20, 0xfe, +0xc0, 0xc4, +0x20, 0xfe, +0x60, 0xbc, +0x20, 0xfe, +0x00, 0xa4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0x6a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0xbc, +0x20, 0xfe, +0xa0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xd5, +0x00, 0xfe, +0x20, 0xfe, +0xc0, 0xed, +0x20, 0xfe, +0x00, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x49, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x9b, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x6a, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x7b, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x9b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xfe, +0x20, 0xfe, +0x60, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x62, +0x20, 0xfe, +0x00, 0xa4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xcc, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xfe, +0x00, 0xfe, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x41, +0x20, 0xfe, +0xc0, 0x9b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x40, 0x39, +0xc0, 0x9b, +0x20, 0xfe, +0x00, 0xfe, +0xa0, 0x41, +0xe0, 0x20, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xf5, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x28, +0x20, 0xfe, +0xe0, 0xcc, +0x80, 0x93, +0x60, 0xb4, +0x20, 0xd5, +0xe0, 0xf5, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0xe5, +0xc0, 0xc4, +0xe0, 0xa3, +0x20, 0x83, +0x00, 0xfe, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0xff, 0xff, +0x7d, 0xef, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0x00, 0xfe, +0xe0, 0xcc, +0x20, 0xac, +0x40, 0x8b, +0x80, 0x6a, +0xc0, 0x49, +0xe0, 0x28, +0x20, 0x83, +0x20, 0xfe, +0xe0, 0xf5, +0xc0, 0x20, +0x60, 0x39, +0x20, 0x5a, +0xe0, 0x7a, +0xc0, 0x9b, +0x80, 0xbc, +0x40, 0xdd, +0x20, 0xfe, +0x00, 0xfe, +0x40, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0x82, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0xa0, 0xed, +0x20, 0xfe, +0x60, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xdd, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x41, +0x20, 0xfe, +0x20, 0xfe, +0xa0, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x00, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x40, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x39, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xa0, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xa3, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x49, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x62, +0x20, 0xfe, +0x40, 0xb4, +0x20, 0xfe, +0xa0, 0xed, +0xc0, 0x9b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xa3, +0x20, 0xd5, +0x20, 0xfe, +0x40, 0xdd, +0x20, 0xfe, +0xe0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x10, +0xe0, 0xf5, +0xe0, 0xf5, +0x00, 0xfe, +0x00, 0xac, +0xa0, 0xed, +0x80, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x04, 0x21, +0xe3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa2, 0x10, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x82, 0x10, +0x45, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x20, +0xc0, 0xf5, +0x80, 0x93, +0xa0, 0x93, +0x20, 0xfe, +0x00, 0x7b, +0xe0, 0xf5, +0x40, 0x08, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0xe0, 0xf5, +0xc0, 0x72, +0x20, 0xfe, +0x20, 0xac, +0xa0, 0xed, +0x20, 0x83, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x6a, +0x00, 0xf6, +0x60, 0xb4, +0x20, 0xfe, +0x80, 0x10, +0x80, 0xe5, +0x40, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x71, 0x8c, +0xdf, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x6d, 0x6b, +0x9e, 0xf7, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x4d, 0x6b, +0x9e, 0xf7, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xbc, +0x40, 0xdd, +0x40, 0x08, +0x20, 0xac, +0x20, 0xfe, +0x80, 0x10, +0x00, 0xfe, +0x60, 0x62, +0x00, 0x00, +0x00, 0x00, +0x60, 0x62, +0x00, 0xfe, +0x80, 0x18, +0x20, 0xfe, +0x20, 0xac, +0x60, 0x8b, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xcd, +0xe0, 0xa3, +0x80, 0x93, +0x20, 0xfe, +0x40, 0x08, +0xa0, 0x41, +0x20, 0xfe, +0x40, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x72, +0x00, 0xfe, +0x40, 0x31, +0x00, 0x00, +0xa0, 0xc4, +0x00, 0xfe, +0x00, 0x00, +0x20, 0xac, +0xc0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xc4, +0x40, 0xb4, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0xe0, 0x28, +0x20, 0xfe, +0xc0, 0x49, +0x00, 0x00, +0x40, 0x31, +0x20, 0xfe, +0x80, 0x41, +0xe0, 0x72, +0x20, 0xfe, +0x00, 0x29, +0x00, 0x00, +0xa0, 0x93, +0xc0, 0xf5, +0xc0, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x29, +0x00, 0xf6, +0x00, 0x7b, +0x00, 0x00, +0x00, 0x00, +0x20, 0xd5, +0xe0, 0xf5, +0x00, 0x00, +0xc0, 0x49, +0x20, 0xfe, +0x20, 0x29, +0xe0, 0x20, +0x20, 0xfe, +0xe0, 0x49, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0xc0, 0xc4, +0x20, 0xac, +0x00, 0x00, +0xa0, 0x93, +0x60, 0xdd, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0xe0, 0x51, +0x00, 0x00, +0x40, 0x08, +0x40, 0xdd, +0xa0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x00, 0xd5, +0xe0, 0xcc, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0xe5, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x60, 0xe5, +0x80, 0x93, +0x40, 0x83, +0xa0, 0xed, +0x20, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x60, 0x62, +0x00, 0xfe, +0xc0, 0x20, +0xc0, 0xed, +0xe0, 0x7a, +0x00, 0x00, +0x60, 0x39, +0x20, 0xfe, +0xa0, 0x6a, +0x00, 0x00, +0x00, 0x00, +0x40, 0x31, +0x00, 0xfe, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x8b, +0xe0, 0xf5, +0xe0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xed, +0x40, 0xdd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x83, +0xc0, 0xed, +0x80, 0xe5, +0x60, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x40, 0x08, +0xe0, 0xf5, +0x20, 0xac, +0x00, 0xfe, +0xa0, 0x18, +0x00, 0x00, +0x80, 0x10, +0x20, 0xfe, +0x40, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x83, +0x00, 0xfe, +0x20, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0x20, 0xfe, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xf6, +0xe0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x18, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x29, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x9b, +0xe0, 0xf5, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0xe0, 0xa3, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x60, 0xdd, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0x20, 0xfe, +0xc0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xed, +0xc0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x51, +0x20, 0xfe, +0x20, 0x83, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x20, 0xfe, +0xc0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x20, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0x41, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0xe0, 0xa3, +0x00, 0x00, +0x00, 0x00, +0x40, 0x5a, +0x20, 0xfe, +0xc0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0xa0, 0xe5, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xf5, +0xe0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xc4, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x20, 0xfe, +0x40, 0x8b, +0x00, 0x00, +0x80, 0x10, +0xa0, 0xed, +0x60, 0xb4, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x60, 0x8b, +0x40, 0xdd, +0xc0, 0xed, +0xa0, 0x93, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xed, +0x40, 0xdd, +0x00, 0x00, +0x00, 0x00, +0x40, 0x31, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xed, +0x20, 0xd5, +0x20, 0xfe, +0xc0, 0x72, +0x00, 0x00, +0x60, 0x39, +0x20, 0xfe, +0xa0, 0x6a, +0x00, 0x00, +0x00, 0xac, +0x80, 0xe5, +0xc0, 0x18, +0x20, 0xfe, +0x00, 0x52, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xc4, +0xe0, 0xa3, +0x40, 0x62, +0x20, 0xfe, +0xa0, 0x41, +0x00, 0x00, +0x60, 0xe5, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x00, +0x80, 0xe5, +0x00, 0xfe, +0xc0, 0xf5, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xcd, +0x60, 0x8b, +0xc0, 0xed, +0x00, 0xf6, +0x20, 0x00, +0x40, 0x5a, +0x20, 0xfe, +0xe0, 0x49, +0xc0, 0x49, +0x20, 0xfe, +0xe0, 0x51, +0x00, 0x00, +0x40, 0xdd, +0x40, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xf5, +0xa0, 0x6a, +0x00, 0x00, +0x80, 0xbc, +0x40, 0xdd, +0x20, 0x08, +0x00, 0xd5, +0xe0, 0xf5, +0x00, 0x00, +0x80, 0x6a, +0x20, 0xfe, +0x80, 0x93, +0x20, 0xfe, +0x00, 0x52, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xb4, +0x20, 0xac, +0xe0, 0x51, +0x20, 0xfe, +0xe0, 0xa3, +0xe0, 0x7a, +0x20, 0xfe, +0x60, 0x39, +0x80, 0xe5, +0x20, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0xa4, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xac, +0x00, 0x00, +0x00, 0x29, +0x20, 0xfe, +0x40, 0x39, +0x00, 0x00, +0xc0, 0x18, +0xe0, 0xf5, +0x40, 0x83, +0xa0, 0xc4, +0x00, 0xfe, +0x20, 0x00, +0xe0, 0xf5, +0xc0, 0xf5, +0x00, 0x29, +0x20, 0xfe, +0x40, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x93, +0xc0, 0xcc, +0x00, 0x00, +0x20, 0xd5, +0x20, 0xfe, +0x00, 0xa4, +0x20, 0xfe, +0xe0, 0xa3, +0xc0, 0xf5, +0xa0, 0x18, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0xc0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xac, +0x00, 0x00, +0x40, 0x62, +0x00, 0xfe, +0x20, 0x08, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0x00, 0xfe, +0xe0, 0xcc, +0x20, 0xfe, +0xe0, 0xa3, +0x20, 0xfe, +0x40, 0x5a, +0xc0, 0x49, +0x20, 0xfe, +0x80, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x7a, +0x80, 0xe5, +0x00, 0x00, +0xe0, 0x28, +0x20, 0xfe, +0x00, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x40, 0x62, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x39, +0x20, 0xfe, +0xe0, 0x20, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xac, +0x00, 0x00, +0xa0, 0x93, +0x00, 0xcd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xcc, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xd5, +0x00, 0x00, +0x80, 0x6a, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x5a, +0x20, 0xfe, +0x20, 0x00, +0x00, 0x00, +0x40, 0xb4, +0x20, 0xfe, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0x00, +0xe0, 0xcc, +0xc0, 0x9b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x29, +0x00, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x29, +0x00, 0x00, +0x60, 0x8b, +0x20, 0xd5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x39, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xd5, +0x60, 0x8b, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x20, 0x00, +0x00, 0xf6, +0x60, 0x62, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xa3, +0x20, 0xfe, +0xa0, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x60, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x20, +0x20, 0xfe, +0x60, 0x39, +0x00, 0x00, +0x00, 0x00, +0x20, 0xdd, +0xe0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x9b, +0xc0, 0xc4, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x40, 0x31, +0x20, 0xfe, +0x20, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x18, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xcc, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x6d, 0x6b, +0x79, 0xce, +0x79, 0xce, +0xa2, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x00, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x20, 0x00, +0xe0, 0xf5, +0x80, 0x62, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x6a, +0xe0, 0xf5, +0x00, 0x00, +0x20, 0xfe, +0x40, 0xb4, +0x80, 0x6a, +0x00, 0xf6, +0x20, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0xdd, +0x20, 0x83, +0x00, 0x00, +0x00, 0x00, +0xa0, 0xed, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x30, 0x84, +0xff, 0xff, +0xff, 0xff, +0xc3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0xe5, +0xe0, 0x72, +0x00, 0x00, +0x40, 0x31, +0x20, 0xfe, +0x20, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x31, +0x20, 0xfe, +0x00, 0x29, +0x20, 0xfe, +0x40, 0xb4, +0xc0, 0x9b, +0xc0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x60, 0xb4, +0x00, 0x00, +0x40, 0x08, +0x20, 0xfe, +0x00, 0x52, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x1c, 0xe7, +0xff, 0xff, +0x08, 0x42, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x30, 0x84, +0xff, 0xff, +0xff, 0xff, +0xc3, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xd7, 0xbd, +0xff, 0xff, +0x4d, 0x6b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x96, 0xb5, +0xff, 0xff, +0x8e, 0x73, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xcc, +0x80, 0x93, +0x00, 0x00, +0xa0, 0x6a, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x08, +0x00, 0xfe, +0x60, 0x62, +0x20, 0xfe, +0x40, 0xb4, +0x00, 0xd5, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x7a, +0xa0, 0xed, +0x00, 0x00, +0x00, 0x29, +0x20, 0xfe, +0x40, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xcf, 0x7b, +0x51, 0x8c, +0x04, 0x21, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa6, 0x31, +0x2c, 0x63, +0x2c, 0x63, +0x41, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x0c, 0x63, +0x51, 0x8c, +0xc7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xeb, 0x5a, +0x51, 0x8c, +0xe7, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x40, 0xb4, +0x00, 0x00, +0xe0, 0xa3, +0xa0, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xcc, +0xa0, 0x93, +0x20, 0xfe, +0x60, 0xb4, +0x00, 0xfe, +0x40, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x41, +0x20, 0xfe, +0xa0, 0x18, +0xc0, 0x49, +0x20, 0xfe, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x93, +0xe0, 0xcc, +0x00, 0x00, +0x40, 0xdd, +0x40, 0x83, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x9b, +0xe0, 0xcc, +0x20, 0xfe, +0x00, 0xd5, +0x20, 0xfe, +0x00, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x10, +0x20, 0xfe, +0xe0, 0x49, +0xa0, 0x6a, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x72, +0xa0, 0xed, +0x60, 0x10, +0x20, 0xfe, +0xe0, 0x51, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x62, +0x00, 0xfe, +0x20, 0xfe, +0xc0, 0xed, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0xe5, +0x20, 0x83, +0x60, 0x8b, +0x00, 0xd5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x52, +0x20, 0xfe, +0x00, 0x52, +0x20, 0xfe, +0xa0, 0x18, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0x31, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0xfe, +0xa0, 0xc4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xac, +0x40, 0xb4, +0x20, 0xac, +0x40, 0xb4, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0x39, +0x20, 0xfe, +0x00, 0xa4, +0x60, 0xe5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0xf5, +0x20, 0xfe, +0x20, 0xfe, +0x60, 0x8b, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x7b, +0x80, 0xe5, +0xe0, 0xcc, +0x80, 0x93, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x18, +0x20, 0xfe, +0xe0, 0xf5, +0x00, 0xac, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xc4, +0x20, 0xfe, +0x20, 0xfe, +0x20, 0x5a, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0x49, +0x20, 0xfe, +0x00, 0xf6, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xfe, +0x20, 0xfe, +0xc0, 0x72, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x93, +0x20, 0xfe, +0x20, 0xfe, +0xc0, 0x20, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x20, 0xfe, +0x20, 0xfe, +0x00, 0x52, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x60, 0xe5, +0x20, 0xfe, +0x60, 0x39, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0x5a, +0x20, 0xfe, +0xe0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0xe5, +0x20, 0xfe, +0x20, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xc0, 0xc4, +0x00, 0xfe, +0x20, 0x08, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x29, +0x20, 0xfe, +0x40, 0xdd, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x40, 0xb4, +0x20, 0xfe, +0x60, 0x10, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0xa4, +0xe0, 0xcc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x20, 0xfe, +0x80, 0xbc, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x83, +0xc0, 0xf5, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xe0, 0x20, +0x20, 0x31, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0xa0, 0x72, +0x00, 0x29, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x80, 0x10, +0x80, 0x41, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +0x00, 0x00, +}; diff --git a/hw-tests/dual-core/main.c b/hw-tests/dual-core/main.c index 60636833753d48b3812833266f01876297037a1d..30026b8051f1e64f775dbcee8df46fd7b1d8615b 100644 --- a/hw-tests/dual-core/main.c +++ b/hw-tests/dual-core/main.c @@ -3,27 +3,34 @@ ******************************************************************************/ /***** Includes *****/ -#include "pmic.h" -#include "leds.h" #include "card10.h" +#include "leds.h" +#include "pmic.h" -#include "gfx.h" #include "display.h" +#include "gfx.h" #include "tmr_utils.h" -#include <stdio.h> +#include <Heart.h> #include <stdint.h> +#include <stdio.h> #include <string.h> -#include <Heart.h> int main(void) { card10_init(); card10_diag(); - gfx_copy_region_raw( - &display_screen, 0, 0, 160, 80, 2, (const void *)(Heart) + gfx_copy_region( + &display_screen, + 0, + 0, + 160, + 80, + GFX_RAW, + sizeof(Heart), + (const void *)(Heart) ); gfx_update(&display_screen); diff --git a/hw-tests/hello-world/main.c b/hw-tests/hello-world/main.c index 87fdab3ba7d8bf33eea462ce5b71d0bf1eacbd5e..5f2a82aad5b14a52cfa94ee3e3f6acf891a3dfa3 100644 --- a/hw-tests/hello-world/main.c +++ b/hw-tests/hello-world/main.c @@ -30,8 +30,15 @@ int main(void) card10_init(); card10_diag(); - gfx_copy_region_raw( - &display_screen, 0, 0, 160, 80, 2, (const void *)(Heart) + gfx_copy_region( + &display_screen, + 0, + 0, + 160, + 80, + GFX_RAW, + sizeof(Heart), + (const void *)(Heart) ); gfx_update(&display_screen); diff --git a/hw-tests/ips/main.c b/hw-tests/ips/main.c index 6aa51eae2c518e69219f7e16af89e39b33a4cb24..b638a7832310f0d681c57f979001b595fe1e140c 100644 --- a/hw-tests/ips/main.c +++ b/hw-tests/ips/main.c @@ -37,22 +37,24 @@ int main(void) gfx_line(&display_screen, 100, 10, 70, 40, 2, yellow); gfx_circle(&display_screen, 85, 25, 22, 2, green); - gfx_copy_region_raw( + gfx_copy_region( &display_screen, 120, 0, 40, 40, - 2, + GFX_RAW, + 40 * 40 * 2, (const void *)(gImage_40X40) ); - gfx_copy_region_raw( + gfx_copy_region( &display_screen, 0, 0, 160, 80, - 2, + GFX_RAW, + 160 * 80 * 2, (const void *)(gImage_160X80) ); gfx_update(&display_screen); diff --git a/init.gdb b/init.gdb index 607cb82bdfaf5e5e42d02947c8cf8925c6e44af3..151639c28de0a9e45f48486e27638c249ec4c2df 100644 --- a/init.gdb +++ b/init.gdb @@ -3,3 +3,33 @@ target remote localhost:3333 define reset mon mww 0x40000004 0x80000000 end + + +# usage: task_backtrace <tskTCB*> +define task_backtrace + set $taskbt_task_ptr = $arg0 + set $taskbt_stack_ptr = $taskbt_task_ptr->pxTopOfStack + + set $taskbt_frame_offset = 9 + if ((*(uint32_t*)($taskbt_stack_ptr + 8)) & 0x10 == 0) + echo FPU is on\n + set $taskbt_frame_offset += 16 + else + echo FPU is off\n + end + + set $taskbt_reg_lr = $lr + set $taskbt_reg_pc = $pc + set $taskbt_reg_sp = $sp + + set $lr = *($taskbt_stack_ptr + $taskbt_frame_offset + 5) + set $pc = *($taskbt_stack_ptr + $taskbt_frame_offset + 6) + set $sp = $taskbt_stack_ptr + $taskbt_frame_offset + 8 + + bt + + set $lr = $taskbt_reg_lr + set $pc = $taskbt_reg_pc + set $sp = $taskbt_reg_sp +end +alias tbt = task_backtrace diff --git a/l0dables/lib/crt.s b/l0dables/lib/crt.s index 57726cb566590e7b6ed90f9b5f71ae095ca55fa7..79e32651572581b5aa9fdaa8b26e7a1b8cf67f3d 100644 --- a/l0dables/lib/crt.s +++ b/l0dables/lib/crt.s @@ -184,7 +184,8 @@ DefaultHandler: b . .macro def_irq_handler handler_name - .weakref \handler_name, DefaultHandler + .weak \handler_name + \handler_name : b . .endm /* diff --git a/lib/card10/card10.c b/lib/card10/card10.c index 371912d5909ce5f479f7761ea3fe5b5d87e159e0..43361ef06fbf76323516b68e5fdead7f7b9febd9 100644 --- a/lib/card10/card10.c +++ b/lib/card10/card10.c @@ -29,6 +29,10 @@ const gpio_cfg_t bhi_interrupt_pin = { PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }; +static const gpio_cfg_t pwr_hold_pin = { + PORT_0, PIN_30, GPIO_FUNC_OUT, GPIO_PAD_NONE +}; + void card10_init(void) { printf("card10 init...\n"); @@ -41,6 +45,8 @@ void card10_init(void) I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL); GPIO_Init(); + GPIO_Config(&pwr_hold_pin); + GPIO_OutSet(&pwr_hold_pin); pmic_init(); pmic_set_led(0, 0); @@ -215,9 +221,10 @@ void core1_stop(void) void card10_poll(void) { pmic_poll(); + portexpander_poll(); } -void card10_reset(void) +void __attribute__((noreturn)) card10_reset(void) { printf("Resetting ...\n"); /* @@ -228,6 +235,9 @@ void card10_reset(void) __asm volatile("nop"); } MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM; + + while (1) + __WFI(); } void GPIO0_IRQHandler(void) diff --git a/lib/card10/card10.h b/lib/card10/card10.h index fc90fe67f47527cbdbcf2a0b30a9c9d53d70d3df..192058f02a76361323e10c50d2e20f6a5a26f427 100644 --- a/lib/card10/card10.h +++ b/lib/card10/card10.h @@ -15,5 +15,5 @@ void core1_start(void *isr); void core1_stop(void); void card10_poll(void); -void card10_reset(void); +void card10_reset(void) __attribute__((noreturn)); #endif diff --git a/lib/card10/display.c b/lib/card10/display.c index f5fd471579a41a0ea520f35594dd0553b089490d..4cc3b4113684ebafdbe66d9414f70c27467b7fe7 100644 --- a/lib/card10/display.c +++ b/lib/card10/display.c @@ -22,7 +22,7 @@ void display_set_reset_pin(uint8_t state) if (!portexpander_detected()) { MAX77650_setDO(state ? true : false); } else { - portexpander_set(4, state); + portexpander_out_put(PIN_4, state ? 0xFF : 0); } } diff --git a/lib/card10/leds.c b/lib/card10/leds.c index d21049cfd6cf1337ee9eccee9627da6487fb91e2..f74e3100823410f8cd8485196481e3ce3624432c 100644 --- a/lib/card10/leds.c +++ b/lib/card10/leds.c @@ -285,10 +285,7 @@ static uint8_t power_pin_conversion(uint8_t group) static void power_all(void) { - for (int i = 0; i < 3; i++) { - portexpander_prep(i, 0); - } - portexpander_update(); + portexpander_out_clr(PIN_0 | PIN_1 | PIN_2); } void leds_update_power(void) @@ -301,14 +298,14 @@ void leds_update_power(void) if (new_groups == active_groups) { return; } - for (int i = 0; i < 3; i++) { - if (i < new_groups) { - portexpander_prep(power_pin_conversion(i), 0); - } else { - portexpander_prep(power_pin_conversion(i), 1); - } + + uint8_t out_val = 0; + for (int i = new_groups; i < 3; ++i) { + out_val |= (1 << power_pin_conversion(i)); } - portexpander_update(); + + portexpander_out_put(PIN_0 | PIN_1 | PIN_2, out_val); + if (active_groups < new_groups) { for (int i = 0; i < powerup_wait_cycles; i++) { __NOP(); @@ -343,7 +340,7 @@ void leds_update(void) void leds_flashlight(bool power) { - portexpander_set(7, (power) ? 0 : 1); + portexpander_out_put(PIN_7, (power) ? 0 : 0xFF); } void leds_set_gamma_table(uint8_t rgb_channel, uint8_t table[256]) diff --git a/lib/card10/pb.c b/lib/card10/pb.c index 42525527a86aa117121638863c47b5f20b271a3f..a9a9c18f97fa6844367a073294fc05fcda54daa7 100644 --- a/lib/card10/pb.c +++ b/lib/card10/pb.c @@ -40,6 +40,10 @@ #include "portexpander.h" #include "MAX77650-Arduino-Library.h" #include <stddef.h> + +static const uint8_t expander_pins[] = { 5, 0x0, 3, 6 }; +static pb_callback pb_callbacks[4] = { NULL }; + /******************************************************************************/ int PB_Init(void) { @@ -59,24 +63,71 @@ int PB_Init(void) return retval; } +static void pe_pb_callback(gpio_int_pol_t edge_type, void *cbdata) +{ + unsigned int pb = (unsigned int)cbdata; + if (pb_callbacks[pb - 1]) { + pb_callbacks[pb - 1](pb, edge_type == GPIO_INT_FALLING); + } +} + +static void gpio_pb_callback(void *cbdata) +{ + unsigned int pb = (unsigned int)cbdata; + if (pb_callbacks[pb - 1]) { + int level = GPIO_InGet(&pb_pin[pb - 1]); + pb_callbacks[pb - 1](pb, !level); + } +} + /******************************************************************************/ int PB_RegisterCallback(unsigned int pb, pb_callback callback) { - MXC_ASSERT(pb < num_pbs); + MXC_ASSERT((pb > 0) && (pb <= num_pbs)); + + if (pb == 2) { + return E_INVALID; + } + + pb_callbacks[pb - 1] = callback; + + uint8_t mask = (1 << expander_pins[pb - 1]); - // TODO: portexpander support if (callback) { - // Register callback - GPIO_RegisterCallback(&pb_pin[pb], callback, (void *)pb); + if (portexpander_detected()) { + // Register callback + portexpander_register_callback( + mask, pe_pb_callback, (void *)pb + ); + + // Configure and enable interrupt + portexpander_int_config(mask, GPIO_INT_BOTH); + portexpander_int_enable(mask); + } else { + // Register callback + GPIO_RegisterCallback( + &pb_pin[pb - 1], gpio_pb_callback, (void *)pb + ); - // Configure and enable interrupt - GPIO_IntConfig(&pb_pin[pb], GPIO_INT_EDGE, GPIO_INT_FALLING); - GPIO_IntEnable(&pb_pin[pb]); - NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pb_pin[pb].port)); + // Configure and enable interrupt + GPIO_IntConfig( + &pb_pin[pb - 1], GPIO_INT_EDGE, GPIO_INT_BOTH + ); + GPIO_IntEnable(&pb_pin[pb - 1]); + NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ( + pb_pin[pb - 1].port) + ); + } } else { - // Disable interrupt and clear callback - GPIO_IntDisable(&pb_pin[pb]); - GPIO_RegisterCallback(&pb_pin[pb], NULL, NULL); + if (portexpander_detected()) { + // Disable interrupt and clear callback + portexpander_int_disable(mask); + portexpander_register_callback(mask, NULL, NULL); + } else { + // Disable interrupt and clear callback + GPIO_IntDisable(&pb_pin[pb - 1]); + GPIO_RegisterCallback(&pb_pin[pb - 1], NULL, NULL); + } } return E_NO_ERROR; @@ -85,25 +136,46 @@ int PB_RegisterCallback(unsigned int pb, pb_callback callback) //****************************************************************************** void PB_IntEnable(unsigned int pb) { - // TODO: portexpander support - MXC_ASSERT(pb < num_pbs); - GPIO_IntEnable(&pb_pin[pb]); + MXC_ASSERT((pb > 0) && (pb <= num_pbs)); + if (pb == 2) { + return; + } + + if (portexpander_detected()) { + portexpander_int_enable((1 << expander_pins[pb - 1])); + } else { + GPIO_IntEnable(&pb_pin[pb - 1]); + } } //****************************************************************************** void PB_IntDisable(unsigned int pb) { - // TODO: portexpander support - MXC_ASSERT(pb < num_pbs); - GPIO_IntDisable(&pb_pin[pb]); + MXC_ASSERT((pb > 0) && (pb <= num_pbs)); + if (pb == 2) { + return; + } + + if (portexpander_detected()) { + portexpander_int_disable((1 << expander_pins[pb - 1])); + } else { + GPIO_IntDisable(&pb_pin[pb - 1]); + } } //****************************************************************************** void PB_IntClear(unsigned int pb) { - // TODO: portexpander support - MXC_ASSERT(pb < num_pbs); - GPIO_IntClr(&pb_pin[pb]); + MXC_ASSERT((pb > 0) && (pb <= num_pbs)); + if (pb == 2) { + return; + } + + if (portexpander_detected()) { + portexpander_int_clr((1 << expander_pins[pb - 1])); + } else { + GPIO_IntClr(&pb_pin[pb - 1]); + } } //****************************************************************************** @@ -116,8 +188,8 @@ int PB_Get(unsigned int pb) case 3: case 4: if (portexpander_detected()) { - uint8_t port = portexpander_get(); - return (port & (1 << expander_pins[pb - 1])) == 0; + return portexpander_in_get( + (1 << expander_pins[pb - 1])) == 0; } else { return GPIO_InGet(&pb_pin[pb - 1]) == 0; } diff --git a/lib/card10/pb.h b/lib/card10/pb.h new file mode 100644 index 0000000000000000000000000000000000000000..cd9a05138254d46e931d76a62746687577b78f52 --- /dev/null +++ b/lib/card10/pb.h @@ -0,0 +1,145 @@ +/** + * @file pb.h + * @brief Pushbutton driver header file. + */ +/* **************************************************************************** + * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES + * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of Maxim Integrated + * Products, Inc. shall not be used except as stated in the Maxim Integrated + * Products, Inc. Branding Policy. + * + * The mere transfer of this software does not imply any licenses + * of trade secrets, proprietary technology, copyrights, patents, + * trademarks, maskwork rights, or any other form of intellectual + * property whatsoever. Maxim Integrated Products, Inc. retains all + * ownership rights. + * + * $Date: 2018-10-31 15:32:51 +0000 (Wed, 31 Oct 2018) $ + * $Revision: 38826 $ + * + *************************************************************************** */ + +#ifndef _PB_H_ +#define _PB_H_ + +#include "gpio.h" + +#include <stdbool.h> + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @ingroup bsp + * @defgroup pushbutton_evkit Push button driver board support + * @{ + */ +/* **** Global Variables **** */ +extern const gpio_cfg_t pb_pin[]; +extern const unsigned int num_pbs; + +/* **** Function Prototypes **** */ + +/** + * @brief Initialize all push buttons. + * @return \c #E_NO_ERROR Push buttons initialized successfully. + * @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful. + * + */ +int PB_Init(void); + +/** + * Type alias @c pb_callback for the push button callback. + * @details The function is of type: + * @code + * void pb_callback(unsigned int pb, bool falling) + * @endcode + * To receive notification of a push button event, define a callback + * function and pass it as a pointer to the PB_RegisterCallback(unsigned int pb, pb_callback callback) function. + * @param pb push button index that triggered the callback. + */ +typedef void (*pb_callback)(unsigned int pb, bool falling); + +/** + * @brief Register or Unregister a callback handler for events on the @p pb push button. + * @details + * - Calling this function with a pointer to a function @p callback, configures the pushbutton @p pb and enables the + * interrupt to handle the push button events. + * - Calling this function with a <tt>NULL</tt> pointer will disable the interrupt and unregister the + * callback function. + * @p pb must be a value between 0 and \c num_pbs. + * + * @param pb push button index to receive event callbacks. + * @param callback Callback function pointer of type @c pb_callback + * @return #E_NO_ERROR if configured and callback registered successfully. + * @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful. + */ +int PB_RegisterCallback(unsigned int pb, pb_callback callback); + +/** + * @brief Register or Unregister a callback handler for rising and falling events on the @p pb push button. + * @details + * - Calling this function with a pointer to a function @p callback, configures the pushbutton @p pb and enables the + * interrupt to handle the push button events. + * - Calling this function with a <tt>NULL</tt> pointer will disable the interrupt and unregister the + * callback function. + * @p pb must be a value between 0 and \c num_pbs. + * + * @param pb push button index to receive event callbacks. + * @param callback Callback function pointer of type @c pb_callback + * @return #E_NO_ERROR if configured and callback registered successfully. + * @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful. + */ +int PB_RegisterRiseFallCallback(unsigned int pb, pb_callback callback); + +/** + * @brief Enable a callback interrupt. + * @note PB_RegisterCallback must be called prior to enabling the callback interrupt. + * @param pb push button index value between 0 and \c num_pbs. + */ +void PB_IntEnable(unsigned int pb); + +/** + * @brief Disable a callback interrupt. + * @param pb push button index + */ +void PB_IntDisable(unsigned int pb); + +/** + * @brief Clear a callback interrupt. + * @param pb push button index value between 0 and \c num_pbs. + */ +void PB_IntClear(unsigned int pb); + +/** + * @brief Get the current state of the push button. + * @param pb push button index value between 0 and \c num_pbs. + * @return TRUE The button is pressed. + * @return FALSE The button is not pressed. + */ +int PB_Get(unsigned int pb); +/**@}*/ +#ifdef __cplusplus +} +#endif + +#endif /* _PB_H_ */ diff --git a/lib/card10/pmic.c b/lib/card10/pmic.c index 5927ff55f8cbe7aa6efec7d5920affe44cabcb75..609efc1cebd8afbe4c2b910116d3192f34cef3ee 100644 --- a/lib/card10/pmic.c +++ b/lib/card10/pmic.c @@ -1,8 +1,10 @@ #include "i2c.h" #include "pmic.h" +#include "lp.h" #include "MAX77650-Arduino-Library.h" #include <stdint.h> #include <stdio.h> +#include <errno.h> static const gpio_cfg_t pmic_interrupt_pin = { PORT_0, PIN_12, GPIO_FUNC_IN, GPIO_PAD_PULL_UP @@ -44,7 +46,7 @@ void pmic_init(void) //MAX77650_setTV_SBB2(0b110100); //Set output Voltage of SBB2 to 5.0V MAX77650_setTV_SBB2(0b010010); //Set output Voltage of SBB2 to 3.3V #endif - MAX77650_setADE_SBB2(0b0); //Disable Active Discharge at SBB2 Output + MAX77650_setADE_SBB2(0b1); //Enable Active Discharge at SBB2 Output MAX77650_setEN_SBB2( 0b110); //Enable SBB2 is on irrespective of FPS whenever the on/off controller is in its "On via Software" or "On via On/Off Controller" states @@ -89,6 +91,8 @@ void pmic_init(void) ); NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pmic_interrupt_pin.port)); + /* Allow the PMIC to interrupt us in deepsleep */ + LP_EnableGPIOWakeup((gpio_cfg_t *)&pmic_interrupt_pin); /* Setup power button interrupt */ MAX77650_setINT_M_GLBL(~(MAX77650_INT_nEN_R | MAX77650_INT_nEN_F)); /* Clear existing interrupts */ @@ -123,6 +127,20 @@ void pmic_set_button_callback(pmic_button_callback_fn cb) pmic_button_callback = cb; } +int pmic_get_led(uint8_t led) +{ + if (led == 0) { + return MAX77650_getBRT_LED0(); + } + if (led == 1) { + return MAX77650_getBRT_LED1(); + } + if (led == 2) { + return MAX77650_getBRT_LED2(); + } + return -EINVAL; +} + void pmic_set_led(uint8_t led, uint8_t val) { if (led == 0) { diff --git a/lib/card10/pmic.h b/lib/card10/pmic.h index f913c99b7342dbe65b389c8172c88d25020cec9a..f58a192307ecb619bf251d3282d60b9dbeeab5bf 100644 --- a/lib/card10/pmic.h +++ b/lib/card10/pmic.h @@ -21,6 +21,7 @@ void pmic_init(void); void pmic_set_led(uint8_t led, uint8_t val); +int pmic_get_led(uint8_t led); void pmic_poll(void); /* weak, so it can be overwritten by applications */ diff --git a/lib/card10/portexpander.c b/lib/card10/portexpander.c index c6a8c302292828c5796d6b8f95a82fc1a9db8e26..8d4c3891244a8f80b9fe24ab74682c2ccfdd43c0 100644 --- a/lib/card10/portexpander.c +++ b/lib/card10/portexpander.c @@ -1,5 +1,10 @@ +/* PCAL6408A I2C port expander */ + +/* **** Includes **** */ #include "portexpander.h" +#include "mxc_config.h" +#include "mxc_assert.h" #include "i2c.h" #include <stdio.h> @@ -7,10 +12,7 @@ #include <string.h> #include <stdbool.h> -// PCAL6408A I2C port expander - -static bool detected = false; -static uint8_t output_state; +/* **** Definitions **** */ /* clang-format off */ #define PE_ADDR 0x42 @@ -40,95 +42,295 @@ static uint8_t output_state; #define PE_INPUT_MASK ((uint8_t)0b01101000) // 3, 5, 6 = input +/* **** Globals **** */ + +static bool detected = false; + +static volatile bool interrupt_pending; + +static uint8_t type_state = 0xFF; +static uint8_t output_state = 0xFF; +static uint8_t pull_enable_state = 0x00; +static uint8_t pull_selection_state = 0xFF; +static uint8_t int_mask_state = 0xFF; + +static gpio_int_pol_t int_edge_config[8] = { 0 }; + +static pe_callback callbacks[8] = { NULL }; +static void *cbparam[8] = { NULL }; + +const gpio_cfg_t pe_int_pin = { PORT_1, PIN_7, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }; + +static const portexpander_cfg_t pe_pin_config[] = { + { PE_INPUT_MASK, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }, + { ~PE_INPUT_MASK, GPIO_FUNC_OUT, GPIO_PAD_PULL_UP }, +}; + +/* **** Functions **** */ + static int portexpander_write(uint8_t command, uint8_t data) { uint8_t i2c_data[2] = { command, data }; return I2C_MasterWrite(MXC_I2C1_BUS0, PE_ADDR, i2c_data, 2, 0); } +/* ************************************************************************** */ static int portexpander_read(uint8_t command, uint8_t *data) { I2C_MasterWrite(MXC_I2C1_BUS0, PE_ADDR, &command, 1, 1); return I2C_MasterRead(MXC_I2C1_BUS0, PE_ADDR, data, 1, 0); } -void portexpander_init(void) +/* ************************************************************************** */ +int portexpander_init(void) { int ret; - // Enable pull-ups for buttons (type defaults to pull-up) - ret = portexpander_write(PE_C_PULL_ENABLE, PE_INPUT_MASK); - + // Set _all_ outputs to open-drain to support the high side p-channel transistors. + ret = portexpander_write(PE_C_OUTPUT_PORT_CONFIG, PE_OUT_OPEN_DRAIN); if (ret != 2) { printf("portexpander NOT detected\n"); detected = false; - return; + return E_NO_DEVICE; } detected = true; - // Set _all_ outputs to open-drain to support the high side p-channel transistors. - portexpander_write(PE_C_OUTPUT_PORT_CONFIG, PE_OUT_OPEN_DRAIN); + // Set outputs to high + portexpander_out_set(~PE_INPUT_MASK); + // Enable pull-ups for buttons // Enable outputs for the transistors, the LED and the LCD reset - portexpander_write(PE_C_CONFIG, PE_INPUT_MASK); + for (int i = 0; i < sizeof(pe_pin_config) / sizeof(pe_pin_config[0]); + i++) { + ret = portexpander_config(&pe_pin_config[i]); + MXC_ASSERT(ret == E_NO_ERROR); + } + + // Latch inputs so we can figure out whether an interrupt was caused by a rising or falling edge + portexpander_write(PE_C_INPUT_LATCH, PE_INPUT_MASK); + + // Configure interrupt GPIO + MXC_ASSERT(GPIO_Config(&pe_int_pin) == E_NO_ERROR); + + // Configure and enable portexpander interrupt + GPIO_RegisterCallback( + &pe_int_pin, &portexpander_interrupt_callback, NULL + ); + MXC_ASSERT( + GPIO_IntConfig(&pe_int_pin, GPIO_INT_EDGE, GPIO_INT_FALLING) == + E_NO_ERROR); + GPIO_IntEnable(&pe_int_pin); + NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pe_int_pin.port)); + + return E_SUCCESS; +} - // Set outputs to high (i.e. open-drain) - output_state = ~PE_INPUT_MASK; - portexpander_write(PE_C_OUTPUT_PORT, output_state); +/* ************************************************************************** */ +int portexpander_config(const portexpander_cfg_t *cfg) +{ + // Set the GPIO type + switch (cfg->func) { + case GPIO_FUNC_IN: + type_state |= cfg->mask; + break; + case GPIO_FUNC_OUT: + type_state &= ~cfg->mask; + break; + default: + return E_BAD_PARAM; + } + + if (portexpander_write(PE_C_CONFIG, type_state) != 2) { + return E_NO_DEVICE; + } + + switch (cfg->pad) { + case GPIO_PAD_NONE: + pull_enable_state &= ~cfg->mask; + break; + case GPIO_PAD_PULL_UP: + pull_selection_state |= cfg->mask; + pull_enable_state |= cfg->mask; + break; + case GPIO_PAD_PULL_DOWN: + pull_selection_state &= ~cfg->mask; + pull_enable_state |= cfg->mask; + break; + default: + return E_BAD_PARAM; + } + + portexpander_write(PE_C_PULL_SEL, pull_selection_state); + portexpander_write(PE_C_PULL_ENABLE, pull_enable_state); + + return E_NO_ERROR; } -uint8_t portexpander_get(void) +/* ************************************************************************** */ +uint8_t portexpander_in_get(uint8_t mask) { + // Reading the input port clears interrupts, so we need to check them here to avoid losing information + portexpander_poll(); + uint8_t buf = 0xFF; if (detected) { portexpander_read(PE_C_INPUT_PORT, &buf); } - return buf; + return buf & mask; } +/* ************************************************************************** */ bool portexpander_detected(void) { return detected; } -void portexpander_set(uint8_t pin, uint8_t value) +/* ************************************************************************** */ +void portexpander_out_set(uint8_t mask) { - if (detected && pin < 8) { - if (value) { - output_state |= (1 << pin); - } else { - output_state &= ~(1 << pin); - } - + if (detected) { + output_state |= mask; portexpander_write(PE_C_OUTPUT_PORT, output_state); } } -void portexpander_prep(uint8_t pin, uint8_t value) +/* ************************************************************************** */ +void portexpander_out_clr(uint8_t mask) { - if (pin < 8) { - if (value) { - output_state |= (1 << pin); - } else { - output_state &= ~(1 << pin); - } + if (detected) { + output_state &= ~mask; + portexpander_write(PE_C_OUTPUT_PORT, output_state); } } -void portexpander_update(void) +/* ************************************************************************** */ +uint8_t portexpander_out_get(uint8_t mask) +{ + return output_state & mask; +} + +/* ************************************************************************** */ +void portexpander_out_put(uint8_t mask, uint8_t val) { if (detected) { + output_state = (output_state & ~mask) | (val & mask); portexpander_write(PE_C_OUTPUT_PORT, output_state); } } -void portexpander_set_mask(uint8_t mask, uint8_t values) +/* ************************************************************************** */ +void portexpander_out_toggle(uint8_t mask) { if (detected) { - output_state &= ~(mask & ~values); - output_state |= mask & values; + output_state ^= mask; portexpander_write(PE_C_OUTPUT_PORT, output_state); } } + +/* ************************************************************************** */ +void portexpander_int_config(uint8_t mask, gpio_int_pol_t edge) +{ + if (detected) { + for (uint8_t pin = 0; pin < 8; ++pin) { + if (mask & (1 << pin)) { + int_edge_config[pin] = edge; + } + } + } +} + +/* ************************************************************************** */ +void portexpander_int_enable(uint8_t mask) +{ + if (detected) { + int_mask_state &= ~mask; + portexpander_write(PE_C_INT_MASK, int_mask_state); + } +} + +/* ************************************************************************** */ +void portexpander_int_disable(uint8_t mask) +{ + if (detected) { + int_mask_state |= mask; + portexpander_write(PE_C_INT_MASK, int_mask_state); + } +} + +/* ************************************************************************** */ +uint8_t portexpander_int_status() +{ + uint8_t buf = 0; + if (detected) { + portexpander_read(PE_C_INT_STATUS, &buf); + } + + return buf; +} + +/* ************************************************************************** */ +void portexpander_int_clr(uint8_t mask) +{ + if (detected) { + uint8_t tmp_mask = int_mask_state | mask; + + // Setting an interrupt mask clears the corresponding interrupt + portexpander_write(PE_C_INT_MASK, tmp_mask); + portexpander_write(PE_C_INT_MASK, int_mask_state); + } +} + +/* ************************************************************************** */ +int portexpander_register_callback( + uint8_t mask, pe_callback callback, void *cbdata +) { + if (!detected) { + return E_NO_DEVICE; + } + + for (uint8_t pin = 0; pin < 8; ++pin) { + if (mask & (1 << pin)) { + callbacks[pin] = callback; + cbparam[pin] = cbdata; + } + } + + return E_NO_ERROR; +} + +/* ************************************************************************** */ +__attribute__((weak)) void portexpander_interrupt_callback(void *_) +{ + GPIO_IntDisable(&pe_int_pin); + GPIO_IntClr(&pe_int_pin); + interrupt_pending = true; +} + +/* ************************************************************************** */ +void portexpander_poll() +{ + if (detected && interrupt_pending) { + interrupt_pending = false; + + uint8_t caused_by = portexpander_int_status(); + // Port read resets interrupts + uint8_t port_levels = portexpander_in_get(0xFF); + + GPIO_IntEnable(&pe_int_pin); + + for (uint8_t pin = 0; pin < 8; ++pin) { + if ((caused_by & (1 << pin)) && callbacks[pin]) { + gpio_int_pol_t edge_type = + (port_levels & (1 << pin) ? + GPIO_INT_RISING : + GPIO_INT_FALLING); + if ((int_edge_config[pin] == GPIO_INT_BOTH) || + (edge_type == int_edge_config[pin])) { + callbacks[pin](edge_type, cbparam[pin]); + } + } + } + } +} diff --git a/lib/card10/portexpander.h b/lib/card10/portexpander.h index 86614bdd09305ae725fd7d2145c058e184602ed2..b260d935b127bb913d26a003867412bb1ac51140 100644 --- a/lib/card10/portexpander.h +++ b/lib/card10/portexpander.h @@ -1,15 +1,44 @@ #ifndef PORTEXPANDER_H #define PORTEXPANDER_H +#include "mxc_config.h" + #include <stdint.h> #include <stdbool.h> -void portexpander_init(void); -uint8_t portexpander_get(void); -void portexpander_set(uint8_t pin, uint8_t value); -void portexpander_set_mask(uint8_t mask, uint8_t values); -void portexpander_prep(uint8_t pin, uint8_t value); -void portexpander_update(void); +/** + * Structure type for configuring the portexpander. + */ +typedef struct { + uint8_t mask; /**< Pin mask (multiple pins may be set) */ + gpio_func_t func; /**< Function type */ + gpio_pad_t pad; /**< Pad type */ +} portexpander_cfg_t; + + +typedef void (*pe_callback)(gpio_int_pol_t edge_type, void *cbdata); + +int portexpander_init(void); bool portexpander_detected(void); +int portexpander_config(const portexpander_cfg_t *cfg); + +uint8_t portexpander_in_get(uint8_t mask); + +void portexpander_out_set(uint8_t mask); +void portexpander_out_clr(uint8_t mask); +void portexpander_out_put(uint8_t mask, uint8_t val); +void portexpander_out_toggle(uint8_t mask); +uint8_t portexpander_out_get(uint8_t mask); + +void portexpander_int_config(uint8_t mask, gpio_int_pol_t edge); +void portexpander_int_enable(uint8_t mask); +void portexpander_int_disable(uint8_t mask); +uint8_t portexpander_int_status(); +void portexpander_int_clr(uint8_t mask); +int portexpander_register_callback(uint8_t mask, pe_callback callback, void *cbdata); +void portexpander_poll(); + +void portexpander_interrupt_callback(void *_); + #endif diff --git a/lib/gfx/Fonts/font12.c b/lib/gfx/Fonts/font12.c index b4bc8664e88ee8a53be2879bcdb109e3ade98ba2..635c517fd5c6632a84d3be22f091fadccb2531fc 100644 --- a/lib/gfx/Fonts/font12.c +++ b/lib/gfx/Fonts/font12.c @@ -1,1384 +1,1245 @@ -/** - ****************************************************************************** - * @file Font12.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// -// Font data for Courier New 12pt -// - -const uint8_t Font12_Table[] = -{ - // @0 ' ' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @12 '!' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @24 '"' (7 pixels wide) - 0x00, // - 0x6C, // ## ## - 0x48, // # # - 0x48, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @36 '#' (7 pixels wide) - 0x00, // - 0x14, // # # - 0x14, // # # - 0x28, // # # - 0x7C, // ##### - 0x28, // # # - 0x7C, // ##### - 0x28, // # # - 0x50, // # # - 0x50, // # # - 0x00, // - 0x00, // - - // @48 '$' (7 pixels wide) - 0x00, // - 0x10, // # - 0x38, // ### - 0x40, // # - 0x40, // # - 0x38, // ### - 0x48, // # # - 0x70, // ### - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - - // @60 '%' (7 pixels wide) - 0x00, // - 0x20, // # - 0x50, // # # - 0x20, // # - 0x0C, // ## - 0x70, // ### - 0x08, // # - 0x14, // # # - 0x08, // # - 0x00, // - 0x00, // - 0x00, // - - // @72 '&' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x20, // # - 0x20, // # - 0x54, // # # # - 0x48, // # # - 0x34, // ## # - 0x00, // - 0x00, // - 0x00, // - - // @84 ''' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @96 '(' (7 pixels wide) - 0x00, // - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x08, // # - 0x00, // - - // @108 ')' (7 pixels wide) - 0x00, // - 0x20, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x20, // # - 0x00, // - - // @120 '*' (7 pixels wide) - 0x00, // - 0x10, // # - 0x7C, // ##### - 0x10, // # - 0x28, // # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @132 '+' (7 pixels wide) - 0x00, // - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0xFE, // ####### - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @144 ',' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x10, // # - 0x30, // ## - 0x20, // # - 0x00, // - - // @156 '-' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @168 '.' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @180 '/' (7 pixels wide) - 0x00, // - 0x04, // # - 0x04, // # - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x20, // # - 0x40, // # - 0x00, // - 0x00, // - - // @192 '0' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @204 '1' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @216 '2' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x04, // # - 0x08, // # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @228 '3' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x04, // # - 0x18, // ## - 0x04, // # - 0x04, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @240 '4' (7 pixels wide) - 0x00, // - 0x0C, // ## - 0x14, // # # - 0x14, // # # - 0x24, // # # - 0x44, // # # - 0x7E, // ###### - 0x04, // # - 0x0E, // ### - 0x00, // - 0x00, // - 0x00, // - - // @252 '5' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x20, // # - 0x20, // # - 0x38, // ### - 0x04, // # - 0x04, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @264 '6' (7 pixels wide) - 0x00, // - 0x1C, // ### - 0x20, // # - 0x40, // # - 0x78, // #### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @276 '7' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x44, // # # - 0x04, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @288 '8' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @300 '9' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x08, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @312 ':' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @324 ';' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x18, // ## - 0x00, // - 0x00, // - 0x18, // ## - 0x30, // ## - 0x20, // # - 0x00, // - 0x00, // - - // @336 '<' (7 pixels wide) - 0x00, // - 0x00, // - 0x0C, // ## - 0x10, // # - 0x60, // ## - 0x80, // # - 0x60, // ## - 0x10, // # - 0x0C, // ## - 0x00, // - 0x00, // - 0x00, // - - // @348 '=' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x00, // - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @360 '>' (7 pixels wide) - 0x00, // - 0x00, // - 0xC0, // ## - 0x20, // # - 0x18, // ## - 0x04, // # - 0x18, // ## - 0x20, // # - 0xC0, // ## - 0x00, // - 0x00, // - 0x00, // - - // @372 '?' (7 pixels wide) - 0x00, // - 0x00, // - 0x18, // ## - 0x24, // # # - 0x04, // # - 0x08, // # - 0x10, // # - 0x00, // - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @384 '@' (7 pixels wide) - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x4C, // # ## - 0x54, // # # # - 0x54, // # # # - 0x4C, // # ## - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - - // @396 'A' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x28, // # # - 0x28, // # # - 0x28, // # # - 0x7C, // ##### - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @408 'B' (7 pixels wide) - 0x00, // - 0xF8, // ##### - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @420 'C' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x40, // # - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @432 'D' (7 pixels wide) - 0x00, // - 0xF0, // #### - 0x48, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x48, // # # - 0xF0, // #### - 0x00, // - 0x00, // - 0x00, // - - // @444 'E' (7 pixels wide) - 0x00, // - 0xFC, // ###### - 0x44, // # # - 0x50, // # # - 0x70, // ### - 0x50, // # # - 0x40, // # - 0x44, // # # - 0xFC, // ###### - 0x00, // - 0x00, // - 0x00, // - - // @456 'F' (7 pixels wide) - 0x00, // - 0x7E, // ###### - 0x22, // # # - 0x28, // # # - 0x38, // ### - 0x28, // # # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @468 'G' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x4E, // # ### - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @480 'H' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x7C, // ##### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @492 'I' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @504 'J' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x08, // # - 0x08, // # - 0x08, // # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @516 'K' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x48, // # # - 0x50, // # # - 0x70, // ### - 0x48, // # # - 0x44, // # # - 0xE6, // ### ## - 0x00, // - 0x00, // - 0x00, // - - // @528 'L' (7 pixels wide) - 0x00, // - 0x70, // ### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x24, // # # - 0x24, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @540 'M' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x6C, // ## ## - 0x6C, // ## ## - 0x54, // # # # - 0x54, // # # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @552 'N' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x64, // ## # - 0x64, // ## # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x4C, // # ## - 0xEC, // ### ## - 0x00, // - 0x00, // - 0x00, // - - // @564 'O' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @576 'P' (7 pixels wide) - 0x00, // - 0x78, // #### - 0x24, // # # - 0x24, // # # - 0x24, // # # - 0x38, // ### - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @588 'Q' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x1C, // ### - 0x00, // - 0x00, // - - // @600 'R' (7 pixels wide) - 0x00, // - 0xF8, // ##### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x48, // # # - 0x44, // # # - 0xE2, // ### # - 0x00, // - 0x00, // - 0x00, // - - // @612 'S' (7 pixels wide) - 0x00, // - 0x34, // ## # - 0x4C, // # ## - 0x40, // # - 0x38, // ### - 0x04, // # - 0x04, // # - 0x64, // ## # - 0x58, // # ## - 0x00, // - 0x00, // - 0x00, // - - // @624 'T' (7 pixels wide) - 0x00, // - 0xFE, // ####### - 0x92, // # # # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @636 'U' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @648 'V' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @660 'W' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - - // @672 'X' (7 pixels wide) - 0x00, // - 0xC6, // ## ## - 0x44, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x28, // # # - 0x44, // # # - 0xC6, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @684 'Y' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x10, // # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @696 'Z' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x44, // # # - 0x08, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @708 '[' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x38, // ### - 0x00, // - - // @720 '\' (7 pixels wide) - 0x00, // - 0x40, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x00, // - 0x00, // - - // @732 ']' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x38, // ### - 0x00, // - - // @744 '^' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x28, // # # - 0x44, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @756 '_' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0xFE, // ####### - - // @768 '`' (7 pixels wide) - 0x00, // - 0x10, // # - 0x08, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @780 'a' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x3C, // #### - 0x44, // # # - 0x44, // # # - 0x3E, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @792 'b' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x58, // # ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @804 'c' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @816 'd' (7 pixels wide) - 0x00, // - 0x0C, // ## - 0x04, // # - 0x34, // ## # - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3E, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @828 'e' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x7C, // ##### - 0x40, // # - 0x40, // # - 0x3C, // #### - 0x00, // - 0x00, // - 0x00, // - - // @840 'f' (7 pixels wide) - 0x00, // - 0x1C, // ### - 0x20, // # - 0x7C, // ##### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @852 'g' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x36, // ## ## - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x38, // ### - 0x00, // - - // @864 'h' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x58, // # ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @876 'i' (7 pixels wide) - 0x00, // - 0x10, // # - 0x00, // - 0x70, // ### - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @888 'j' (7 pixels wide) - 0x00, // - 0x10, // # - 0x00, // - 0x78, // #### - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x70, // ### - 0x00, // - - // @900 'k' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x5C, // # ### - 0x48, // # # - 0x70, // ### - 0x50, // # # - 0x48, // # # - 0xDC, // ## ### - 0x00, // - 0x00, // - 0x00, // - - // @912 'l' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @924 'm' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xE8, // ### # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0xFE, // ####### - 0x00, // - 0x00, // - 0x00, // - - // @936 'n' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @948 'o' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @960 'p' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x40, // # - 0xE0, // ### - 0x00, // - - // @972 'q' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x36, // ## ## - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x0E, // ### - 0x00, // - - // @984 'r' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x6C, // ## ## - 0x30, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @996 's' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x38, // ### - 0x04, // # - 0x44, // # # - 0x78, // #### - 0x00, // - 0x00, // - 0x00, // - - // @1008 't' (7 pixels wide) - 0x00, // - 0x00, // - 0x20, // # - 0x7C, // ##### - 0x20, // # - 0x20, // # - 0x20, // # - 0x22, // # # - 0x1C, // ### - 0x00, // - 0x00, // - 0x00, // - - // @1020 'u' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xCC, // ## ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x4C, // # ## - 0x36, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @1032 'v' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @1044 'w' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - - // @1056 'x' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xCC, // ## ## - 0x48, // # # - 0x30, // ## - 0x30, // ## - 0x48, // # # - 0xCC, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @1068 'y' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x24, // # # - 0x28, // # # - 0x18, // ## - 0x10, // # - 0x10, // # - 0x78, // #### - 0x00, // - - // @1080 'z' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x48, // # # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @1092 '{' (7 pixels wide) - 0x00, // - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x00, // - - // @1104 '|' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - - // @1116 '}' (7 pixels wide) - 0x00, // - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x00, // - - // @1128 '~' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x24, // # # - 0x58, // # ## - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // -}; - -sFONT Font12 = { - Font12_Table, - 7, /* Width */ - 12, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#include "fonts.h" + +const uint8_t Font12_Table[] = { + // ' ' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '!' + 0, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // '"' + 0, + 48, + 56, + 56, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '#' + 0, + 24, + 24, + 56, + 124, + 56, + 120, + 120, + 48, + 112, + 0, + 0, + // '$' + 0, + 24, + 56, + 56, + 48, + 56, + 24, + 92, + 120, + 56, + 16, + 0, + // '%' + 0, + 104, + 120, + 120, + 112, + 16, + 56, + 60, + 60, + 60, + 0, + 0, + // '&' + 0, + 48, + 48, + 56, + 48, + 48, + 120, + 88, + 120, + 60, + 0, + 0, + // ''' + 0, + 16, + 16, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '(' + 24, + 16, + 16, + 48, + 32, + 32, + 32, + 48, + 48, + 16, + 24, + 0, + // ')' + 32, + 48, + 16, + 24, + 24, + 24, + 24, + 24, + 16, + 16, + 48, + 0, + // '*' + 0, + 16, + 56, + 48, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '+' + 0, + 0, + 0, + 0, + 0, + 16, + 56, + 56, + 16, + 0, + 0, + 0, + // ',' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 16, + 0, + // '-' + 0, + 0, + 0, + 0, + 0, + 0, + 56, + 56, + 0, + 0, + 0, + 0, + // '.' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 16, + 0, + 0, + // '/' + 0, + 8, + 8, + 24, + 24, + 16, + 48, + 48, + 32, + 32, + 0, + 0, + // '0' + 0, + 16, + 56, + 40, + 104, + 108, + 104, + 104, + 40, + 56, + 0, + 0, + // '1' + 0, + 16, + 16, + 48, + 16, + 16, + 16, + 16, + 16, + 56, + 0, + 0, + // '2' + 0, + 16, + 56, + 40, + 8, + 24, + 48, + 32, + 32, + 56, + 0, + 0, + // '3' + 0, + 16, + 56, + 8, + 24, + 24, + 8, + 8, + 40, + 56, + 0, + 0, + // '4' + 0, + 8, + 24, + 24, + 24, + 56, + 56, + 56, + 24, + 8, + 0, + 0, + // '5' + 0, + 56, + 56, + 32, + 56, + 40, + 8, + 8, + 40, + 56, + 0, + 0, + // '6' + 0, + 16, + 16, + 48, + 48, + 56, + 104, + 104, + 40, + 56, + 0, + 0, + // '7' + 0, + 56, + 56, + 8, + 8, + 24, + 16, + 16, + 48, + 32, + 0, + 0, + // '8' + 0, + 16, + 56, + 40, + 56, + 56, + 56, + 40, + 40, + 56, + 0, + 0, + // '9' + 0, + 16, + 56, + 40, + 104, + 40, + 56, + 24, + 16, + 48, + 0, + 0, + // ':' + 0, + 0, + 0, + 0, + 16, + 16, + 0, + 0, + 16, + 16, + 0, + 0, + // ';' + 0, + 0, + 0, + 0, + 16, + 16, + 0, + 0, + 0, + 16, + 16, + 0, + // '<' + 0, + 0, + 0, + 0, + 24, + 48, + 48, + 48, + 24, + 8, + 0, + 0, + // '=' + 0, + 0, + 0, + 0, + 0, + 56, + 16, + 56, + 56, + 0, + 0, + 0, + // '>' + 0, + 0, + 0, + 0, + 32, + 48, + 24, + 24, + 48, + 32, + 0, + 0, + // '?' + 0, + 56, + 56, + 8, + 8, + 24, + 16, + 48, + 32, + 32, + 0, + 0, + // '@' + 0, + 0, + 56, + 124, + 116, + 116, + 252, + 252, + 124, + 104, + 56, + 0, + // 'A' + 0, + 16, + 16, + 56, + 56, + 56, + 56, + 104, + 108, + 76, + 0, + 0, + // 'B' + 0, + 112, + 120, + 104, + 104, + 120, + 108, + 108, + 120, + 120, + 0, + 0, + // 'C' + 0, + 24, + 60, + 96, + 96, + 64, + 64, + 96, + 108, + 56, + 0, + 0, + // 'D' + 0, + 112, + 120, + 72, + 76, + 76, + 76, + 76, + 72, + 120, + 32, + 0, + // 'E' + 0, + 124, + 120, + 96, + 96, + 120, + 96, + 96, + 96, + 124, + 0, + 0, + // 'F' + 0, + 60, + 124, + 96, + 96, + 120, + 96, + 96, + 96, + 96, + 0, + 0, + // 'G' + 0, + 56, + 120, + 76, + 64, + 64, + 92, + 76, + 120, + 56, + 0, + 0, + // 'H' + 0, + 68, + 68, + 68, + 76, + 124, + 100, + 68, + 68, + 68, + 0, + 0, + // 'I' + 0, + 56, + 56, + 16, + 16, + 16, + 16, + 16, + 16, + 56, + 0, + 0, + // 'J' + 0, + 24, + 24, + 8, + 8, + 8, + 8, + 40, + 56, + 56, + 0, + 0, + // 'K' + 0, + 40, + 104, + 120, + 112, + 96, + 112, + 112, + 120, + 108, + 0, + 0, + // 'L' + 0, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 56, + 56, + 0, + 0, + // 'M' + 0, + 72, + 108, + 108, + 108, + 124, + 124, + 244, + 244, + 150, + 0, + 0, + // 'N' + 0, + 68, + 108, + 108, + 124, + 124, + 92, + 92, + 76, + 76, + 0, + 0, + // 'O' + 0, + 24, + 56, + 108, + 68, + 68, + 76, + 76, + 104, + 56, + 0, + 0, + // 'P' + 0, + 48, + 120, + 108, + 108, + 120, + 120, + 96, + 96, + 32, + 0, + 0, + // 'Q' + 0, + 56, + 56, + 108, + 68, + 68, + 68, + 92, + 124, + 60, + 0, + 0, + // 'R' + 0, + 112, + 120, + 104, + 104, + 120, + 120, + 120, + 104, + 108, + 0, + 0, + // 'S' + 0, + 56, + 60, + 40, + 48, + 56, + 8, + 76, + 104, + 56, + 0, + 0, + // 'T' + 0, + 124, + 120, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // 'U' + 0, + 68, + 68, + 68, + 68, + 68, + 68, + 108, + 104, + 56, + 0, + 0, + // 'V' + 0, + 68, + 108, + 104, + 40, + 40, + 56, + 48, + 48, + 16, + 0, + 0, + // 'W' + 0, + 146, + 150, + 182, + 244, + 124, + 124, + 108, + 108, + 104, + 0, + 0, + // 'X' + 0, + 68, + 108, + 40, + 56, + 16, + 56, + 40, + 108, + 68, + 0, + 0, + // 'Y' + 0, + 68, + 108, + 108, + 40, + 56, + 16, + 16, + 48, + 32, + 0, + 0, + // 'Z' + 0, + 124, + 124, + 8, + 24, + 16, + 48, + 32, + 96, + 124, + 0, + 0, + // '[' + 56, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 16, + // '\' + 0, + 32, + 32, + 32, + 48, + 16, + 16, + 24, + 8, + 8, + 0, + 0, + // ']' + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 16, + // '^' + 0, + 0, + 16, + 56, + 40, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '_' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 120, + 124, + 0, + // '`' + 0, + 48, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'a' + 0, + 0, + 0, + 24, + 56, + 40, + 40, + 40, + 56, + 56, + 0, + 0, + // 'b' + 0, + 32, + 32, + 48, + 56, + 40, + 40, + 40, + 40, + 56, + 0, + 0, + // 'c' + 0, + 0, + 0, + 16, + 56, + 40, + 32, + 32, + 40, + 56, + 0, + 0, + // 'd' + 0, + 8, + 8, + 24, + 56, + 40, + 104, + 104, + 40, + 56, + 0, + 0, + // 'e' + 0, + 0, + 0, + 16, + 56, + 40, + 56, + 48, + 40, + 56, + 0, + 0, + // 'f' + 0, + 24, + 24, + 56, + 56, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // 'g' + 0, + 0, + 0, + 24, + 56, + 40, + 40, + 40, + 56, + 56, + 8, + 56, + // 'h' + 0, + 32, + 32, + 48, + 56, + 40, + 40, + 40, + 40, + 40, + 0, + 0, + // 'i' + 0, + 16, + 16, + 0, + 16, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // 'j' + 0, + 16, + 24, + 0, + 24, + 24, + 24, + 24, + 24, + 56, + 56, + 48, + // 'k' + 0, + 32, + 32, + 40, + 40, + 48, + 48, + 56, + 40, + 40, + 0, + 0, + // 'l' + 0, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // 'm' + 0, + 0, + 0, + 40, + 252, + 212, + 212, + 212, + 212, + 84, + 0, + 0, + // 'n' + 0, + 0, + 0, + 16, + 56, + 40, + 40, + 40, + 40, + 40, + 0, + 0, + // 'o' + 0, + 0, + 0, + 16, + 56, + 40, + 104, + 104, + 40, + 56, + 0, + 0, + // 'p' + 0, + 0, + 0, + 16, + 56, + 40, + 40, + 40, + 56, + 56, + 32, + 32, + // 'q' + 0, + 0, + 0, + 8, + 56, + 40, + 40, + 40, + 40, + 56, + 8, + 8, + // 'r' + 0, + 0, + 0, + 8, + 56, + 56, + 32, + 32, + 32, + 32, + 0, + 0, + // 's' + 0, + 0, + 0, + 16, + 56, + 40, + 56, + 24, + 40, + 56, + 0, + 0, + // 't' + 0, + 0, + 16, + 56, + 56, + 16, + 16, + 16, + 16, + 16, + 0, + 0, + // 'u' + 0, + 0, + 0, + 0, + 40, + 40, + 40, + 40, + 40, + 56, + 0, + 0, + // 'v' + 0, + 0, + 0, + 0, + 40, + 40, + 56, + 56, + 16, + 16, + 0, + 0, + // 'w' + 0, + 0, + 0, + 0, + 84, + 124, + 120, + 120, + 120, + 40, + 0, + 0, + // 'x' + 0, + 0, + 0, + 0, + 44, + 56, + 16, + 56, + 40, + 104, + 0, + 0, + // 'y' + 0, + 0, + 0, + 0, + 104, + 40, + 56, + 56, + 16, + 16, + 48, + 32, + // 'z' + 0, + 0, + 0, + 56, + 56, + 24, + 16, + 48, + 48, + 56, + 0, + 0, + // '{' + 24, + 16, + 16, + 16, + 16, + 48, + 48, + 16, + 16, + 16, + 24, + 8, + // '|' + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + // '}' + 48, + 16, + 16, + 16, + 16, + 24, + 16, + 16, + 16, + 16, + 48, + 32, + // '~' + 0, + 0, + 0, + 0, + 0, + 32, + 124, + 88, + 0, + 0, + 0, + 0, +}; + +sFONT Font12 = { + Font12_Table, + 7, + 12, +}; diff --git a/lib/gfx/Fonts/font16.c b/lib/gfx/Fonts/font16.c index e93803c4d26f4a0ee2f6593b416d88d7f76155b0..b0c5253e9098e5e54a705fb51de4bd0255af62c6 100644 --- a/lib/gfx/Fonts/font16.c +++ b/lib/gfx/Fonts/font16.c @@ -1,1764 +1,3145 @@ -/** - ****************************************************************************** - * @file font16.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// -// Font data for Courier New 12pt -// - -const uint8_t Font16_Table[] = -{ - // @0 ' ' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @32 '!' (11 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @64 '"' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x1D, 0xC0, // ### ### - 0x08, 0x80, // # # - 0x08, 0x80, // # # - 0x08, 0x80, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @96 '#' (11 pixels wide) - 0x00, 0x00, // - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x3F, 0xC0, // ######## - 0x1B, 0x00, // ## ## - 0x3F, 0xC0, // ######## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @128 '$' (11 pixels wide) - 0x04, 0x00, // # - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x38, 0x00, // ### - 0x1E, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @160 '%' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x24, 0x00, // # # - 0x24, 0x00, // # # - 0x18, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x1E, 0x00, // #### - 0x31, 0x80, // ## ## - 0x02, 0x40, // # # - 0x02, 0x40, // # # - 0x01, 0x80, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @192 '&' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x1D, 0x80, // ### ## - 0x37, 0x00, // ## ### - 0x33, 0x00, // ## ## - 0x1D, 0x80, // ### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @224 ''' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @256 '(' (11 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0E, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0E, 0x00, // ### - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @288 ')' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x1C, 0x00, // ### - 0x18, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @320 '*' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x3F, 0xC0, // ######## - 0x0F, 0x00, // #### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @352 '+' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x3F, 0x80, // ####### - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @384 ',' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x0C, 0x00, // ## - 0x08, 0x00, // # - 0x08, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - - // @416 '-' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @448 '.' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @480 '/' (11 pixels wide) - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @512 '0' (11 pixels wide) - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @544 '1' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x3E, 0x00, // ##### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @576 '2' (11 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x19, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @608 '3' (11 pixels wide) - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x61, 0x80, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x61, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @640 '4' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x0F, 0x00, // #### - 0x0B, 0x00, // # ## - 0x1B, 0x00, // ## ## - 0x13, 0x00, // # ## - 0x33, 0x00, // ## ## - 0x3F, 0x80, // ####### - 0x03, 0x00, // ## - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @672 '5' (11 pixels wide) - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1F, 0x00, // ##### - 0x11, 0x80, // # ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x21, 0x80, // # ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @704 '6' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1C, 0x00, // ### - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @736 '7' (11 pixels wide) - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x43, 0x00, // # ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @768 '8' (11 pixels wide) - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @800 '9' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x07, 0x00, // ### - 0x3C, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @832 ':' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @864 ';' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x08, 0x00, // # - 0x08, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @896 '<' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0xC0, // ## - 0x03, 0x00, // ## - 0x04, 0x00, // # - 0x18, 0x00, // ## - 0x60, 0x00, // ## - 0x18, 0x00, // ## - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @928 '=' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @960 '>' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x60, 0x00, // ## - 0x18, 0x00, // ## - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0xC0, // ## - 0x03, 0x00, // ## - 0x04, 0x00, // # - 0x18, 0x00, // ## - 0x60, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @992 '?' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x01, 0x80, // ## - 0x07, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1024 '@' (11 pixels wide) - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x11, 0x00, // # # - 0x21, 0x00, // # # - 0x21, 0x00, // # # - 0x27, 0x00, // # ### - 0x29, 0x00, // # # # - 0x29, 0x00, // # # # - 0x27, 0x00, // # ### - 0x20, 0x00, // # - 0x11, 0x00, // # # - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1056 'A' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x0F, 0x00, // #### - 0x09, 0x00, // # # - 0x19, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x79, 0xE0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1088 'B' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1120 'C' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x40, // ##### # - 0x30, 0xC0, // ## ## - 0x60, 0x40, // ## # - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x60, 0x40, // ## # - 0x30, 0x80, // ## # - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1152 'D' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1184 'E' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x30, 0x80, // ## # - 0x30, 0x80, // ## # - 0x32, 0x00, // ## # - 0x3E, 0x00, // ##### - 0x32, 0x00, // ## # - 0x30, 0x80, // ## # - 0x30, 0x80, // ## # - 0x7F, 0x80, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1216 'F' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x30, 0x40, // ## # - 0x30, 0x40, // ## # - 0x32, 0x00, // ## # - 0x3E, 0x00, // ##### - 0x32, 0x00, // ## # - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1248 'G' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1E, 0x80, // #### # - 0x31, 0x80, // ## ## - 0x60, 0x80, // ## # - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x67, 0xC0, // ## ##### - 0x61, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1280 'H' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x80, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1312 'I' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1344 'J' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x63, 0x00, // ## ## - 0x63, 0x00, // ## ## - 0x63, 0x00, // ## ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1376 'K' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x33, 0x00, // ## ## - 0x36, 0x00, // ## ## - 0x3C, 0x00, // #### - 0x3E, 0x00, // ##### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x79, 0xC0, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1408 'L' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7E, 0x00, // ###### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x40, // ## # - 0x18, 0x40, // ## # - 0x18, 0x40, // ## # - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1440 'M' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0xE0, 0xE0, // ### ### - 0x60, 0xC0, // ## ## - 0x71, 0xC0, // ### ### - 0x7B, 0xC0, // #### #### - 0x6A, 0xC0, // ## # # ## - 0x6E, 0xC0, // ## ### ## - 0x64, 0xC0, // ## # ## - 0x60, 0xC0, // ## ## - 0xFB, 0xE0, // ##### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1472 'N' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x73, 0xC0, // ### #### - 0x31, 0x80, // ## ## - 0x39, 0x80, // ### ## - 0x3D, 0x80, // #### ## - 0x35, 0x80, // ## # ## - 0x37, 0x80, // ## #### - 0x33, 0x80, // ## ### - 0x31, 0x80, // ## ## - 0x79, 0x80, // #### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1504 'O' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1536 'P' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7E, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1568 'Q' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x0C, 0xC0, // ## ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1600 'R' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3E, 0x00, // ##### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7C, 0xE0, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1632 'S' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x38, 0x00, // ### - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1664 'T' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x4C, 0x80, // # ## # - 0x4C, 0x80, // # ## # - 0x4C, 0x80, // # ## # - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1696 'U' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1728 'V' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x0A, 0x00, // # # - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1760 'W' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0xFB, 0xE0, // ##### ##### - 0x60, 0xC0, // ## ## - 0x64, 0xC0, // ## # ## - 0x6E, 0xC0, // ## ### ## - 0x6E, 0xC0, // ## ### ## - 0x2A, 0x80, // # # # # - 0x3B, 0x80, // ### ### - 0x3B, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1792 'X' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1824 'Y' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x79, 0xE0, // #### #### - 0x30, 0xC0, // ## ## - 0x19, 0x80, // ## ## - 0x0F, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1856 'Z' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x21, 0x80, // # ## - 0x23, 0x00, // # ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x0C, 0x00, // ## - 0x18, 0x80, // ## # - 0x30, 0x80, // ## # - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1888 '[' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1920 '\' (11 pixels wide) - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1952 ']' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1E, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1984 '^' (11 pixels wide) - 0x04, 0x00, // # - 0x0A, 0x00, // # # - 0x0A, 0x00, // # # - 0x11, 0x00, // # # - 0x20, 0x80, // # # - 0x20, 0x80, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2016 '_' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0xFF, 0xE0, // ########### - - // @2048 '`' (11 pixels wide) - 0x08, 0x00, // # - 0x04, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2080 'a' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2112 'b' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x39, 0x80, // ### ## - 0x77, 0x00, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2144 'c' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1E, 0x80, // #### # - 0x31, 0x80, // ## ## - 0x60, 0x80, // ## # - 0x60, 0x00, // ## - 0x60, 0x80, // ## # - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2176 'd' (11 pixels wide) - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1D, 0x80, // ### ## - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2208 'e' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x7F, 0xC0, // ######### - 0x60, 0x00, // ## - 0x30, 0xC0, // ## ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2240 'f' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0xE0, // ###### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x80, // ####### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2272 'g' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2304 'h' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2336 'i' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2368 'j' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2400 'k' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x80, // ## #### - 0x36, 0x00, // ## ## - 0x3C, 0x00, // #### - 0x3C, 0x00, // #### - 0x36, 0x00, // ## ## - 0x33, 0x00, // ## ## - 0x77, 0xC0, // ### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2432 'l' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2464 'm' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x76, 0xE0, // ### ## ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2496 'n' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x00, // ### ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2528 'o' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2560 'p' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x00, // ### ### - 0x39, 0x80, // ### ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x39, 0x80, // ### ## - 0x37, 0x00, // ## ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2592 'q' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2624 'r' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0x80, // #### ### - 0x1C, 0xC0, // ### ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2656 's' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x3C, 0x00, // #### - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2688 't' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x7F, 0x00, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x80, // ## # - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2720 'u' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x73, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2752 'v' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2784 'w' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0xF1, 0xE0, // #### #### - 0x60, 0xC0, // ## ## - 0x64, 0xC0, // ## # ## - 0x6E, 0xC0, // ## ### ## - 0x3B, 0x80, // ### ### - 0x3B, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2816 'x' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2848 'y' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x79, 0xE0, // #### #### - 0x30, 0xC0, // ## ## - 0x19, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x0B, 0x00, // # ## - 0x0F, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2880 'z' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x21, 0x80, // # ## - 0x03, 0x00, // ## - 0x0E, 0x00, // ### - 0x18, 0x00, // ## - 0x30, 0x80, // ## # - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2912 '{' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2944 '|' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2976 '}' (11 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3008 '~' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x24, 0x80, // # # # - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // -}; - -sFONT Font16 = { - Font16_Table, - 11, /* Width */ - 16, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#include "fonts.h" + +const uint8_t Font16_Table[] = { + // ' ' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '!' + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '"' + 0, + 0, + 0, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '#' + 0, + 0, + 0, + 0, + 13, + 0, + 13, + 0, + 15, + 0, + 63, + 128, + 63, + 128, + 26, + 0, + 63, + 0, + 127, + 128, + 22, + 0, + 54, + 0, + 52, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '$' + 0, + 0, + 4, + 0, + 31, + 0, + 31, + 0, + 29, + 0, + 28, + 0, + 28, + 0, + 15, + 0, + 7, + 0, + 5, + 0, + 53, + 0, + 63, + 0, + 31, + 0, + 12, + 0, + 4, + 0, + 0, + 0, + // '%' + 0, + 0, + 16, + 0, + 59, + 0, + 123, + 0, + 110, + 0, + 62, + 0, + 62, + 0, + 12, + 0, + 15, + 0, + 15, + 128, + 31, + 128, + 31, + 128, + 23, + 128, + 3, + 0, + 0, + 0, + 0, + 0, + // '&' + 0, + 0, + 0, + 0, + 28, + 0, + 30, + 0, + 22, + 0, + 30, + 0, + 28, + 0, + 28, + 0, + 63, + 0, + 55, + 0, + 35, + 0, + 63, + 0, + 31, + 128, + 8, + 0, + 0, + 0, + 0, + 0, + // ''' + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '(' + 2, + 0, + 6, + 0, + 4, + 0, + 12, + 0, + 12, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 6, + 0, + 6, + 0, + 0, + 0, + // ')' + 8, + 0, + 12, + 0, + 12, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 2, + 0, + 2, + 0, + 2, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 12, + 0, + 12, + 0, + 8, + 0, + 0, + 0, + // '*' + 0, + 0, + 0, + 0, + 4, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '+' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 31, + 0, + 31, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ',' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + // '-' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 30, + 0, + 30, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '.' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '/' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 6, + 0, + 6, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 24, + 0, + 24, + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '0' + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 27, + 0, + 49, + 0, + 49, + 0, + 49, + 128, + 49, + 0, + 49, + 0, + 51, + 0, + 31, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // '1' + 0, + 0, + 0, + 0, + 4, + 0, + 12, + 0, + 28, + 0, + 28, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 14, + 0, + 30, + 0, + 14, + 0, + 0, + 0, + 0, + 0, + // '2' + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 19, + 0, + 3, + 0, + 3, + 0, + 6, + 0, + 12, + 0, + 24, + 0, + 24, + 0, + 30, + 0, + 31, + 0, + 30, + 0, + 0, + 0, + 0, + 0, + // '3' + 0, + 0, + 0, + 0, + 30, + 0, + 31, + 0, + 3, + 0, + 3, + 0, + 14, + 0, + 15, + 0, + 3, + 0, + 3, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + // '4' + 0, + 0, + 0, + 0, + 2, + 0, + 6, + 0, + 6, + 0, + 14, + 0, + 14, + 0, + 10, + 0, + 26, + 0, + 31, + 0, + 31, + 0, + 2, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '5' + 0, + 0, + 0, + 0, + 31, + 0, + 31, + 0, + 24, + 0, + 30, + 0, + 31, + 0, + 19, + 0, + 1, + 0, + 1, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + // '6' + 0, + 0, + 0, + 0, + 6, + 0, + 14, + 0, + 28, + 0, + 28, + 0, + 30, + 0, + 31, + 0, + 51, + 0, + 49, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // '7' + 0, + 0, + 0, + 0, + 31, + 0, + 31, + 0, + 3, + 0, + 3, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 12, + 0, + 12, + 0, + 8, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '8' + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 27, + 0, + 27, + 0, + 30, + 0, + 30, + 0, + 27, + 0, + 19, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // '9' + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 19, + 0, + 51, + 0, + 49, + 0, + 19, + 0, + 31, + 0, + 15, + 0, + 6, + 0, + 14, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ':' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 6, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ';' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 6, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 12, + 0, + 4, + 0, + 0, + 0, + // '<' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 7, + 0, + 14, + 0, + 24, + 0, + 24, + 0, + 12, + 0, + 6, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '=' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '>' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 0, + 28, + 0, + 14, + 0, + 7, + 0, + 7, + 0, + 14, + 0, + 28, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '?' + 0, + 0, + 12, + 0, + 30, + 0, + 27, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 6, + 0, + 14, + 0, + 12, + 0, + 8, + 0, + 24, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '@' + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 63, + 128, + 49, + 128, + 110, + 128, + 126, + 192, + 118, + 192, + 118, + 192, + 127, + 128, + 107, + 128, + 49, + 0, + 63, + 0, + 14, + 0, + 0, + 0, + // 'A' + 0, + 0, + 4, + 0, + 4, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 26, + 0, + 27, + 0, + 31, + 0, + 63, + 0, + 49, + 0, + 49, + 128, + 49, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'B' + 0, + 0, + 28, + 0, + 62, + 0, + 63, + 0, + 51, + 0, + 51, + 0, + 63, + 0, + 63, + 0, + 51, + 128, + 49, + 128, + 49, + 128, + 63, + 0, + 62, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + // 'C' + 0, + 0, + 6, + 0, + 15, + 0, + 31, + 128, + 17, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 49, + 128, + 31, + 128, + 31, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'D' + 0, + 0, + 16, + 0, + 60, + 0, + 62, + 0, + 51, + 0, + 49, + 0, + 49, + 128, + 49, + 128, + 49, + 128, + 49, + 128, + 49, + 0, + 55, + 0, + 62, + 0, + 28, + 0, + 0, + 0, + 0, + 0, + // 'E' + 0, + 0, + 31, + 0, + 63, + 128, + 63, + 0, + 48, + 0, + 48, + 0, + 63, + 0, + 63, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 63, + 0, + 63, + 128, + 31, + 0, + 0, + 0, + 0, + 0, + // 'F' + 0, + 0, + 31, + 0, + 63, + 128, + 63, + 0, + 48, + 0, + 48, + 0, + 63, + 0, + 63, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'G' + 0, + 0, + 4, + 0, + 31, + 0, + 63, + 0, + 49, + 128, + 97, + 128, + 96, + 0, + 96, + 0, + 103, + 128, + 103, + 128, + 49, + 128, + 63, + 0, + 31, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + // 'H' + 0, + 0, + 32, + 0, + 33, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 47, + 128, + 63, + 128, + 57, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'I' + 0, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 0, + 0, + 0, + 0, + // 'J' + 0, + 0, + 7, + 0, + 15, + 0, + 7, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 19, + 0, + 27, + 0, + 31, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'K' + 0, + 0, + 1, + 0, + 51, + 0, + 55, + 0, + 54, + 0, + 60, + 0, + 56, + 0, + 56, + 0, + 56, + 0, + 60, + 0, + 54, + 0, + 51, + 0, + 51, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'L' + 0, + 0, + 0, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 31, + 0, + 31, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + // 'M' + 0, + 0, + 0, + 0, + 49, + 128, + 49, + 128, + 51, + 128, + 51, + 128, + 123, + 128, + 122, + 128, + 126, + 192, + 110, + 192, + 78, + 192, + 76, + 192, + 204, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'N' + 0, + 0, + 0, + 0, + 49, + 128, + 49, + 128, + 57, + 128, + 57, + 128, + 61, + 128, + 61, + 128, + 55, + 128, + 55, + 128, + 51, + 128, + 51, + 128, + 49, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'O' + 0, + 0, + 4, + 0, + 15, + 0, + 31, + 0, + 49, + 128, + 49, + 128, + 49, + 128, + 33, + 128, + 33, + 128, + 49, + 128, + 51, + 0, + 63, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'P' + 0, + 0, + 24, + 0, + 63, + 0, + 63, + 0, + 49, + 128, + 49, + 128, + 49, + 128, + 63, + 0, + 62, + 0, + 56, + 0, + 48, + 0, + 48, + 0, + 48, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Q' + 0, + 0, + 4, + 0, + 31, + 0, + 31, + 128, + 49, + 128, + 33, + 128, + 96, + 128, + 96, + 128, + 97, + 128, + 101, + 128, + 55, + 128, + 63, + 128, + 31, + 128, + 12, + 128, + 0, + 0, + 0, + 0, + // 'R' + 0, + 0, + 28, + 0, + 62, + 0, + 63, + 0, + 49, + 0, + 49, + 0, + 51, + 0, + 63, + 0, + 62, + 0, + 62, + 0, + 51, + 0, + 51, + 0, + 49, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'S' + 0, + 0, + 4, + 0, + 31, + 0, + 31, + 128, + 17, + 128, + 24, + 0, + 28, + 0, + 15, + 0, + 3, + 0, + 1, + 128, + 49, + 128, + 63, + 0, + 31, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'T' + 0, + 0, + 31, + 0, + 63, + 128, + 31, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'U' + 0, + 0, + 32, + 0, + 33, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 33, + 128, + 49, + 128, + 49, + 128, + 49, + 128, + 31, + 0, + 31, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'V' + 0, + 0, + 0, + 0, + 49, + 128, + 49, + 128, + 49, + 0, + 19, + 0, + 27, + 0, + 27, + 0, + 30, + 0, + 14, + 0, + 14, + 0, + 12, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'W' + 0, + 0, + 0, + 64, + 204, + 96, + 204, + 64, + 206, + 192, + 78, + 192, + 126, + 192, + 126, + 128, + 123, + 128, + 123, + 128, + 51, + 128, + 51, + 0, + 51, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'X' + 0, + 0, + 0, + 0, + 49, + 128, + 49, + 128, + 27, + 0, + 31, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 27, + 0, + 59, + 0, + 49, + 128, + 33, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Y' + 0, + 0, + 32, + 0, + 33, + 128, + 49, + 128, + 49, + 128, + 27, + 0, + 27, + 0, + 14, + 0, + 14, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Z' + 0, + 0, + 31, + 0, + 63, + 128, + 31, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 12, + 0, + 12, + 0, + 24, + 0, + 24, + 0, + 63, + 0, + 63, + 128, + 63, + 0, + 0, + 0, + 0, + 0, + // '[' + 14, + 0, + 14, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 14, + 0, + 4, + 0, + // '\' + 0, + 0, + 0, + 0, + 16, + 0, + 24, + 0, + 24, + 0, + 8, + 0, + 12, + 0, + 12, + 0, + 6, + 0, + 6, + 0, + 2, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ']' + 14, + 0, + 14, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 14, + 0, + 14, + 0, + 4, + 0, + // '^' + 0, + 0, + 0, + 0, + 4, + 0, + 14, + 0, + 14, + 0, + 26, + 0, + 27, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '_' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 63, + 0, + 63, + 128, + 0, + 0, + 0, + 0, + // '`' + 0, + 0, + 12, + 0, + 12, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'a' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 15, + 0, + 31, + 0, + 27, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 31, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'b' + 0, + 0, + 0, + 0, + 16, + 0, + 16, + 0, + 16, + 0, + 30, + 0, + 31, + 0, + 27, + 0, + 17, + 0, + 17, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'c' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 24, + 0, + 16, + 0, + 16, + 0, + 17, + 0, + 31, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'd' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 31, + 0, + 31, + 0, + 19, + 0, + 51, + 0, + 51, + 0, + 51, + 0, + 31, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'e' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 19, + 0, + 30, + 0, + 60, + 0, + 24, + 0, + 31, + 0, + 15, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'f' + 0, + 0, + 0, + 0, + 7, + 0, + 14, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'g' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 15, + 0, + 31, + 0, + 19, + 0, + 19, + 0, + 51, + 0, + 19, + 0, + 31, + 0, + 15, + 0, + 3, + 0, + 31, + 0, + 30, + 0, + // 'h' + 0, + 0, + 0, + 0, + 16, + 0, + 16, + 0, + 16, + 0, + 30, + 0, + 31, + 0, + 27, + 0, + 27, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'i' + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'j' + 0, + 0, + 0, + 0, + 6, + 0, + 6, + 0, + 0, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 22, + 0, + 30, + 0, + 30, + 0, + 12, + 0, + // 'k' + 0, + 0, + 0, + 0, + 16, + 0, + 16, + 0, + 17, + 0, + 19, + 0, + 22, + 0, + 30, + 0, + 28, + 0, + 30, + 0, + 30, + 0, + 27, + 0, + 19, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'l' + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'm' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 9, + 0, + 127, + 128, + 126, + 192, + 100, + 192, + 100, + 192, + 100, + 192, + 100, + 192, + 100, + 192, + 100, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'n' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 31, + 0, + 27, + 0, + 27, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'o' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 19, + 0, + 49, + 0, + 49, + 0, + 51, + 0, + 31, + 0, + 30, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 'p' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 30, + 0, + 31, + 0, + 19, + 0, + 17, + 0, + 17, + 0, + 19, + 0, + 31, + 0, + 30, + 0, + 16, + 0, + 16, + 0, + 16, + 0, + // 'q' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 15, + 0, + 31, + 0, + 27, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 27, + 0, + 31, + 0, + 7, + 0, + 3, + 0, + 3, + 0, + // 'r' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 31, + 0, + 31, + 0, + 25, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 's' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 27, + 0, + 14, + 0, + 7, + 0, + 19, + 0, + 31, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + // 't' + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 14, + 0, + 31, + 0, + 14, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'u' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 19, + 0, + 31, + 0, + 31, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + // 'v' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 17, + 0, + 27, + 0, + 27, + 0, + 26, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'w' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 45, + 128, + 45, + 128, + 47, + 128, + 63, + 0, + 63, + 0, + 63, + 0, + 59, + 0, + 18, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'x' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 17, + 128, + 27, + 0, + 15, + 0, + 14, + 0, + 14, + 0, + 30, + 0, + 27, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'y' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0, + 19, + 0, + 27, + 0, + 27, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 24, + 0, + // 'z' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 31, + 0, + 31, + 0, + 6, + 0, + 6, + 0, + 12, + 0, + 8, + 0, + 30, + 0, + 31, + 0, + 30, + 0, + 0, + 0, + 0, + 0, + // '{' + 6, + 0, + 6, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 28, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 14, + 0, + 6, + 0, + 0, + 0, + // '|' + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + // '}' + 28, + 0, + 12, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 4, + 0, + 12, + 0, + 28, + 0, + 0, + 0, + // '~' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 25, + 0, + 61, + 128, + 55, + 0, + 39, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; + +sFONT Font16 = { + Font16_Table, + 11, + 16, +}; diff --git a/lib/gfx/Fonts/font20.c b/lib/gfx/Fonts/font20.c index 8fe013e9bdb821e39505c09de432a365e4e8a3cb..57e9a5caa6e360f602131b783c3e799ac79e57b5 100644 --- a/lib/gfx/Fonts/font20.c +++ b/lib/gfx/Fonts/font20.c @@ -1,2142 +1,3905 @@ -/** - ****************************************************************************** - * @file font20.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// Character bitmaps for Courier New 15pt -const uint8_t Font20_Table[] = -{ - // @0 ' ' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @40 '!' (14 pixels wide) - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @80 '"' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1C, 0xE0, // ### ### - 0x1C, 0xE0, // ### ### - 0x1C, 0xE0, // ### ### - 0x08, 0x40, // # # - 0x08, 0x40, // # # - 0x08, 0x40, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @120 '#' (14 pixels wide) - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @160 '$' (14 pixels wide) - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x07, 0xE0, // ###### - 0x0F, 0xE0, // ####### - 0x18, 0x60, // ## ## - 0x18, 0x00, // ## - 0x1F, 0x00, // ##### - 0x0F, 0xC0, // ###### - 0x00, 0xE0, // ### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xC0, // ####### - 0x1F, 0x80, // ###### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @200 '%' (14 pixels wide) - 0x00, 0x00, // - 0x1C, 0x00, // ### - 0x22, 0x00, // # # - 0x22, 0x00, // # # - 0x22, 0x00, // # # - 0x1C, 0x60, // ### ## - 0x01, 0xE0, // #### - 0x0F, 0x80, // ##### - 0x3C, 0x00, // #### - 0x31, 0xC0, // ## ### - 0x02, 0x20, // # # - 0x02, 0x20, // # # - 0x02, 0x20, // # # - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @240 '&' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0xE0, // ##### - 0x0F, 0xE0, // ####### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x0F, 0x30, // #### ## - 0x1F, 0xF0, // ######### - 0x19, 0xE0, // ## #### - 0x18, 0xC0, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @280 ''' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x01, 0x00, // # - 0x01, 0x00, // # - 0x01, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @320 '(' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @360 ')' (14 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @400 '*' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1B, 0x60, // ## ## ## - 0x1F, 0xE0, // ######## - 0x07, 0x80, // #### - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x0C, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @440 '+' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @480 ',' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @520 '-' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @560 '.' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @600 '/' (14 pixels wide) - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @640 '0' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x1F, 0xC0, // ####### - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @680 '1' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @720 '2' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @760 '3' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x3F, 0xC0, // ######## - 0x30, 0xE0, // ## ### - 0x00, 0x60, // ## - 0x00, 0xE0, // ### - 0x07, 0xC0, // ##### - 0x07, 0xC0, // ##### - 0x00, 0xE0, // ### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x60, 0xE0, // ## ### - 0x7F, 0xC0, // ######### - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @800 '4' (14 pixels wide) - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x06, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0xC0, // ## - 0x03, 0xE0, // ##### - 0x03, 0xE0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @840 '5' (14 pixels wide) - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1F, 0x80, // ###### - 0x1F, 0xC0, // ####### - 0x18, 0xE0, // ## ### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x30, 0xE0, // ## ### - 0x3F, 0xC0, // ######## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @880 '6' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xE0, // ##### - 0x0F, 0xE0, // ####### - 0x1E, 0x00, // #### - 0x18, 0x00, // ## - 0x38, 0x00, // ### - 0x37, 0x80, // ## #### - 0x3F, 0xC0, // ######## - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xC0, // ####### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @920 '7' (14 pixels wide) - 0x00, 0x00, // - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x30, 0x60, // ## ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @960 '8' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xC0, // ####### - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1000 '9' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x1F, 0xC0, // ####### - 0x38, 0xC0, // ### ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xE0, // ######## - 0x0F, 0x60, // #### ## - 0x00, 0xE0, // ### - 0x00, 0xC0, // ## - 0x03, 0xC0, // #### - 0x3F, 0x80, // ####### - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1040 ':' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1080 ';' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x01, 0xC0, // ### - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1120 '<' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x30, // ## - 0x00, 0xF0, // #### - 0x03, 0xC0, // #### - 0x07, 0x00, // ### - 0x1C, 0x00, // ### - 0x78, 0x00, // #### - 0x1C, 0x00, // ### - 0x07, 0x00, // ### - 0x03, 0xC0, // #### - 0x00, 0xF0, // #### - 0x00, 0x30, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1160 '=' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xF0, // ########### - 0x7F, 0xF0, // ########### - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xF0, // ########### - 0x7F, 0xF0, // ########### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1200 '>' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x30, 0x00, // ## - 0x3C, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x80, // ### - 0x00, 0xE0, // ### - 0x00, 0x78, // #### - 0x00, 0xE0, // ### - 0x03, 0x80, // ### - 0x0F, 0x00, // #### - 0x3C, 0x00, // #### - 0x30, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1240 '?' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x00, 0x60, // ## - 0x01, 0xC0, // ### - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1280 '@' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x0C, 0x80, // ## # - 0x08, 0x40, // # # - 0x10, 0x40, // # # - 0x10, 0x40, // # # - 0x11, 0xC0, // # ### - 0x12, 0x40, // # # # - 0x12, 0x40, // # # # - 0x12, 0x40, // # # # - 0x11, 0xC0, // # ### - 0x10, 0x00, // # - 0x08, 0x00, // # - 0x08, 0x40, // # # - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1320 'A' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x03, 0x80, // ### - 0x06, 0xC0, // ## ## - 0x06, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x30, 0x30, // ## ## - 0x78, 0x78, // #### #### - 0x78, 0x78, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1360 'B' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x3F, 0xC0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xC0, // ####### - 0x1F, 0xE0, // ######## - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1400 'C' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x0F, 0xF0, // ######## - 0x1C, 0x70, // ### ### - 0x38, 0x30, // ### ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x38, 0x30, // ### ## - 0x1C, 0x70, // ### ### - 0x0F, 0xE0, // ####### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1440 'D' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x7F, 0xC0, // ######### - 0x30, 0xE0, // ## ### - 0x30, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x70, // ## ### - 0x30, 0xE0, // ## ### - 0x7F, 0xC0, // ######### - 0x7F, 0x80, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1480 'E' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1520 'F' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1560 'G' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x31, 0xF8, // ## ###### - 0x31, 0xF8, // ## ###### - 0x30, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1600 'H' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1640 'I' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1680 'J' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0xF8, // ####### - 0x03, 0xF8, // ####### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0xE0, // ## ### - 0x3F, 0xC0, // ######## - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1720 'K' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3E, 0xF8, // ##### ##### - 0x3E, 0xF8, // ##### ##### - 0x18, 0xE0, // ## ### - 0x19, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1F, 0x00, // ##### - 0x1D, 0x80, // ### ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0x60, // ## ## - 0x3E, 0x78, // ##### #### - 0x3E, 0x38, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1760 'L' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x30, // ## ## - 0x0C, 0x30, // ## ## - 0x0C, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1800 'M' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0x78, // #### #### - 0x78, 0x78, // #### #### - 0x38, 0x70, // ### ### - 0x3C, 0xF0, // #### #### - 0x34, 0xB0, // ## # # ## - 0x37, 0xB0, // ## #### ## - 0x37, 0xB0, // ## #### ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x30, 0x30, // ## ## - 0x7C, 0xF8, // ##### ##### - 0x7C, 0xF8, // ##### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1840 'N' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x39, 0xF0, // ### ##### - 0x3D, 0xF0, // #### ##### - 0x1C, 0x60, // ### ## - 0x1E, 0x60, // #### ## - 0x1E, 0x60, // #### ## - 0x1B, 0x60, // ## ## ## - 0x1B, 0x60, // ## ## ## - 0x19, 0xE0, // ## #### - 0x19, 0xE0, // ## #### - 0x18, 0xE0, // ## ### - 0x3E, 0xE0, // ##### ### - 0x3E, 0x60, // ##### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1880 'O' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x1C, 0xE0, // ### ### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1920 'P' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x3F, 0xE0, // ######### - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xE0, // ######## - 0x1F, 0xC0, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1960 'Q' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x1C, 0xE0, // ### ### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x07, 0xB0, // #### ## - 0x0F, 0xF0, // ######## - 0x0C, 0xE0, // ## ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2000 'R' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x3F, 0xE0, // ######### - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xE0, // ######## - 0x1F, 0xC0, // ####### - 0x18, 0xE0, // ## ### - 0x18, 0x60, // ## ## - 0x18, 0x70, // ## ### - 0x3E, 0x38, // ##### ### - 0x3E, 0x18, // ##### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2040 'S' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0xB0, // ##### ## - 0x1F, 0xF0, // ######### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x38, 0x00, // ### - 0x1F, 0x80, // ###### - 0x07, 0xE0, // ###### - 0x00, 0x70, // ### - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x3F, 0xE0, // ######### - 0x37, 0xC0, // ## ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2080 'T' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0xC0, // ###### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2120 'U' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2160 'V' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2200 'W' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7C, 0x7C, // ##### ##### - 0x7C, 0x7C, // ##### ##### - 0x30, 0x18, // ## ## - 0x33, 0x98, // ## ### ## - 0x33, 0x98, // ## ### ## - 0x33, 0x98, // ## ### ## - 0x36, 0xD8, // ## ## ## ## - 0x16, 0xD0, // # ## ## # - 0x1C, 0x70, // ### ### - 0x1C, 0x70, // ### ### - 0x1C, 0x70, // ### ### - 0x18, 0x30, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2240 'X' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x0D, 0x80, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2280 'Y' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x0C, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x07, 0x80, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0xC0, // ###### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2320 'Z' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2360 '[' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2400 '\' (14 pixels wide) - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2440 ']' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0x00, // #### - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2480 '^' (14 pixels wide) - 0x00, 0x00, // - 0x02, 0x00, // # - 0x07, 0x00, // ### - 0x0D, 0x80, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x20, 0x20, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2520 '_' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0xFF, 0xFC, // ############## - 0xFF, 0xFC, // ############## - - // @2560 '`' (14 pixels wide) - 0x00, 0x00, // - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0x80, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2600 'a' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0xC0, // ###### - 0x1F, 0xE0, // ######## - 0x00, 0x60, // ## - 0x0F, 0xE0, // ####### - 0x1F, 0xE0, // ######## - 0x38, 0x60, // ### ## - 0x30, 0xE0, // ## ### - 0x3F, 0xF0, // ########## - 0x1F, 0x70, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2640 'b' (14 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x80, // ## #### - 0x3F, 0xE0, // ######### - 0x38, 0x60, // ### ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x60, // ### ## - 0x7F, 0xE0, // ########## - 0x77, 0x80, // ### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2680 'c' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x38, 0x30, // ### ## - 0x1F, 0xF0, // ######### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2720 'd' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x70, // ### - 0x00, 0x70, // ### - 0x00, 0x30, // ## - 0x00, 0x30, // ## - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1F, 0xF8, // ########## - 0x07, 0xB8, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2760 'e' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x30, 0x00, // ## - 0x18, 0x30, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2800 'f' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xF0, // ###### - 0x07, 0xF0, // ####### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2840 'g' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB8, // #### ### - 0x1F, 0xF8, // ########## - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x30, // ## - 0x00, 0x70, // ### - 0x0F, 0xE0, // ####### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2880 'h' (14 pixels wide) - 0x00, 0x00, // - 0x38, 0x00, // ### - 0x38, 0x00, // ### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1B, 0xC0, // ## #### - 0x1F, 0xE0, // ######## - 0x1C, 0x60, // ### ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2920 'i' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2960 'j' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0xC0, // ### - 0x3F, 0x80, // ####### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3000 'k' (14 pixels wide) - 0x00, 0x00, // - 0x38, 0x00, // ### - 0x38, 0x00, // ### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1B, 0xE0, // ## ##### - 0x1B, 0xE0, // ## ##### - 0x1B, 0x00, // ## ## - 0x1E, 0x00, // #### - 0x1E, 0x00, // #### - 0x1B, 0x00, // ## ## - 0x19, 0x80, // ## ## - 0x39, 0xF0, // ### ##### - 0x39, 0xF0, // ### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3040 'l' (14 pixels wide) - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3080 'm' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7E, 0xE0, // ###### ### - 0x7F, 0xF0, // ########### - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x7B, 0xB8, // #### ### ### - 0x7B, 0xB8, // #### ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3120 'n' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3B, 0xC0, // ### #### - 0x3F, 0xE0, // ######### - 0x1C, 0x60, // ### ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3160 'o' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3200 'p' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x80, // ### #### - 0x7F, 0xE0, // ########## - 0x38, 0x60, // ### ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x60, // ### ## - 0x3F, 0xE0, // ######### - 0x37, 0x80, // ## #### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3240 'q' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB8, // #### ### - 0x1F, 0xF8, // ########## - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x30, // ## - 0x00, 0x30, // ## - 0x00, 0xF8, // ##### - 0x00, 0xF8, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3280 'r' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xE0, // #### ### - 0x3D, 0xF0, // #### ##### - 0x0F, 0x30, // #### ## - 0x0E, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3320 's' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xE0, // ###### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x1E, 0x00, // #### - 0x0F, 0xC0, // ###### - 0x01, 0xE0, // #### - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3360 't' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x30, // ## ## - 0x0F, 0xF0, // ######## - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3400 'u' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x38, 0xE0, // ### ### - 0x38, 0xE0, // ### ### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xF0, // ######### - 0x0F, 0x70, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3440 'v' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3480 'w' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x32, 0x60, // ## # ## - 0x32, 0x60, // ## # ## - 0x37, 0xE0, // ## ###### - 0x1D, 0xC0, // ### ### - 0x1D, 0xC0, // ### ### - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3520 'x' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x0C, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x03, 0x00, // ## - 0x07, 0x80, // #### - 0x0C, 0xC0, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3560 'y' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0F, 0x80, // ##### - 0x07, 0x00, // ### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x7F, 0x00, // ####### - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3600 'z' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0xC0, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3640 '{' (14 pixels wide) - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x03, 0xC0, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x07, 0x00, // ### - 0x0E, 0x00, // ### - 0x07, 0x00, // ### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0xC0, // #### - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3680 '|' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3720 '}' (14 pixels wide) - 0x00, 0x00, // - 0x1C, 0x00, // ### - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x07, 0x00, // ### - 0x03, 0x80, // ### - 0x07, 0x00, // ### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1E, 0x00, // #### - 0x1C, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3760 '~' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x3F, 0x30, // ###### ## - 0x33, 0xF0, // ## ###### - 0x01, 0xE0, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // -}; - - -sFONT Font20 = { - Font20_Table, - 14, /* Width */ - 20, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#include "fonts.h" + +const uint8_t Font20_Table[] = { + // ' ' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '!' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '"' + 0, + 0, + 0, + 0, + 6, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '#' + 0, + 0, + 0, + 0, + 2, + 64, + 3, + 96, + 7, + 96, + 6, + 192, + 31, + 240, + 63, + 240, + 31, + 224, + 15, + 192, + 31, + 192, + 63, + 224, + 63, + 224, + 13, + 128, + 27, + 128, + 27, + 0, + 27, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '$' + 0, + 0, + 3, + 0, + 3, + 128, + 15, + 192, + 15, + 224, + 31, + 96, + 31, + 96, + 15, + 0, + 15, + 0, + 7, + 192, + 3, + 192, + 3, + 224, + 27, + 96, + 27, + 96, + 31, + 224, + 15, + 192, + 7, + 128, + 3, + 0, + 0, + 0, + 0, + 0, + // '%' + 0, + 0, + 0, + 0, + 28, + 64, + 62, + 192, + 62, + 192, + 55, + 192, + 63, + 128, + 63, + 128, + 27, + 0, + 3, + 0, + 7, + 0, + 7, + 224, + 7, + 240, + 15, + 176, + 13, + 176, + 29, + 224, + 25, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + // '&' + 0, + 0, + 0, + 0, + 7, + 0, + 15, + 128, + 15, + 128, + 13, + 128, + 13, + 128, + 15, + 128, + 15, + 0, + 15, + 0, + 31, + 64, + 27, + 192, + 49, + 192, + 49, + 192, + 25, + 224, + 31, + 224, + 15, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + // ''' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '(' + 0, + 128, + 1, + 128, + 3, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 7, + 0, + 3, + 0, + 3, + 0, + 1, + 128, + 1, + 128, + 0, + 0, + // ')' + 4, + 0, + 6, + 0, + 7, + 0, + 3, + 0, + 3, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 3, + 128, + 3, + 0, + 3, + 0, + 6, + 0, + 6, + 0, + 0, + 0, + // '*' + 0, + 0, + 0, + 0, + 3, + 0, + 7, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '+' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 15, + 192, + 15, + 192, + 15, + 192, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ',' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 2, + 0, + 0, + 0, + // '-' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '.' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '/' + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 192, + 0, + 192, + 1, + 192, + 1, + 128, + 1, + 128, + 3, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 6, + 0, + 14, + 0, + 12, + 0, + 28, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '0' + 0, + 0, + 0, + 0, + 3, + 0, + 7, + 128, + 15, + 192, + 12, + 192, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 28, + 192, + 13, + 192, + 15, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '1' + 0, + 0, + 0, + 0, + 1, + 0, + 3, + 0, + 7, + 0, + 7, + 0, + 15, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 15, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '2' + 0, + 0, + 0, + 0, + 3, + 0, + 7, + 128, + 15, + 192, + 28, + 192, + 8, + 192, + 0, + 192, + 1, + 192, + 3, + 128, + 7, + 128, + 6, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 31, + 192, + 31, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // '3' + 0, + 0, + 0, + 0, + 7, + 0, + 15, + 128, + 15, + 192, + 8, + 192, + 0, + 192, + 1, + 192, + 3, + 128, + 3, + 192, + 0, + 192, + 0, + 192, + 0, + 224, + 8, + 192, + 28, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '4' + 0, + 0, + 0, + 0, + 0, + 128, + 1, + 192, + 1, + 192, + 3, + 192, + 3, + 192, + 3, + 192, + 7, + 192, + 7, + 192, + 15, + 192, + 15, + 192, + 31, + 192, + 15, + 192, + 1, + 192, + 1, + 192, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '5' + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 15, + 192, + 12, + 0, + 15, + 0, + 15, + 128, + 15, + 192, + 12, + 192, + 0, + 96, + 0, + 96, + 0, + 96, + 24, + 192, + 29, + 192, + 15, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '6' + 0, + 0, + 0, + 0, + 1, + 128, + 3, + 128, + 7, + 0, + 6, + 0, + 14, + 0, + 15, + 128, + 15, + 192, + 31, + 192, + 24, + 192, + 24, + 96, + 24, + 96, + 24, + 192, + 12, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '7' + 0, + 0, + 0, + 0, + 7, + 192, + 15, + 224, + 15, + 224, + 0, + 192, + 0, + 192, + 1, + 192, + 1, + 128, + 1, + 128, + 3, + 128, + 3, + 0, + 3, + 0, + 6, + 0, + 6, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '8' + 0, + 0, + 0, + 0, + 3, + 0, + 7, + 192, + 15, + 192, + 12, + 192, + 12, + 192, + 15, + 192, + 15, + 192, + 7, + 128, + 15, + 192, + 12, + 192, + 24, + 224, + 24, + 192, + 12, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // '9' + 0, + 0, + 0, + 0, + 3, + 0, + 15, + 128, + 15, + 192, + 12, + 192, + 24, + 192, + 24, + 96, + 24, + 96, + 28, + 192, + 15, + 192, + 15, + 192, + 3, + 192, + 1, + 128, + 3, + 128, + 7, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ':' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ';' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 128, + 3, + 128, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 2, + 0, + 0, + 0, + // '<' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 1, + 192, + 3, + 192, + 7, + 128, + 14, + 0, + 28, + 0, + 14, + 0, + 7, + 0, + 3, + 128, + 1, + 192, + 0, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // '=' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 192, + 15, + 192, + 15, + 192, + 0, + 0, + 15, + 192, + 15, + 192, + 15, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '>' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 0, + 14, + 0, + 15, + 0, + 7, + 128, + 3, + 192, + 1, + 192, + 1, + 192, + 3, + 128, + 7, + 0, + 14, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '?' + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 28, + 192, + 8, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 1, + 192, + 3, + 128, + 7, + 0, + 6, + 0, + 0, + 0, + 4, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '@' + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 15, + 192, + 31, + 224, + 56, + 112, + 51, + 48, + 55, + 176, + 111, + 176, + 109, + 152, + 109, + 184, + 111, + 176, + 127, + 240, + 54, + 224, + 56, + 0, + 31, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + // 'A' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 15, + 192, + 12, + 192, + 15, + 192, + 31, + 192, + 30, + 224, + 24, + 96, + 24, + 96, + 56, + 96, + 16, + 32, + 0, + 0, + 0, + 0, + 0, + 0, + // 'B' + 0, + 0, + 0, + 0, + 31, + 128, + 31, + 192, + 31, + 192, + 24, + 192, + 24, + 192, + 24, + 192, + 31, + 192, + 31, + 224, + 31, + 224, + 24, + 96, + 24, + 96, + 24, + 96, + 27, + 224, + 31, + 192, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'C' + 0, + 0, + 0, + 0, + 3, + 192, + 7, + 224, + 15, + 224, + 28, + 96, + 24, + 0, + 24, + 0, + 24, + 0, + 56, + 0, + 48, + 0, + 56, + 0, + 24, + 0, + 24, + 96, + 30, + 224, + 15, + 224, + 7, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'D' + 0, + 0, + 0, + 0, + 30, + 0, + 31, + 128, + 31, + 192, + 25, + 192, + 24, + 224, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 224, + 25, + 224, + 31, + 192, + 31, + 128, + 14, + 0, + 0, + 0, + 0, + 0, + // 'E' + 0, + 0, + 0, + 0, + 31, + 224, + 31, + 224, + 31, + 192, + 24, + 0, + 24, + 0, + 24, + 0, + 31, + 192, + 31, + 192, + 31, + 192, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 31, + 224, + 31, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + // 'F' + 0, + 0, + 0, + 0, + 31, + 224, + 31, + 240, + 31, + 224, + 24, + 0, + 24, + 0, + 24, + 0, + 31, + 192, + 31, + 192, + 31, + 192, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'G' + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 31, + 224, + 56, + 96, + 48, + 96, + 48, + 32, + 48, + 0, + 48, + 0, + 49, + 240, + 49, + 240, + 49, + 240, + 56, + 96, + 29, + 224, + 31, + 192, + 15, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'H' + 0, + 0, + 0, + 0, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 112, + 63, + 240, + 63, + 240, + 63, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 0, + 0, + 0, + 0, + 0, + 0, + // 'I' + 0, + 0, + 0, + 0, + 15, + 192, + 15, + 192, + 7, + 128, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 15, + 192, + 15, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'J' + 0, + 0, + 0, + 0, + 3, + 224, + 3, + 224, + 1, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + 12, + 192, + 12, + 192, + 15, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'K' + 0, + 0, + 0, + 0, + 24, + 96, + 24, + 224, + 25, + 192, + 27, + 128, + 31, + 0, + 31, + 0, + 30, + 0, + 28, + 0, + 30, + 0, + 30, + 0, + 31, + 0, + 27, + 128, + 25, + 192, + 24, + 224, + 24, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + // 'L' + 0, + 0, + 0, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 15, + 224, + 15, + 224, + 15, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'M' + 0, + 0, + 0, + 0, + 24, + 96, + 24, + 96, + 56, + 96, + 56, + 224, + 60, + 240, + 60, + 240, + 60, + 240, + 61, + 176, + 127, + 176, + 103, + 176, + 103, + 152, + 103, + 24, + 103, + 24, + 99, + 24, + 67, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + // 'N' + 0, + 0, + 0, + 0, + 24, + 96, + 24, + 96, + 28, + 96, + 28, + 96, + 30, + 96, + 30, + 96, + 31, + 96, + 27, + 96, + 27, + 224, + 25, + 224, + 25, + 224, + 24, + 224, + 24, + 224, + 24, + 96, + 24, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + // 'O' + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 14, + 224, + 28, + 96, + 24, + 96, + 24, + 112, + 48, + 48, + 48, + 48, + 48, + 112, + 48, + 96, + 24, + 96, + 24, + 224, + 29, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'P' + 0, + 0, + 0, + 0, + 31, + 128, + 31, + 192, + 31, + 224, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 224, + 27, + 224, + 31, + 192, + 31, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Q' + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 31, + 224, + 24, + 112, + 56, + 112, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 49, + 240, + 57, + 224, + 29, + 224, + 31, + 240, + 15, + 240, + 0, + 16, + 0, + 0, + 0, + 0, + // 'R' + 0, + 0, + 0, + 0, + 31, + 128, + 31, + 192, + 27, + 192, + 24, + 224, + 24, + 96, + 24, + 96, + 24, + 224, + 31, + 192, + 31, + 128, + 31, + 128, + 25, + 192, + 24, + 192, + 24, + 224, + 24, + 96, + 24, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + // 'S' + 0, + 0, + 0, + 0, + 7, + 192, + 15, + 224, + 14, + 224, + 28, + 96, + 28, + 0, + 14, + 0, + 15, + 128, + 7, + 192, + 1, + 224, + 0, + 96, + 24, + 96, + 24, + 96, + 28, + 224, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'T' + 0, + 0, + 0, + 0, + 31, + 224, + 31, + 224, + 15, + 192, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'U' + 0, + 0, + 0, + 0, + 48, + 32, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 112, + 56, + 96, + 24, + 96, + 24, + 96, + 28, + 224, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'V' + 0, + 0, + 0, + 0, + 16, + 32, + 24, + 96, + 24, + 96, + 24, + 96, + 28, + 224, + 12, + 192, + 12, + 192, + 12, + 192, + 15, + 128, + 7, + 128, + 7, + 128, + 7, + 128, + 7, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'W' + 0, + 0, + 0, + 0, + 195, + 12, + 195, + 12, + 199, + 28, + 231, + 24, + 103, + 152, + 103, + 152, + 103, + 176, + 125, + 176, + 61, + 176, + 61, + 240, + 60, + 224, + 60, + 224, + 56, + 224, + 24, + 224, + 24, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + // 'X' + 0, + 0, + 0, + 0, + 16, + 48, + 56, + 112, + 24, + 96, + 28, + 224, + 14, + 192, + 7, + 192, + 7, + 128, + 3, + 0, + 7, + 128, + 15, + 192, + 12, + 192, + 28, + 224, + 24, + 96, + 56, + 112, + 48, + 48, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Y' + 0, + 0, + 0, + 0, + 48, + 48, + 56, + 48, + 24, + 112, + 24, + 96, + 12, + 224, + 12, + 192, + 15, + 192, + 7, + 128, + 7, + 128, + 3, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Z' + 0, + 0, + 0, + 0, + 31, + 224, + 31, + 240, + 15, + 224, + 0, + 224, + 0, + 192, + 1, + 128, + 3, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 12, + 0, + 28, + 0, + 28, + 0, + 63, + 224, + 63, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + // '[' + 7, + 128, + 7, + 128, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 7, + 128, + 7, + 128, + 3, + 0, + // '\' + 0, + 0, + 0, + 0, + 8, + 0, + 28, + 0, + 12, + 0, + 12, + 0, + 6, + 0, + 6, + 0, + 7, + 0, + 3, + 0, + 3, + 0, + 1, + 128, + 1, + 128, + 1, + 192, + 0, + 192, + 0, + 192, + 0, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + // ']' + 7, + 128, + 7, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 7, + 128, + 7, + 128, + 3, + 0, + // '^' + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 128, + 7, + 128, + 7, + 128, + 12, + 192, + 12, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '_' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 224, + 31, + 224, + 0, + 0, + 0, + 0, + // '`' + 0, + 0, + 6, + 0, + 7, + 0, + 3, + 0, + 3, + 128, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'a' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 192, + 7, + 192, + 14, + 192, + 12, + 192, + 12, + 192, + 24, + 192, + 24, + 192, + 12, + 192, + 15, + 192, + 15, + 192, + 7, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'b' + 0, + 0, + 0, + 0, + 8, + 0, + 24, + 0, + 24, + 0, + 24, + 0, + 31, + 128, + 31, + 192, + 31, + 192, + 28, + 224, + 28, + 96, + 24, + 96, + 24, + 96, + 24, + 192, + 29, + 192, + 31, + 192, + 15, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'c' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 128, + 7, + 192, + 14, + 192, + 12, + 0, + 12, + 0, + 24, + 0, + 24, + 0, + 12, + 64, + 14, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'd' + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 192, + 0, + 192, + 0, + 192, + 7, + 192, + 15, + 192, + 12, + 192, + 28, + 192, + 24, + 192, + 24, + 192, + 24, + 192, + 24, + 192, + 13, + 192, + 15, + 192, + 7, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'e' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 14, + 192, + 13, + 192, + 27, + 192, + 31, + 0, + 30, + 0, + 12, + 0, + 14, + 224, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'f' + 0, + 0, + 0, + 0, + 1, + 192, + 3, + 192, + 3, + 128, + 3, + 0, + 15, + 192, + 15, + 192, + 7, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'g' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 192, + 7, + 192, + 14, + 192, + 12, + 192, + 24, + 192, + 24, + 192, + 24, + 192, + 28, + 192, + 15, + 192, + 15, + 192, + 7, + 192, + 0, + 192, + 15, + 192, + 15, + 128, + // 'h' + 0, + 0, + 0, + 0, + 8, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 15, + 128, + 15, + 192, + 14, + 192, + 14, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + // 'i' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'j' + 0, + 0, + 0, + 0, + 1, + 128, + 1, + 128, + 1, + 128, + 0, + 0, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 1, + 128, + 13, + 128, + 13, + 128, + 15, + 128, + 7, + 0, + // 'k' + 0, + 0, + 0, + 0, + 8, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 192, + 13, + 192, + 13, + 128, + 15, + 128, + 15, + 0, + 15, + 0, + 13, + 128, + 13, + 192, + 12, + 192, + 12, + 224, + 12, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + // 'l' + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'm' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 110, + 240, + 127, + 240, + 123, + 176, + 115, + 48, + 99, + 48, + 99, + 48, + 99, + 48, + 99, + 48, + 99, + 48, + 99, + 48, + 99, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + // 'n' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 128, + 31, + 192, + 30, + 192, + 30, + 192, + 28, + 192, + 28, + 224, + 28, + 224, + 24, + 224, + 24, + 224, + 24, + 224, + 8, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + // 'o' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 12, + 192, + 12, + 224, + 24, + 96, + 24, + 96, + 24, + 96, + 24, + 192, + 13, + 192, + 15, + 128, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'p' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 128, + 15, + 192, + 14, + 192, + 12, + 192, + 12, + 96, + 12, + 96, + 12, + 96, + 12, + 192, + 15, + 192, + 15, + 192, + 15, + 128, + 12, + 0, + 12, + 0, + 12, + 0, + // 'q' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 192, + 7, + 192, + 14, + 192, + 12, + 192, + 28, + 192, + 24, + 192, + 24, + 192, + 24, + 192, + 12, + 192, + 15, + 192, + 7, + 192, + 0, + 192, + 0, + 192, + 0, + 192, + // 'r' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 192, + 15, + 192, + 15, + 192, + 14, + 192, + 14, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 14, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 's' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 128, + 15, + 192, + 12, + 192, + 12, + 192, + 7, + 0, + 7, + 192, + 1, + 192, + 12, + 192, + 12, + 192, + 15, + 192, + 7, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 't' + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 15, + 192, + 15, + 192, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'u' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 12, + 192, + 13, + 192, + 15, + 192, + 7, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // 'v' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 64, + 28, + 224, + 12, + 192, + 12, + 192, + 12, + 192, + 7, + 128, + 7, + 128, + 7, + 128, + 7, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'w' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 51, + 48, + 51, + 48, + 55, + 96, + 55, + 96, + 31, + 224, + 31, + 224, + 29, + 192, + 29, + 192, + 29, + 192, + 29, + 192, + 8, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + // 'x' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 96, + 28, + 96, + 12, + 192, + 7, + 192, + 7, + 128, + 3, + 128, + 7, + 128, + 15, + 192, + 28, + 192, + 24, + 224, + 24, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + // 'y' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 96, + 24, + 96, + 12, + 192, + 12, + 192, + 12, + 192, + 7, + 128, + 7, + 128, + 7, + 128, + 3, + 0, + 3, + 0, + 3, + 0, + 6, + 0, + 6, + 0, + 6, + 0, + // 'z' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 192, + 15, + 192, + 1, + 192, + 1, + 128, + 3, + 128, + 3, + 0, + 7, + 0, + 6, + 0, + 14, + 0, + 31, + 192, + 15, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + // '{' + 1, + 128, + 3, + 128, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 7, + 0, + 14, + 0, + 6, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 128, + 3, + 128, + 0, + 128, + // '|' + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + // '}' + 6, + 0, + 7, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 128, + 1, + 128, + 1, + 128, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 3, + 0, + 7, + 0, + 14, + 0, + 4, + 0, + // '~' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 32, + 30, + 96, + 27, + 96, + 27, + 192, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; + +sFONT Font20 = { + Font20_Table, + 14, + 20, +}; diff --git a/lib/gfx/Fonts/font24.c b/lib/gfx/Fonts/font24.c index 46be5ad670b080da5ec1292a2eebe94a27ed2cc7..a721c554432c90dc7f45775f7b378e1ea113bd9b 100644 --- a/lib/gfx/Fonts/font24.c +++ b/lib/gfx/Fonts/font24.c @@ -1,2520 +1,6945 @@ -/** - ****************************************************************************** - * @file font24.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -const uint8_t Font24_Table [] = -{ - // @0 ' ' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @72 '!' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @144 '"' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0E, 0x70, 0x00, // ### ### - 0x0E, 0x70, 0x00, // ### ### - 0x0E, 0x70, 0x00, // ### ### - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @216 '#' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @288 '$' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x07, 0xB0, 0x00, // #### ## - 0x0F, 0xF0, 0x00, // ######## - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x70, 0x00, // ## ### - 0x1C, 0x00, 0x00, // ### - 0x0F, 0x80, 0x00, // ##### - 0x07, 0xE0, 0x00, // ###### - 0x00, 0xF0, 0x00, // #### - 0x18, 0x30, 0x00, // ## ## - 0x1C, 0x30, 0x00, // ### ## - 0x1C, 0x70, 0x00, // ### ### - 0x1F, 0xE0, 0x00, // ######## - 0x1B, 0xC0, 0x00, // ## #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @360 '%' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x80, 0x00, // #### - 0x0F, 0xC0, 0x00, // ###### - 0x1C, 0xE0, 0x00, // ### ### - 0x18, 0x60, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x1C, 0xE0, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x07, 0xE0, 0x00, // ###### - 0x1F, 0xF0, 0x00, // ######### - 0x07, 0x38, 0x00, // ### ### - 0x06, 0x18, 0x00, // ## ## - 0x06, 0x18, 0x00, // ## ## - 0x07, 0x38, 0x00, // ### ### - 0x03, 0xF0, 0x00, // ###### - 0x01, 0xE0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @432 '&' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xF0, 0x00, // ###### - 0x07, 0xF0, 0x00, // ####### - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x07, 0x00, 0x00, // ### - 0x0F, 0x9C, 0x00, // ##### ### - 0x1D, 0xFC, 0x00, // ### ####### - 0x18, 0xF0, 0x00, // ## #### - 0x18, 0x70, 0x00, // ## ### - 0x0F, 0xFC, 0x00, // ########## - 0x07, 0xDC, 0x00, // ##### ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @504 ''' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @576 '(' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0xF0, 0x00, // #### - 0x00, 0xE0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0x38, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @648 ')' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x18, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x0F, 0x00, 0x00, // #### - 0x0E, 0x00, 0x00, // ### - 0x1C, 0x00, 0x00, // ### - 0x18, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @720 '*' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1D, 0xB8, 0x00, // ### ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @792 '+' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @864 ',' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @936 '-' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1008 '.' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1080 '/' (17 pixels wide) - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x0E, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1152 '0' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x07, 0xE0, 0x00, // ###### - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1224 '1' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x80, 0x00, // # - 0x07, 0x80, 0x00, // #### - 0x1F, 0x80, 0x00, // ###### - 0x1D, 0x80, 0x00, // ### ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1296 '2' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x1F, 0xF0, 0x00, // ######### - 0x38, 0x30, 0x00, // ### ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1368 '3' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xE0, 0x00, // ####### - 0x0C, 0x70, 0x00, // ## ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x70, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1440 '4' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xE0, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x03, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x30, 0x60, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x60, 0x00, // ## - 0x03, 0xF8, 0x00, // ####### - 0x03, 0xF8, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1512 '5' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF0, 0x00, // ######### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xC0, 0x00, // ## #### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x30, 0x00, // ### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x30, 0x30, 0x00, // ## ## - 0x3F, 0xF0, 0x00, // ########## - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1584 '6' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xF8, 0x00, // ##### - 0x03, 0xF8, 0x00, // ####### - 0x07, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xC0, 0x00, // ## #### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x30, 0x00, // ### ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x38, 0x00, // ## ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1656 '7' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0xE0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1728 '8' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xE0, 0x00, // ###### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x07, 0xE0, 0x00, // ###### - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x07, 0xE0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1800 '9' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x30, 0x00, // ### ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x38, 0x00, // ## ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xD8, 0x00, // #### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x1F, 0xC0, 0x00, // ####### - 0x1F, 0x00, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1872 ':' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1944 ';' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xF0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x02, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2016 '<' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x1C, 0x00, // ### - 0x00, 0x3C, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x0F, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0xF0, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0x0F, 0x00, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0x3C, 0x00, // #### - 0x00, 0x1C, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2088 '=' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2160 '>' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x70, 0x00, 0x00, // ### - 0x78, 0x00, 0x00, // #### - 0x1E, 0x00, 0x00, // #### - 0x07, 0x80, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x00, 0x1E, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x07, 0x80, 0x00, // #### - 0x1E, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x70, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2232 '?' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x0F, 0xE0, 0x00, // ####### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x30, 0x00, // ## ## - 0x00, 0x70, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x03, 0xC0, 0x00, // #### - 0x03, 0x80, 0x00, // ### - 0x03, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2304 '@' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xE0, 0x00, // ##### - 0x07, 0xF0, 0x00, // ####### - 0x0E, 0x38, 0x00, // ### ### - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x78, 0x00, // ## #### - 0x18, 0xF8, 0x00, // ## ##### - 0x19, 0xD8, 0x00, // ## ### ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x18, 0xF8, 0x00, // ## ##### - 0x18, 0x78, 0x00, // ## #### - 0x18, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0E, 0x18, 0x00, // ### ## - 0x07, 0xF8, 0x00, // ######## - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2376 'A' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0xC0, 0x00, // ####### - 0x01, 0xC0, 0x00, // ### - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0F, 0xF8, 0x00, // ######### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0xFC, 0x7F, 0x00, // ###### ####### - 0xFC, 0x7F, 0x00, // ###### ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2448 'B' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xE0, 0x00, // ########## - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x1C, 0x00, // ## ### - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF0, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2520 'C' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2592 'D' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xC0, 0x00, // ######### - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0xF0, 0x00, // ########### - 0x7F, 0xE0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2664 'E' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF8, 0x00, // ############ - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x80, 0x00, // ## ## - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x19, 0x80, 0x00, // ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF8, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2736 'F' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0xCC, 0x00, // ## ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0F, 0xC0, 0x00, // ###### - 0x0F, 0xC0, 0x00, // ###### - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2808 'G' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0xFE, 0x00, // ## ####### - 0x30, 0xFE, 0x00, // ## ####### - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x0C, 0x00, // ### ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xFC, 0x00, // ########## - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2880 'H' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2952 'I' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3024 'J' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xFE, 0x00, // ########## - 0x07, 0xFE, 0x00, // ########## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x60, 0x00, // ## ## - 0x3F, 0xE0, 0x00, // ######### - 0x0F, 0x80, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3096 'K' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x3E, 0x00, // ####### ##### - 0x7F, 0x3E, 0x00, // ####### ##### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x18, 0xC0, 0x00, // ## ## - 0x19, 0x80, 0x00, // ## ## - 0x1B, 0x80, 0x00, // ## ### - 0x1F, 0xC0, 0x00, // ####### - 0x1C, 0xE0, 0x00, // ### ### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x1F, 0x00, // ####### ##### - 0x7F, 0x1F, 0x00, // ####### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3168 'L' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x80, 0x00, // ######## - 0x7F, 0x80, 0x00, // ######## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3240 'M' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xF0, 0x0F, 0x00, // #### #### - 0xF8, 0x1F, 0x00, // ##### ##### - 0x38, 0x1C, 0x00, // ### ### - 0x3C, 0x3C, 0x00, // #### #### - 0x3C, 0x3C, 0x00, // #### #### - 0x36, 0x6C, 0x00, // ## ## ## ## - 0x36, 0x6C, 0x00, // ## ## ## ## - 0x33, 0xCC, 0x00, // ## #### ## - 0x33, 0xCC, 0x00, // ## #### ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0xFE, 0x7F, 0x00, // ####### ####### - 0xFE, 0x7F, 0x00, // ####### ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3312 'N' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0xFE, 0x00, // #### ####### - 0x78, 0xFE, 0x00, // #### ####### - 0x1C, 0x18, 0x00, // ### ## - 0x1E, 0x18, 0x00, // #### ## - 0x1F, 0x18, 0x00, // ##### ## - 0x1B, 0x18, 0x00, // ## ## ## - 0x1B, 0x98, 0x00, // ## ### ## - 0x19, 0xD8, 0x00, // ## ### ## - 0x18, 0xD8, 0x00, // ## ## ## - 0x18, 0xF8, 0x00, // ## ##### - 0x18, 0x78, 0x00, // ## #### - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x18, 0x00, // ####### ## - 0x7F, 0x18, 0x00, // ####### ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3384 'O' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3456 'P' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF8, 0x00, // ########### - 0x0C, 0x1C, 0x00, // ## ### - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0F, 0xF8, 0x00, // ######### - 0x0F, 0xE0, 0x00, // ####### - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3528 'Q' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x07, 0xC0, 0x00, // ##### - 0x07, 0xCC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x0C, 0x38, 0x00, // ## ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3600 'R' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xE0, 0x00, // ########## - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xC0, 0x00, // ####### - 0x18, 0xE0, 0x00, // ## ### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x1E, 0x00, // ####### #### - 0x7F, 0x0E, 0x00, // ####### ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3672 'S' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xD8, 0x00, // ##### ## - 0x0F, 0xF8, 0x00, // ######### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1E, 0x00, 0x00, // #### - 0x0F, 0xC0, 0x00, // ###### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x78, 0x00, // #### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x1F, 0xF0, 0x00, // ######### - 0x1B, 0xE0, 0x00, // ## ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3744 'T' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3816 'U' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3888 'V' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x7F, 0x00, // ####### ####### - 0x7F, 0x7F, 0x00, // ####### ####### - 0x18, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x00, 0x80, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3960 'W' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xFE, 0x3F, 0x80, // ####### ####### - 0xFE, 0x3F, 0x80, // ####### ####### - 0x30, 0x06, 0x00, // ## ## - 0x30, 0x06, 0x00, // ## ## - 0x30, 0x86, 0x00, // ## # ## - 0x19, 0xCC, 0x00, // ## ### ## - 0x19, 0xCC, 0x00, // ## ### ## - 0x1B, 0x6C, 0x00, // ## ## ## ## - 0x1B, 0x6C, 0x00, // ## ## ## ## - 0x1E, 0x7C, 0x00, // #### ##### - 0x0E, 0x38, 0x00, // ### ### - 0x0E, 0x38, 0x00, // ### ### - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4032 'X' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4104 'Y' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7C, 0x7E, 0x00, // ##### ###### - 0x7C, 0x7E, 0x00, // ##### ###### - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4176 'Z' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x18, 0xC0, 0x00, // ## ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4248 '[' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0xF0, 0x00, // ##### - 0x01, 0xF0, 0x00, // ##### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xF0, 0x00, // ##### - 0x01, 0xF0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4320 '\' (17 pixels wide) - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x0E, 0x00, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4392 ']' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x80, 0x00, // ##### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x80, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4464 '^' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x80, 0x00, // # - 0x01, 0xC0, 0x00, // ### - 0x03, 0xE0, 0x00, // ##### - 0x07, 0x70, 0x00, // ### ### - 0x06, 0x30, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x10, 0x04, 0x00, // # # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4536 '_' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xFF, 0xFF, 0x00, // ################ - 0xFF, 0xFF, 0x00, // ################ - - // @4608 '`' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x03, 0x00, 0x00, // ## - 0x03, 0x80, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4680 'a' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0F, 0xC0, 0x00, // ###### - 0x1F, 0xE0, 0x00, // ######## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x07, 0xF0, 0x00, // ####### - 0x1F, 0xF0, 0x00, // ######### - 0x38, 0x30, 0x00, // ### ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x70, 0x00, // ## ### - 0x1F, 0xFC, 0x00, // ########### - 0x0F, 0xBC, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4752 'b' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xE0, 0x00, // ## ##### - 0x1F, 0xF8, 0x00, // ########## - 0x1C, 0x18, 0x00, // ### ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x18, 0x00, // ### ## - 0x7F, 0xF8, 0x00, // ############ - 0x7B, 0xE0, 0x00, // #### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4824 'c' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x38, 0x0C, 0x00, // ### ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x38, 0x0C, 0x00, // ### ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4896 'd' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x78, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x07, 0xD8, 0x00, // ##### ## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xFE, 0x00, // ############ - 0x07, 0xDE, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4968 'e' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xE0, 0x00, // ###### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x18, 0x0C, 0x00, // ## ## - 0x1F, 0xFC, 0x00, // ########### - 0x07, 0xF0, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5040 'f' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0xFC, 0x00, // ####### - 0x03, 0xFC, 0x00, // ######## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5112 'g' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xDE, 0x00, // ##### #### - 0x1F, 0xFE, 0x00, // ############ - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xD8, 0x00, // ##### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5184 'h' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xE0, 0x00, // ## ##### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5256 'i' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5328 'j' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF0, 0x00, // ######### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x1F, 0xE0, 0x00, // ######## - 0x1F, 0x80, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5400 'k' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3C, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0xF8, 0x00, // ## ##### - 0x0C, 0xF8, 0x00, // ## ##### - 0x0C, 0xC0, 0x00, // ## ## - 0x0D, 0x80, 0x00, // ## ## - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x00, 0x00, // #### - 0x0F, 0x80, 0x00, // ##### - 0x0D, 0xC0, 0x00, // ## ### - 0x0C, 0xE0, 0x00, // ## ### - 0x3C, 0x7C, 0x00, // #### ##### - 0x3C, 0x7C, 0x00, // #### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5472 'l' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5544 'm' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xF7, 0x78, 0x00, // #### ### #### - 0xFF, 0xFC, 0x00, // ############## - 0x39, 0xCC, 0x00, // ### ### ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0xFD, 0xEF, 0x00, // ###### #### #### - 0xFD, 0xEF, 0x00, // ###### #### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5616 'n' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7B, 0xE0, 0x00, // #### ##### - 0x7F, 0xF0, 0x00, // ########### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5688 'o' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5760 'p' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7B, 0xE0, 0x00, // #### ##### - 0x7F, 0xF8, 0x00, // ############ - 0x1C, 0x18, 0x00, // ### ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x18, 0x00, // ### ## - 0x1F, 0xF8, 0x00, // ########## - 0x1B, 0xE0, 0x00, // ## ##### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x7F, 0x00, 0x00, // ####### - 0x7F, 0x00, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5832 'q' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xDE, 0x00, // ##### #### - 0x1F, 0xFE, 0x00, // ############ - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xD8, 0x00, // ##### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0xFE, 0x00, // ####### - 0x00, 0xFE, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5904 'r' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3E, 0x78, 0x00, // ##### #### - 0x3E, 0xFC, 0x00, // ##### ###### - 0x07, 0xCC, 0x00, // ##### ## - 0x07, 0x00, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5976 's' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xF8, 0x00, // ######## - 0x0F, 0xF8, 0x00, // ######### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1F, 0x80, 0x00, // ###### - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0xF8, 0x00, // ##### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xE0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6048 't' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x1C, 0x00, // ## ### - 0x07, 0xFC, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6120 'u' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x78, 0x00, // #### #### - 0x78, 0x78, 0x00, // #### #### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x0F, 0xFE, 0x00, // ########### - 0x07, 0xDE, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6192 'v' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7C, 0x3E, 0x00, // ##### ##### - 0x7C, 0x3E, 0x00, // ##### ##### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6264 'w' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x3C, 0x00, // #### #### - 0x78, 0x3C, 0x00, // #### #### - 0x31, 0x18, 0x00, // ## # ## - 0x33, 0x98, 0x00, // ## ### ## - 0x33, 0x98, 0x00, // ## ### ## - 0x1A, 0xB0, 0x00, // ## # # ## - 0x1E, 0xF0, 0x00, // #### #### - 0x1E, 0xF0, 0x00, // #### #### - 0x1C, 0x60, 0x00, // ### ## - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6336 'x' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3E, 0x7C, 0x00, // ##### ##### - 0x3E, 0x7C, 0x00, // ##### ##### - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x3E, 0x7C, 0x00, // ##### ##### - 0x3E, 0x7C, 0x00, // ##### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6408 'y' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x1F, 0x00, // ###### ##### - 0x7E, 0x1F, 0x00, // ###### ##### - 0x18, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0xE0, 0x00, // ##### - 0x01, 0xC0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6480 'z' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6552 '{' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xE0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x80, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xE0, 0x00, // #### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6624 '|' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6696 '}' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x00, 0x00, // ### - 0x07, 0x80, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x07, 0x80, 0x00, // #### - 0x07, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6768 '~' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0E, 0x00, 0x00, // ### - 0x1F, 0x18, 0x00, // ##### ## - 0x3B, 0xB8, 0x00, // ### ### ### - 0x31, 0xF0, 0x00, // ## ##### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // -}; - -sFONT Font24 = { - Font24_Table, - 17, /* Width */ - 24, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#include "fonts.h" + +const uint8_t Font24_Table[] = { + // ' ' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '!' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '"' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 96, + 0, + 3, + 96, + 0, + 3, + 96, + 0, + 3, + 96, + 0, + 3, + 96, + 0, + 3, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '#' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 152, + 0, + 1, + 152, + 0, + 1, + 184, + 0, + 3, + 184, + 0, + 3, + 184, + 0, + 31, + 252, + 0, + 31, + 252, + 0, + 15, + 248, + 0, + 7, + 96, + 0, + 7, + 96, + 0, + 63, + 248, + 0, + 63, + 252, + 0, + 31, + 248, + 0, + 14, + 192, + 0, + 14, + 192, + 0, + 12, + 192, + 0, + 13, + 192, + 0, + 12, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '$' + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 15, + 248, + 0, + 15, + 216, + 0, + 15, + 216, + 0, + 15, + 192, + 0, + 15, + 192, + 0, + 7, + 192, + 0, + 3, + 224, + 0, + 1, + 240, + 0, + 1, + 248, + 0, + 1, + 248, + 0, + 13, + 216, + 0, + 29, + 216, + 0, + 15, + 248, + 0, + 15, + 240, + 0, + 7, + 240, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + // '%' + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 30, + 48, + 0, + 31, + 48, + 0, + 63, + 112, + 0, + 59, + 112, + 0, + 59, + 96, + 0, + 31, + 224, + 0, + 30, + 192, + 0, + 13, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 248, + 0, + 3, + 248, + 0, + 7, + 252, + 0, + 7, + 204, + 0, + 6, + 204, + 0, + 14, + 252, + 0, + 12, + 120, + 0, + 12, + 120, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '&' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 192, + 0, + 7, + 192, + 0, + 7, + 224, + 0, + 14, + 96, + 0, + 14, + 96, + 0, + 6, + 224, + 0, + 7, + 192, + 0, + 7, + 192, + 0, + 15, + 128, + 0, + 15, + 208, + 0, + 29, + 248, + 0, + 24, + 240, + 0, + 24, + 112, + 0, + 24, + 112, + 0, + 28, + 248, + 0, + 15, + 248, + 0, + 15, + 220, + 0, + 7, + 136, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ''' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '(' + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 128, + 0, + 3, + 128, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 0, + 192, + 0, + 0, + 224, + 0, + 0, + 96, + 0, + 0, + 0, + 0, + // ')' + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 128, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 224, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + // '*' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 128, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + 3, + 192, + 0, + 1, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '+' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ',' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 0, + 0, + // '-' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 3, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '.' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '/' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 48, + 0, + 0, + 56, + 0, + 0, + 48, + 0, + 0, + 112, + 0, + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 7, + 0, + 0, + 6, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '0' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 224, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 6, + 48, + 0, + 14, + 56, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 7, + 224, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '1' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 3, + 192, + 0, + 3, + 192, + 0, + 7, + 192, + 0, + 7, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 7, + 224, + 0, + 3, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '2' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 192, + 0, + 7, + 224, + 0, + 7, + 240, + 0, + 14, + 48, + 0, + 12, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 112, + 0, + 0, + 224, + 0, + 1, + 192, + 0, + 3, + 128, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 6, + 0, + 0, + 14, + 0, + 0, + 15, + 240, + 0, + 15, + 248, + 0, + 15, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '3' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 224, + 0, + 7, + 224, + 0, + 7, + 240, + 0, + 4, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 240, + 0, + 1, + 224, + 0, + 1, + 240, + 0, + 0, + 240, + 0, + 0, + 48, + 0, + 0, + 56, + 0, + 0, + 56, + 0, + 12, + 48, + 0, + 14, + 48, + 0, + 15, + 240, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '4' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 1, + 224, + 0, + 1, + 224, + 0, + 1, + 224, + 0, + 3, + 224, + 0, + 3, + 96, + 0, + 7, + 96, + 0, + 6, + 96, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 7, + 240, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '5' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 7, + 224, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 6, + 48, + 0, + 0, + 56, + 0, + 0, + 56, + 0, + 0, + 56, + 0, + 0, + 56, + 0, + 12, + 48, + 0, + 14, + 112, + 0, + 15, + 240, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '6' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 224, + 0, + 1, + 224, + 0, + 3, + 192, + 0, + 3, + 128, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 224, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 12, + 48, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '7' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 248, + 0, + 15, + 248, + 0, + 7, + 248, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 112, + 0, + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 7, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '8' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 6, + 48, + 0, + 6, + 48, + 0, + 6, + 48, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 14, + 48, + 0, + 14, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '9' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 192, + 0, + 7, + 224, + 0, + 7, + 240, + 0, + 14, + 48, + 0, + 12, + 48, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 14, + 56, + 0, + 15, + 240, + 0, + 7, + 240, + 0, + 3, + 240, + 0, + 0, + 112, + 0, + 0, + 224, + 0, + 1, + 224, + 0, + 3, + 192, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ':' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 0, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ';' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 0, + 0, + // '<' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 0, + 0, + 48, + 0, + 0, + 112, + 0, + 1, + 224, + 0, + 3, + 192, + 0, + 7, + 128, + 0, + 15, + 0, + 0, + 15, + 0, + 0, + 7, + 128, + 0, + 3, + 192, + 0, + 1, + 224, + 0, + 0, + 240, + 0, + 0, + 112, + 0, + 0, + 32, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '=' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '>' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 14, + 0, + 0, + 15, + 0, + 0, + 7, + 128, + 0, + 3, + 192, + 0, + 1, + 240, + 0, + 0, + 112, + 0, + 0, + 112, + 0, + 0, + 240, + 0, + 1, + 224, + 0, + 3, + 192, + 0, + 7, + 128, + 0, + 6, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '?' + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 192, + 0, + 7, + 224, + 0, + 15, + 240, + 0, + 14, + 112, + 0, + 12, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 112, + 0, + 0, + 112, + 0, + 0, + 224, + 0, + 1, + 192, + 0, + 3, + 128, + 0, + 3, + 128, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '@' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 7, + 240, + 0, + 15, + 248, + 0, + 30, + 60, + 0, + 28, + 28, + 0, + 59, + 204, + 0, + 55, + 238, + 0, + 55, + 230, + 0, + 54, + 70, + 0, + 126, + 230, + 0, + 126, + 230, + 0, + 63, + 238, + 0, + 55, + 252, + 0, + 63, + 252, + 0, + 56, + 16, + 0, + 28, + 16, + 0, + 15, + 248, + 0, + 15, + 240, + 0, + 3, + 224, + 0, + 0, + 0, + 0, + // 'A' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 224, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 96, + 0, + 7, + 112, + 0, + 7, + 112, + 0, + 7, + 240, + 0, + 15, + 240, + 0, + 31, + 248, + 0, + 30, + 56, + 0, + 12, + 24, + 0, + 28, + 24, + 0, + 28, + 28, + 0, + 24, + 28, + 0, + 24, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'B' + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 128, + 0, + 15, + 224, + 0, + 31, + 240, + 0, + 28, + 240, + 0, + 28, + 48, + 0, + 28, + 48, + 0, + 28, + 48, + 0, + 28, + 112, + 0, + 31, + 240, + 0, + 31, + 240, + 0, + 31, + 248, + 0, + 28, + 24, + 0, + 28, + 28, + 0, + 28, + 28, + 0, + 28, + 24, + 0, + 28, + 248, + 0, + 31, + 240, + 0, + 31, + 224, + 0, + 15, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'C' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 192, + 0, + 3, + 248, + 0, + 7, + 248, + 0, + 7, + 56, + 0, + 14, + 24, + 0, + 14, + 0, + 0, + 12, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 24, + 0, + 0, + 24, + 0, + 0, + 24, + 0, + 0, + 24, + 0, + 0, + 28, + 8, + 0, + 12, + 28, + 0, + 14, + 60, + 0, + 7, + 248, + 0, + 7, + 240, + 0, + 1, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'D' + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 31, + 128, + 0, + 31, + 192, + 0, + 31, + 224, + 0, + 28, + 240, + 0, + 28, + 56, + 0, + 28, + 56, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 28, + 28, + 0, + 28, + 28, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 28, + 56, + 0, + 28, + 120, + 0, + 31, + 240, + 0, + 31, + 224, + 0, + 15, + 192, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'E' + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 248, + 0, + 31, + 248, + 0, + 31, + 248, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 31, + 240, + 0, + 31, + 248, + 0, + 31, + 240, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 28, + 0, + 0, + 31, + 248, + 0, + 31, + 248, + 0, + 15, + 248, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'F' + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 248, + 0, + 15, + 252, + 0, + 15, + 252, + 0, + 14, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'G' + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 7, + 240, + 0, + 15, + 240, + 0, + 15, + 120, + 0, + 28, + 24, + 0, + 24, + 28, + 0, + 56, + 12, + 0, + 56, + 0, + 0, + 56, + 0, + 0, + 48, + 0, + 0, + 48, + 124, + 0, + 56, + 254, + 0, + 56, + 254, + 0, + 56, + 28, + 0, + 28, + 24, + 0, + 30, + 120, + 0, + 15, + 240, + 0, + 7, + 240, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'H' + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 8, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 60, + 0, + 31, + 252, + 0, + 31, + 252, + 0, + 31, + 252, + 0, + 28, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'I' + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'J' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 240, + 0, + 1, + 248, + 0, + 1, + 248, + 0, + 0, + 240, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 4, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 6, + 112, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'K' + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 16, + 0, + 12, + 56, + 0, + 12, + 120, + 0, + 12, + 112, + 0, + 12, + 224, + 0, + 13, + 192, + 0, + 15, + 192, + 0, + 15, + 128, + 0, + 15, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 15, + 0, + 0, + 15, + 128, + 0, + 13, + 192, + 0, + 12, + 224, + 0, + 12, + 240, + 0, + 12, + 120, + 0, + 12, + 56, + 0, + 12, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'L' + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 0, + 6, + 120, + 0, + 7, + 248, + 0, + 7, + 248, + 0, + 7, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'M' + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 8, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 28, + 60, + 0, + 28, + 60, + 0, + 30, + 60, + 0, + 30, + 60, + 0, + 62, + 124, + 0, + 62, + 124, + 0, + 54, + 108, + 0, + 55, + 110, + 0, + 55, + 238, + 0, + 51, + 230, + 0, + 115, + 198, + 0, + 115, + 198, + 0, + 99, + 198, + 0, + 97, + 199, + 0, + 97, + 135, + 0, + 97, + 130, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'N' + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 8, + 0, + 28, + 24, + 0, + 28, + 24, + 0, + 30, + 24, + 0, + 30, + 24, + 0, + 31, + 24, + 0, + 31, + 24, + 0, + 31, + 152, + 0, + 31, + 152, + 0, + 29, + 216, + 0, + 29, + 216, + 0, + 28, + 248, + 0, + 28, + 248, + 0, + 28, + 120, + 0, + 28, + 120, + 0, + 28, + 56, + 0, + 28, + 56, + 0, + 28, + 24, + 0, + 8, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'O' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 192, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 120, + 0, + 14, + 56, + 0, + 12, + 24, + 0, + 28, + 28, + 0, + 24, + 28, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 28, + 0, + 24, + 28, + 0, + 24, + 28, + 0, + 28, + 24, + 0, + 28, + 56, + 0, + 14, + 112, + 0, + 15, + 240, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'P' + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 0, + 0, + 15, + 224, + 0, + 15, + 240, + 0, + 15, + 248, + 0, + 12, + 56, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 12, + 56, + 0, + 12, + 248, + 0, + 15, + 240, + 0, + 15, + 224, + 0, + 15, + 128, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Q' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 192, + 0, + 3, + 240, + 0, + 7, + 248, + 0, + 15, + 120, + 0, + 28, + 28, + 0, + 28, + 28, + 0, + 24, + 12, + 0, + 56, + 12, + 0, + 56, + 12, + 0, + 56, + 12, + 0, + 56, + 12, + 0, + 56, + 12, + 0, + 56, + 28, + 0, + 24, + 220, + 0, + 28, + 248, + 0, + 30, + 120, + 0, + 15, + 252, + 0, + 7, + 252, + 0, + 3, + 204, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'R' + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 128, + 0, + 15, + 224, + 0, + 15, + 240, + 0, + 12, + 248, + 0, + 12, + 56, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 13, + 240, + 0, + 15, + 224, + 0, + 15, + 224, + 0, + 15, + 224, + 0, + 12, + 112, + 0, + 12, + 112, + 0, + 12, + 56, + 0, + 12, + 24, + 0, + 12, + 24, + 0, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'S' + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 3, + 240, + 0, + 7, + 248, + 0, + 15, + 56, + 0, + 14, + 24, + 0, + 14, + 24, + 0, + 14, + 0, + 0, + 15, + 128, + 0, + 7, + 224, + 0, + 3, + 240, + 0, + 0, + 248, + 0, + 0, + 56, + 0, + 0, + 24, + 0, + 12, + 24, + 0, + 28, + 24, + 0, + 14, + 56, + 0, + 15, + 248, + 0, + 7, + 240, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'T' + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 248, + 0, + 31, + 252, + 0, + 31, + 248, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'U' + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 8, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 12, + 0, + 24, + 28, + 0, + 24, + 28, + 0, + 28, + 28, + 0, + 28, + 24, + 0, + 12, + 24, + 0, + 14, + 56, + 0, + 15, + 240, + 0, + 7, + 240, + 0, + 3, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'V' + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 8, + 0, + 24, + 28, + 0, + 28, + 28, + 0, + 28, + 24, + 0, + 12, + 24, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 6, + 112, + 0, + 6, + 112, + 0, + 7, + 96, + 0, + 7, + 96, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + 3, + 192, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'W' + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 129, + 0, + 193, + 131, + 128, + 225, + 195, + 0, + 225, + 195, + 0, + 99, + 199, + 0, + 99, + 199, + 0, + 99, + 198, + 0, + 115, + 230, + 0, + 119, + 238, + 0, + 55, + 110, + 0, + 54, + 108, + 0, + 62, + 124, + 0, + 62, + 124, + 0, + 30, + 124, + 0, + 30, + 56, + 0, + 28, + 56, + 0, + 28, + 56, + 0, + 28, + 56, + 0, + 8, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'X' + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 0, + 0, + 24, + 12, + 0, + 28, + 28, + 0, + 12, + 28, + 0, + 14, + 56, + 0, + 7, + 112, + 0, + 7, + 112, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 3, + 192, + 0, + 3, + 224, + 0, + 7, + 112, + 0, + 7, + 112, + 0, + 14, + 56, + 0, + 28, + 56, + 0, + 28, + 28, + 0, + 56, + 12, + 0, + 16, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Y' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 24, + 12, + 0, + 28, + 12, + 0, + 28, + 28, + 0, + 12, + 24, + 0, + 14, + 56, + 0, + 6, + 56, + 0, + 7, + 112, + 0, + 7, + 112, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 3, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 7, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'Z' + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 248, + 0, + 31, + 252, + 0, + 31, + 252, + 0, + 15, + 248, + 0, + 0, + 56, + 0, + 0, + 112, + 0, + 0, + 112, + 0, + 0, + 224, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 3, + 128, + 0, + 3, + 128, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 14, + 0, + 0, + 12, + 0, + 0, + 31, + 248, + 0, + 31, + 252, + 0, + 31, + 248, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '[' + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + 3, + 192, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + // '\' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 14, + 0, + 0, + 6, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 3, + 0, + 0, + 3, + 128, + 0, + 1, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 192, + 0, + 0, + 224, + 0, + 0, + 96, + 0, + 0, + 112, + 0, + 0, + 112, + 0, + 0, + 48, + 0, + 0, + 56, + 0, + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // ']' + 1, + 224, + 0, + 3, + 224, + 0, + 1, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + // '^' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 3, + 224, + 0, + 3, + 96, + 0, + 7, + 112, + 0, + 6, + 112, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '_' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 248, + 0, + 31, + 252, + 0, + 31, + 252, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '`' + 0, + 0, + 0, + 3, + 0, + 0, + 3, + 128, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 0, + 224, + 0, + 0, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'a' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 224, + 0, + 3, + 240, + 0, + 7, + 240, + 0, + 7, + 48, + 0, + 6, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 6, + 112, + 0, + 7, + 240, + 0, + 3, + 240, + 0, + 1, + 176, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'b' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 192, + 0, + 15, + 224, + 0, + 15, + 240, + 0, + 15, + 112, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 15, + 240, + 0, + 15, + 224, + 0, + 7, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'c' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 3, + 240, + 0, + 7, + 48, + 0, + 6, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 14, + 16, + 0, + 6, + 56, + 0, + 7, + 240, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'd' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 0, + 0, + 48, + 0, + 0, + 56, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 1, + 240, + 0, + 3, + 240, + 0, + 7, + 240, + 0, + 6, + 48, + 0, + 14, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 14, + 112, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 3, + 176, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'e' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 48, + 0, + 14, + 112, + 0, + 12, + 240, + 0, + 15, + 224, + 0, + 15, + 128, + 0, + 15, + 0, + 0, + 14, + 0, + 0, + 7, + 56, + 0, + 7, + 248, + 0, + 3, + 240, + 0, + 1, + 224, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'f' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 240, + 0, + 1, + 240, + 0, + 1, + 224, + 0, + 1, + 128, + 0, + 7, + 224, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'g' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 240, + 0, + 3, + 240, + 0, + 7, + 240, + 0, + 7, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 7, + 240, + 0, + 3, + 240, + 0, + 1, + 176, + 0, + 0, + 112, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + // 'h' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 224, + 0, + 15, + 240, + 0, + 15, + 240, + 0, + 15, + 176, + 0, + 15, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 48, + 0, + 4, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'i' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'j' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 0, + 96, + 0, + 0, + 224, + 0, + 0, + 96, + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 4, + 224, + 0, + 6, + 224, + 0, + 6, + 224, + 0, + 7, + 224, + 0, + 3, + 192, + 0, + // 'k' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 14, + 112, + 0, + 14, + 224, + 0, + 15, + 192, + 0, + 15, + 192, + 0, + 7, + 192, + 0, + 7, + 192, + 0, + 6, + 224, + 0, + 6, + 96, + 0, + 6, + 112, + 0, + 6, + 56, + 0, + 6, + 56, + 0, + 4, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'l' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'm' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 39, + 56, + 0, + 63, + 252, + 0, + 63, + 254, + 0, + 61, + 238, + 0, + 57, + 206, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 49, + 198, + 0, + 48, + 132, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'n' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 224, + 0, + 13, + 240, + 0, + 15, + 240, + 0, + 15, + 176, + 0, + 15, + 48, + 0, + 14, + 48, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 4, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'o' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 112, + 0, + 14, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 7, + 240, + 0, + 7, + 224, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'p' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 192, + 0, + 15, + 224, + 0, + 15, + 240, + 0, + 15, + 48, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 56, + 0, + 14, + 48, + 0, + 14, + 112, + 0, + 15, + 240, + 0, + 15, + 224, + 0, + 15, + 192, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + 14, + 0, + 0, + // 'q' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 240, + 0, + 3, + 240, + 0, + 3, + 240, + 0, + 7, + 48, + 0, + 6, + 48, + 0, + 14, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 12, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 3, + 240, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + 0, + 48, + 0, + // 'r' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 96, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 176, + 0, + 7, + 48, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 7, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 's' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 192, + 0, + 3, + 224, + 0, + 7, + 240, + 0, + 7, + 48, + 0, + 7, + 48, + 0, + 7, + 128, + 0, + 3, + 224, + 0, + 1, + 240, + 0, + 0, + 112, + 0, + 6, + 48, + 0, + 6, + 48, + 0, + 7, + 240, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 't' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'u' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 16, + 0, + 6, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 14, + 48, + 0, + 6, + 112, + 0, + 7, + 240, + 0, + 7, + 240, + 0, + 3, + 176, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'v' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 16, + 0, + 12, + 56, + 0, + 14, + 48, + 0, + 6, + 48, + 0, + 6, + 112, + 0, + 7, + 112, + 0, + 7, + 96, + 0, + 3, + 96, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 0, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'w' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 136, + 0, + 25, + 140, + 0, + 25, + 220, + 0, + 25, + 220, + 0, + 27, + 216, + 0, + 27, + 216, + 0, + 31, + 248, + 0, + 31, + 248, + 0, + 15, + 240, + 0, + 14, + 112, + 0, + 14, + 112, + 0, + 14, + 112, + 0, + 14, + 112, + 0, + 4, + 32, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'x' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 8, + 0, + 14, + 24, + 0, + 14, + 56, + 0, + 7, + 112, + 0, + 3, + 240, + 0, + 3, + 224, + 0, + 1, + 192, + 0, + 3, + 192, + 0, + 3, + 224, + 0, + 7, + 96, + 0, + 14, + 112, + 0, + 14, + 56, + 0, + 28, + 56, + 0, + 8, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 'y' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 16, + 0, + 12, + 24, + 0, + 14, + 56, + 0, + 14, + 48, + 0, + 6, + 48, + 0, + 7, + 112, + 0, + 7, + 96, + 0, + 3, + 96, + 0, + 3, + 224, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 3, + 0, + 0, + // 'z' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 240, + 0, + 15, + 248, + 0, + 7, + 240, + 0, + 0, + 112, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 1, + 192, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 3, + 0, + 0, + 7, + 0, + 0, + 15, + 240, + 0, + 15, + 248, + 0, + 15, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // '{' + 0, + 96, + 0, + 0, + 224, + 0, + 1, + 224, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 3, + 128, + 0, + 7, + 128, + 0, + 3, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 128, + 0, + 1, + 224, + 0, + 0, + 224, + 0, + 0, + 96, + 0, + // '|' + 0, + 128, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + 1, + 192, + 0, + // '}' + 3, + 0, + 0, + 7, + 128, + 0, + 3, + 192, + 0, + 1, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 224, + 0, + 0, + 224, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 0, + 192, + 0, + 1, + 192, + 0, + 3, + 192, + 0, + 7, + 128, + 0, + 3, + 0, + 0, + // '~' + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 8, + 0, + 15, + 152, + 0, + 15, + 152, + 0, + 29, + 248, + 0, + 24, + 240, + 0, + 0, + 240, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; + +sFONT Font24 = { + Font24_Table, + 17, + 24, +}; diff --git a/lib/gfx/gfx.c b/lib/gfx/gfx.c index 49b8d3a8d618bf49c1ed849f49c97316b9210496..c076a8343e39b8fef7d2f29beb825f06ba17d007 100644 --- a/lib/gfx/gfx.c +++ b/lib/gfx/gfx.c @@ -95,9 +95,6 @@ void gfx_puts( x = 0; y += font->Height; } - // if the line is outside the display we return - if (y >= r->height) - return; // now print the character gfx_putchar(font, r, x, y, *str, fg, bg); @@ -273,15 +270,17 @@ Color gfx_color(struct gfx_region *reg, enum gfx_color color) return gfx_color_rgb(reg, c->r, c->g, c->b); } -void gfx_copy_region_raw( +static void gfx_copy_region_raw( struct gfx_region *reg, int x, int y, int w, int h, - size_t bpp, + size_t size, const void *p ) { + size_t bpp = size / (w * h); + for (int y_ = 0; y_ < h; y_++) { for (int x_ = 0; x_ < w; x_++) { Color c; @@ -299,6 +298,96 @@ void gfx_copy_region_raw( } } +static void gfx_copy_region_mono( + struct gfx_region *reg, + int x, + int y, + int w, + int h, + size_t size, + const void *p +) { + const char *bp = p; + int bit = 0; + Color white = gfx_color(reg, WHITE); + Color black = gfx_color(reg, BLACK); + + for (int y_ = 0; y_ < h; y_++) { + for (int x_ = 0; x_ < w; x_++) { + int value = *bp & (1 << bit); + if (++bit >= 8) { + bp++; + bit %= 8; + + if ((const void *)(bp) >= (p + size)) + return; + } + + Color c = value ? white : black; + gfx_setpixel(reg, x + x_, y + y_, c); + } + } +} + +/* + * "Decompress" the image. The algorithm works as follows: + * + * Each byte encodes up to 127 pixels in either white or black. The most + * significant bit determines the color, the remaining 7 bits determine the + * amount. + */ +static void gfx_copy_region_rle_mono( + struct gfx_region *reg, + int x, + int y, + int w, + int h, + size_t size, + const void *p +) { + const char *data = p; + int idx = 0; + Color white = gfx_color(reg, WHITE); + Color black = gfx_color(reg, BLACK); + + for (int i = 0; i < size; i++) { + Color color = (data[i] & 0x80) ? white : black; + uint8_t length = data[i] & 0x7f; + + for (int j = 0; j < length; j++) { + uint16_t x = idx % w; + uint16_t y = idx / w; + gfx_setpixel(reg, x, y, color); + idx++; + } + } +} + +void gfx_copy_region( + struct gfx_region *reg, + int x, + int y, + int w, + int h, + enum gfx_encoding encoding, + size_t size, + const void *p +) { + switch (encoding) { + case GFX_RAW: + gfx_copy_region_raw(reg, x, y, w, h, size, p); + break; + case GFX_MONO: + gfx_copy_region_mono(reg, x, y, w, h, size, p); + break; + case GFX_RLE_MONO: + gfx_copy_region_rle_mono(reg, x, y, w, h, size, p); + break; + default: + break; + } +} + void gfx_copy_raw(struct gfx_region *reg, const void *p, size_t size) { fb_copy_raw(reg->fb, p, size); diff --git a/lib/gfx/gfx.h b/lib/gfx/gfx.h index 0f64a429b59170182077b7d01e2d1cd027743974..4c9a16e508fef1ac4d7346d7adeeee62d71d5c1f 100644 --- a/lib/gfx/gfx.h +++ b/lib/gfx/gfx.h @@ -43,6 +43,12 @@ enum gfx_color { COLORS }; +enum gfx_encoding { + GFX_RAW, + GFX_MONO, + GFX_RLE_MONO +}; + struct gfx_color_rgb { uint8_t r; uint8_t g; @@ -51,8 +57,9 @@ struct gfx_color_rgb { Color gfx_color(struct gfx_region *reg, enum gfx_color color); -void gfx_copy_region_raw(struct gfx_region *reg, int x, int y, int w, int h, - size_t bpp, const void *p); +void gfx_copy_region(struct gfx_region *reg, int x, int y, int w, int h, + enum gfx_encoding encoding, size_t size, + const void *p); void gfx_copy_raw(struct gfx_region *reg, const void *p, size_t size); #endif diff --git a/lib/micropython/gen-frozen.sh b/lib/micropython/gen-frozen.sh index a032c5d85563b883b7767ea460d8439ea343c9f2..d9638bfeec4063502b55e042d02c6f2f4c9c0d15 100755 --- a/lib/micropython/gen-frozen.sh +++ b/lib/micropython/gen-frozen.sh @@ -14,5 +14,5 @@ QSTR_HEADER="$(dirname "$QSTR_HEADER")/qstrdefs.preprocessed.h" "$PYTHON" "$SOURCE_DIR"/micropython/tools/mpy-tool.py \ --freeze \ --qstr-header "$QSTR_HEADER" \ - -mlongint-impl longlong \ + -mlongint-impl mpz \ "$@" >"$OUTPUT" diff --git a/lib/micropython/gen-modules.py b/lib/micropython/gen-modules.py index 64868e33e48f693ad7d9103e6590e3e83350407f..805c80c78b9d1da538c79095f270783686f54ace 100644 --- a/lib/micropython/gen-modules.py +++ b/lib/micropython/gen-modules.py @@ -3,6 +3,8 @@ import sys import os +import tempfile +import shutil def main(): @@ -16,23 +18,41 @@ def main(): modules |= makemoduledefs.find_module_registrations(source) stdout = sys.stdout - with open(sys.argv[2], "w") as f: - sys.stdout = f + with tempfile.TemporaryFile("w+") as temp: + sys.stdout = temp makemoduledefs.generate_module_table_header(sorted(modules)) - sys.stdout = stdout + sys.stdout = stdout + + # Read contents of existing file and compare + try: + with open(sys.argv[2], "r") as f: + old_content = f.read() + except FileNotFoundError: + old_content = "" + + temp.seek(0) + new_content = temp.read() + + if new_content == old_content: + # If both file contain the same content, exit early + sys.exit(0) - try: - os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr") - except FileExistsError: - pass - - linkname = os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2]) - if os.path.exists(linkname): - os.unlink(linkname) - os.symlink( - "../" + os.path.basename(sys.argv[2]), - linkname, - ) + with open(sys.argv[2], "w") as f: + f.write(new_content) + + try: + os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr") + except FileExistsError: + pass + + linkname = ( + os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2]) + ) + if os.path.exists(linkname): + os.unlink(linkname) + shutil.copy(sys.argv[2], linkname) + + sys.stdout = stdout if __name__ == "__main__": diff --git a/lib/micropython/gen-qstr.sh b/lib/micropython/gen-qstr.sh index dda7d45772120ef9443a7ae896ef39a0c17c7bfb..78ecf851363be7946005203330b18402bfd3aed5 100755 --- a/lib/micropython/gen-qstr.sh +++ b/lib/micropython/gen-qstr.sh @@ -11,8 +11,6 @@ shift 5 OUTPUT_DIR="$(dirname "$OUTPUT")" -mkdir -p "$OUTPUT_DIR/genhdr" -ln -sf "$(realpath --relative-to="$OUTPUT_DIR/genhdr" "$OUTPUT")" "$OUTPUT_DIR/genhdr/$(basename "$OUTPUT")" # call gcc -E to generate qstr.i.last gcc -E -DNO_QSTR -I"$SOURCE_DIR/micropython" -I"$PROJECT_SRC" -I"$OUTPUT_DIR" "$@" >"$OUTPUT_DIR/qstr.i.last" diff --git a/lib/sdk/Libraries/BTLE/cordio-phy.a b/lib/sdk/Libraries/BTLE/cordio-phy.a index 177273f66c6cf5addcadef8e209e05a03e10f116..8f9f4ab9bb78e988cc25274536c992ca7d59f6d9 100644 Binary files a/lib/sdk/Libraries/BTLE/cordio-phy.a and b/lib/sdk/Libraries/BTLE/cordio-phy.a differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/afe_modulation.o b/lib/sdk/Libraries/BTLE/cordio-phy/afe_modulation.o new file mode 100644 index 0000000000000000000000000000000000000000..bb6020aa519601252503a527f96a35ec23b66306 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/afe_modulation.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/agc_control.o b/lib/sdk/Libraries/BTLE/cordio-phy/agc_control.o new file mode 100644 index 0000000000000000000000000000000000000000..5a0699e80d122a26d9f3581e0bf1b5c9d44a2200 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/agc_control.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_api.o b/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_api.o new file mode 100644 index 0000000000000000000000000000000000000000..e61c4ea743931ad9e05bee9ec0d5cc597e4ad83b Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_api.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_drv.o b/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_drv.o new file mode 100644 index 0000000000000000000000000000000000000000..19f3f7c1fa5460708f8ca1671638855f64d85f01 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/bb_ble_drv.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/bb_drv.o b/lib/sdk/Libraries/BTLE/cordio-phy/bb_drv.o new file mode 100644 index 0000000000000000000000000000000000000000..a4e372b7d8ca58b3725b3691bd886ba875109e33 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/bb_drv.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_ctrl.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_ctrl.o new file mode 100644 index 0000000000000000000000000000000000000000..a39406c0b4ea59b5e13e6a2fe620b91b8eb997f6 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_ctrl.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_init.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_init.o new file mode 100644 index 0000000000000000000000000000000000000000..b8b179454fac839542062bcd0b61b74b12fe683d Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_init.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_trx.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_trx.o new file mode 100644 index 0000000000000000000000000000000000000000..5cdeff7472b951b990d1aa561f840999058f22cd Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_prot_trx.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_rx_setup.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_rx_setup.o new file mode 100644 index 0000000000000000000000000000000000000000..d4625b5b2cf10ba320e068923407d2eeb02feff5 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_rx_setup.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_time_corr.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_time_corr.o new file mode 100644 index 0000000000000000000000000000000000000000..a73c047cc9f04cb76e63d387459bbac865d321f8 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_time_corr.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ble_tx_setup.o b/lib/sdk/Libraries/BTLE/cordio-phy/ble_tx_setup.o new file mode 100644 index 0000000000000000000000000000000000000000..2a3abd71d9c57a1b178479a0f29b9ed1074c8f30 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ble_tx_setup.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/board_config.o b/lib/sdk/Libraries/BTLE/cordio-phy/board_config.o new file mode 100644 index 0000000000000000000000000000000000000000..3f327cb876ce59e88a4b4fe15ba0a9f673f70464 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/board_config.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_cmu.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_cmu.o new file mode 100644 index 0000000000000000000000000000000000000000..eec3132f3622bcc2b94a167c2344bae81e6819f4 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_cmu.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_crypto.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_crypto.o new file mode 100644 index 0000000000000000000000000000000000000000..18161206a90b359ddf3791664e3f7c98dd0d3e8c Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_crypto.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_event.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_event.o new file mode 100644 index 0000000000000000000000000000000000000000..6c0f52b1d460f61fbe755d4879b6ef243ccb0082 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_event.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_intc.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_intc.o new file mode 100644 index 0000000000000000000000000000000000000000..915d5cd98ea803488cbd3a872822a41e7379ae7f Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_intc.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_pmu.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_pmu.o new file mode 100644 index 0000000000000000000000000000000000000000..a6bf33e334957503aa02f969a745cbdab7959638 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_pmu.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_spim.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_spim.o new file mode 100644 index 0000000000000000000000000000000000000000..32ba938d8202baa9ba982f295983b744fa90ef92 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_spim.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/dbb_trx_timers.o b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_trx_timers.o new file mode 100644 index 0000000000000000000000000000000000000000..f4846c2871f888745ec65c466b4b2c0ad1b29709 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/dbb_trx_timers.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ll_dbg_pin.o b/lib/sdk/Libraries/BTLE/cordio-phy/ll_dbg_pin.o new file mode 100644 index 0000000000000000000000000000000000000000..4d30c637fec91d2d07420e761c1208d5e2cef64a Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ll_dbg_pin.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/ll_debug.o b/lib/sdk/Libraries/BTLE/cordio-phy/ll_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..4d30c637fec91d2d07420e761c1208d5e2cef64a Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/ll_debug.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_ble.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_ble.o new file mode 100644 index 0000000000000000000000000000000000000000..3f9df66c071a6387322354c0f5c354a28d39dc9f Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_ble.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_crypto.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_crypto.o new file mode 100644 index 0000000000000000000000000000000000000000..8579a1dabb62e9cbf79b2b916aa5bf67c01ad5e5 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_crypto.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_rx.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_rx.o new file mode 100644 index 0000000000000000000000000000000000000000..47939a6d0056aba0b708fecc7b6641ce4e4346a5 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_rx.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_setup.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_setup.o new file mode 100644 index 0000000000000000000000000000000000000000..64a2bed00892dfa0ac02ef04a735e9615326280b Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_setup.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timer.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timer.o new file mode 100644 index 0000000000000000000000000000000000000000..1a08cfa9e3907921afebca0e341526504bed896b Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timer.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timestamp.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timestamp.o new file mode 100644 index 0000000000000000000000000000000000000000..50bc1aeb821377bc1a0085ee51994e8151f028fe Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_timestamp.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_tx.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_tx.o new file mode 100644 index 0000000000000000000000000000000000000000..ed0f595fae359128f1661f5c45adf28a66f1d45b Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_api_tx.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_int_handlers.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_int_handlers.o new file mode 100644 index 0000000000000000000000000000000000000000..5dc2342a02e89e6cd9183eda3ee2ed5e168b7790 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_int_handlers.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/llc_util.o b/lib/sdk/Libraries/BTLE/cordio-phy/llc_util.o new file mode 100644 index 0000000000000000000000000000000000000000..eea2e238648005037f381ba57a2be640db958ac9 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/llc_util.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/pan2g_config.o b/lib/sdk/Libraries/BTLE/cordio-phy/pan2g_config.o new file mode 100644 index 0000000000000000000000000000000000000000..f3e396fd49bf8fdd8a44c914511a20bad966035b Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/pan2g_config.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/rffe_config.o b/lib/sdk/Libraries/BTLE/cordio-phy/rffe_config.o new file mode 100644 index 0000000000000000000000000000000000000000..f85751ee8404042b32f113a15f6c74d313e918c3 Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/rffe_config.o differ diff --git a/lib/sdk/Libraries/BTLE/cordio-phy/sequencer_ext.o b/lib/sdk/Libraries/BTLE/cordio-phy/sequencer_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..4f4bb9f847ecf2c6fe9c91b337ae04f8146b12dc Binary files /dev/null and b/lib/sdk/Libraries/BTLE/cordio-phy/sequencer_ext.o differ diff --git a/lib/sdk/Libraries/BTLE/link_layer/controller/sources/ble/lctr/lctr_sm_conn_slave.c b/lib/sdk/Libraries/BTLE/link_layer/controller/sources/ble/lctr/lctr_sm_conn_slave.c index 55cb910926fee6db1c93233b664882a11cebe5dc..ce3334e782fdacc1ca7c8bc57a72ab49ac2b1539 100644 --- a/lib/sdk/Libraries/BTLE/link_layer/controller/sources/ble/lctr/lctr_sm_conn_slave.c +++ b/lib/sdk/Libraries/BTLE/link_layer/controller/sources/ble/lctr/lctr_sm_conn_slave.c @@ -217,6 +217,15 @@ void lctrConnStatelessEventHandler(lctrConnCtx_t *pCtx, uint8_t event) { case LCTR_CONN_TERMINATED: LL_TRACE_INFO2("lctrConnStatelessEventHandler: handle=%u, state=%u, event=TERMINATED", LCTR_GET_CONN_HANDLE(pCtx), pCtx->state); + + /* card10 HACK: + * After an encrypted connection is closed, the stack does not instruct the radio to turn off encryption again. + * There is no direct interface to this either. lctrCalcSessionKey() does transfer the flag though. */ + lctrDisableTxDataEnc(pCtx); + lctrDisableRxDataEnc(pCtx); + lctrCalcSessionKey(pCtx); + /*END card10 HACK */ + lctrNotifyHostDisconnectInd(pCtx); lctrFreeConnCtx(pCtx); break; diff --git a/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/Source/system_max32665.c b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/Source/system_max32665.c index 569913e28af4439a31babb26ab84e558ef1bc7ac..90c4f0a09f17feae9407db920b5e0b3ed2a3c1ce 100644 --- a/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/Source/system_max32665.c +++ b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/Source/system_max32665.c @@ -169,7 +169,6 @@ __weak void SystemInit(void) MXC_GPIO0->vssel |= (1UL << 20) | (1UL << 21) | (1UL << 22) | (1UL << 29); // Wristband MXC_GPIO0->vssel |= (1UL << 17) | (1UL << 23) | (1UL << 28); // GPIO to TOP MXC_GPIO0->vssel |= (1UL << 24) | (1UL << 25) | (1UL << 26) | (1UL << 27); // SPI to TOP - MXC_GPIO0->vssel |= (1UL << 31); // ECG Switch MXC_GPIO0->ps |= 0xFFFFFFFF; MXC_GPIO0->pad_cfg1 |= 0xFFFFFFFF; @@ -178,7 +177,7 @@ __weak void SystemInit(void) // All GPIO on port 1 to 1.8 V first MXC_GPIO1->vssel = 0; MXC_GPIO1->vssel |= (1UL << 0) | (1UL << 1) | (1UL << 2) | (1UL << 3) | (1UL << 4) | (1UL << 5); // SDHC - MXC_GPIO1->vssel |= (1 << 6) | (1 << 7); // GPIO to TOP + MXC_GPIO1->vssel |= (1 << 6); // GPIO to TOP MXC_GPIO1->vssel |= (1 << 14) | (1 << 15); // GPIO for RGB LEDs #if BOARD_EVKIT diff --git a/openocd/scripts/target/max32665.cfg b/openocd/scripts/target/max32665.cfg index c79eb6fc324379bc6d824be4a49fa9b30c4bbf22..4a3487e405a315b1e652cf76ee893e97b4000863 100644 --- a/openocd/scripts/target/max32665.cfg +++ b/openocd/scripts/target/max32665.cfg @@ -1,6 +1,9 @@ # Maxim Integrated MAX32665 OpenOCD target configuration file # www.maximintegrated.com +# selecting transport method, to prevenet auto-selecting something else +transport select swd + # Set the reset pin configuration reset_config none diff --git a/preload/apps/analog_clock/__init__.py b/preload/apps/analog_clock/__init__.py index c679a82ec20191acec37fa99519f1cb81e52fc71..543a0aba756015032a09448579c16ee011efc298 100644 --- a/preload/apps/analog_clock/__init__.py +++ b/preload/apps/analog_clock/__init__.py @@ -11,28 +11,6 @@ import os CONFIG_NAME = "clock.json" -class Time: - def __init__(self, start=0): - self.time = start - self.wait_time = 0.95 - - def tick(self): - sleep(self.wait_time) - self.time += 1 - - @property - def second(self): - return self.time % 60 - - @property - def minute(self): - return (self.time / 60) % 60 - - @property - def hour(self): - return (self.time / 3600) % 24 - - class Clock: def __init__( self, @@ -60,7 +38,6 @@ class Clock: ) self.run_once = run_once self.offsetx = offsetx - self.time = Time() self.theme = 0 self.default_themes = [ { @@ -181,46 +158,36 @@ class Clock: colored = False try: with display.open() as disp: - button_pressed = False while True: - self.updateClock(disp) + localtime = utime.localtime() + self.updateClock(disp, localtime) if self.run_once: break # check for button presses - v = buttons.read(buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT) - if v == 0: - button_pressed = False + v = buttons.read( + buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT + ) + button_pressed = v != 0 - if not button_pressed and v & buttons.BOTTOM_LEFT != 0: - button_pressed = True + if button_pressed and v & buttons.BOTTOM_LEFT != 0: self.setTheme(self.theme - 1) self.writeConfig() - elif not button_pressed and v & buttons.BOTTOM_RIGHT != 0: - button_pressed = True + elif button_pressed and v & buttons.BOTTOM_RIGHT != 0: self.setTheme(self.theme + 1) self.writeConfig() + elif button_pressed and v & buttons.TOP_RIGHT != 0: + self.setTime(disp, localtime) + + utime.sleep_ms(23) except KeyboardInterrupt: for i in range(11): leds.set(i, (0, 0, 0)) return - def drawImage(self, image): - with display.open() as d: - d.clear() - for x in range(len(image)): - for y in range(len(image[x])): - d.pixel( - x + self.offsetx, - y, - col=(255, 255, 255) if image[x][y] else (0, 0, 0), - ) - d.update() - - def updateClock(self, disp): + def updateClock(self, disp, localtime): disp.clear(self.background_col) - localtime = utime.localtime() disp.pixel(self.center[0] + self.offsetx, self.center[1], col=self.center_col) hour_coords = self.circlePoint( @@ -284,6 +251,49 @@ class Clock: disp.update() + def setTime(self, disp, localtime): + accepted = False + previously_pressed_button = buttons.TOP_RIGHT + button_repeat_counter = 0 + set_seconds = utime.mktime(localtime) + + while not accepted: + v = buttons.read( + buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT + ) + button_pressed = v != 0 + + if button_pressed: + if v & previously_pressed_button != 0: + button_repeat_counter += 1 + else: + if v & buttons.BOTTOM_LEFT != 0: + previously_pressed_button = buttons.BOTTOM_LEFT + elif v & buttons.BOTTOM_RIGHT != 0: + previously_pressed_button = buttons.BOTTOM_RIGHT + elif ( + v & buttons.TOP_RIGHT != 0 + and previously_pressed_button != buttons.TOP_RIGHT + ): + accepted = True + else: + previously_pressed_button = 0 + else: + previously_pressed_button = 0 + button_repeat_counter = 0 + + seconds_change = int(min(1.1 ** button_repeat_counter, 60 * 23 + 1)) + if previously_pressed_button == buttons.BOTTOM_LEFT: + set_seconds -= seconds_change + elif previously_pressed_button == buttons.BOTTOM_RIGHT: + set_seconds += seconds_change + + self.updateClock(disp, utime.localtime(set_seconds)) + utime.sleep_ms(23) + + utime.set_time(int(set_seconds)) + utime.sleep_ms(123) + def circlePoint(self, t): return ( int(round(self.radius * math.cos(t))) + self.center[0], diff --git a/preload/apps/bhi160/__init__.py b/preload/apps/bhi160/__init__.py index 3632008c0375fe10d40c24096c56600be7f6c4dc..c1f4325092a83b4b23975f9057bec7b2caee3e67 100644 --- a/preload/apps/bhi160/__init__.py +++ b/preload/apps/bhi160/__init__.py @@ -1,46 +1,49 @@ import bhi160 -import display -import utime import buttons - -disp = display.open() -sensor = 0 - -sensors = [ - {"sensor": bhi160.BHI160Orientation(), "name": "Orientation"}, - {"sensor": bhi160.BHI160Accelerometer(), "name": "Accelerometer"}, - {"sensor": bhi160.BHI160Gyroscope(), "name": "Gyroscope"}, +import color +import contextlib +import display +import itertools +import simple_menu + +STATUS_COLORS = [ + color.RED, + # Orange + color.RED * 0.5 + color.YELLOW * 0.5, + color.YELLOW, + color.GREEN, ] -while True: - # Read and print sample - samples = sensors[sensor]["sensor"].read() - if len(samples) > 0: - disp.clear() - sample = samples[0] +with contextlib.ExitStack() as cx: + disp = cx.enter_context(display.open()) - color = [255, 0, 0] - if sample.status == 1: - color = [255, 128, 0] - elif sample.status == 2: - color = [255, 255, 0] - elif sample.status == 3: - color = [0, 200, 0] + args = {"sample_rate": 10, "sample_buffer_len": 20} - disp.print(sensors[sensor]["name"], posy=0) - disp.print("X: %f" % sample.x, posy=20, fg=color) - disp.print("Y: %f" % sample.y, posy=40, fg=color) - disp.print("Z: %f" % sample.z, posy=60, fg=color) + sensor_iter = itertools.cycle( + [ + (cx.enter_context(bhi160.BHI160Orientation(**args)), "Orientation"), + (cx.enter_context(bhi160.BHI160Accelerometer(**args)), "Accel"), + (cx.enter_context(bhi160.BHI160Gyroscope(**args)), "Gyro"), + (cx.enter_context(bhi160.BHI160Magnetometer(**args)), "Magnetic"), + ] + ) + sensor, sensor_name = next(sensor_iter) - disp.update() + for ev in simple_menu.button_events(timeout=0.1): + # Pressing the bottom right button cycles through sensors + if ev == buttons.BOTTOM_RIGHT: + sensor, sensor_name = next(sensor_iter) - # Read button - v = buttons.read(buttons.BOTTOM_RIGHT) - if v == 0: - button_pressed = False + samples = sensor.read() + if not samples: + continue - if not button_pressed and v & buttons.BOTTOM_RIGHT != 0: - button_pressed = True - sensor = (sensor + 1) % len(sensors) + sample = samples[-1] + col = STATUS_COLORS[sample.status] - utime.sleep(0.1) + disp.clear() + disp.print("{:^11s}".format(sensor_name), posy=0, posx=3) + disp.print("X:{: 9.4f}".format(sample.x), posy=20, fg=col) + disp.print("Y:{: 9.4f}".format(sample.y), posy=40, fg=col) + disp.print("Z:{: 9.4f}".format(sample.z), posy=60, fg=col) + disp.update() diff --git a/preload/apps/bme680_sensor_demo/__init__.py b/preload/apps/bme680_sensor_demo/__init__.py index 19a292c2879e064dc321d5b954cc0b65456eaf58..d0e5279e4badee21944a5c498d908570aeaf0029 100644 --- a/preload/apps/bme680_sensor_demo/__init__.py +++ b/preload/apps/bme680_sensor_demo/__init__.py @@ -20,10 +20,10 @@ def main(): while True: sensor_data = bme680.get_data() disp.clear() - disp.print("BME680 Sensor") - disp.print("{} C".format(str(sensor_data[0])), posy=20) - disp.print("{} rh".format(str(sensor_data[1])), posy=40) - disp.print("{} hPa".format(str(sensor_data[2])), posy=60) + disp.print("BME680", posx=38) + disp.print("{:7.2f} C".format(sensor_data[0]), posy=20) + disp.print("{:7.2f} rh".format(sensor_data[1]), posy=40) + disp.print("{:7.2f} hPa".format(sensor_data[2]), posy=60) disp.update() utime.sleep(10) diff --git a/preload/apps/bme680_sensor_demo/metadata.json b/preload/apps/bme680_sensor_demo/metadata.json index a575a2bbe17e5c41e26180434e9d605b16424526..4e3c9979ed6536c85499d738fae970af137c64f7 100644 --- a/preload/apps/bme680_sensor_demo/metadata.json +++ b/preload/apps/bme680_sensor_demo/metadata.json @@ -1 +1 @@ -{"author": "chris007", "name": "BME680 Sensor Demo", "description": "Demo for the BME860 Sensor", "category": "Hardware", "revision": 1} +{"author": "chris007", "name": "BME680", "description": "Demo for the BME860 Sensor", "category": "Hardware", "revision": 1} diff --git a/preload/apps/digiclk/__init__.py b/preload/apps/digiclk/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..72e33fecaa98a9b2cf78574ebf55c3389d4fb610 --- /dev/null +++ b/preload/apps/digiclk/__init__.py @@ -0,0 +1,348 @@ +import os +import sys +import leds +import display +import buttons + +sys.path.append("/apps/digiclk/") +import monotime as utime +import draw + +DIGITS = [ + (True, True, True, True, True, True, False), + (False, True, True, False, False, False, False), + (True, True, False, True, True, False, True), + (True, True, True, True, False, False, True), + (False, True, True, False, False, True, True), + (True, False, True, True, False, True, True), + (True, False, True, True, True, True, True), + (True, True, True, False, False, False, False), + (True, True, True, True, True, True, True), + (True, True, True, True, False, True, True), +] + + +def renderNum(d, num, x): + draw.Grid7Seg(d, x, 0, 7, DIGITS[num // 10], (255, 255, 255)) + draw.Grid7Seg(d, x + 5, 0, 7, DIGITS[num % 10], (255, 255, 255)) + + +def renderColon(d): + draw.GridVSeg(d, 11, 2, 7, 2, (255, 255, 255)) + draw.GridVSeg(d, 11, 4, 7, 2, (255, 255, 255)) + + +def renderText(d, text, blankidx=None): + bs = bytearray(text) + + if blankidx != None: + bs[blankidx : blankidx + 1] = b"_" + + d.print( + MODES[MODE] + " " + bs.decode(), fg=(255, 255, 255), bg=None, posx=0, posy=7 * 8 + ) + + +def renderBar(d, num): + d.rect(20, 78, 20 + num * 2, 80, col=(255, 255, 255)) + + +def render(d): + ltime = utime.localtime() + years = ltime[0] + months = ltime[1] + days = ltime[2] + hours = ltime[3] + mins = ltime[4] + secs = ltime[5] + + d.clear() + + if MODE == CHANGE_YEAR: + renderNum(d, years // 100, 1) + renderNum(d, years % 100, 13) + elif MODE == CHANGE_MONTH: + renderNum(d, months, 13) + elif MODE == CHANGE_DAY: + renderNum(d, days, 13) + else: + renderNum(d, hours, 1) + renderNum(d, mins, 13) + + if MODE not in (CHANGE_YEAR, CHANGE_MONTH, CHANGE_DAY) and secs % 2 == 0: + renderColon(d) + + renderText(d, NAME, None) + renderBar(d, secs) + + d.update() + + +LONG_DELAY = 400 +BUTTON_UPDATE_TIME = 100 +BUTTON_SEL = 1 << 0 +BUTTON_SEL_LONG = 1 << 1 +BUTTON_UP = 1 << 2 +BUTTON_UP_LONG = 1 << 3 +BUTTON_DOWN = 1 << 4 +BUTTON_DOWN_LONG = 1 << 5 +pressed_prev = 0 +button_long_prev = {BUTTON_SEL: False, BUTTON_UP: False, BUTTON_DOWN: False} +button_times = {BUTTON_SEL: 0, BUTTON_UP: 0, BUTTON_DOWN: 0} + + +def checkButton(button, button_long, osbutton, pressed, t): + cur_buttons = 0 + + if pressed & osbutton and not pressed_prev & osbutton: + button_times[button] = t + button_long_prev[button] = False + elif pressed_prev & osbutton: + if button_times[button] + LONG_DELAY < t: + cur_buttons |= button_long + button_times[button] = t + button_long_prev[button] = True + elif not pressed & osbutton and not button_long_prev[button]: + cur_buttons |= button + + return cur_buttons + + +def checkButtons(): + global pressed_prev + + t = utime.time_monotonic_ms() + pressed = buttons.read( + buttons.BOTTOM_LEFT | buttons.TOP_RIGHT | buttons.BOTTOM_RIGHT + ) + cur_buttons = 0 + + cur_buttons |= checkButton( + BUTTON_SEL, BUTTON_SEL_LONG, buttons.BOTTOM_LEFT, pressed, t + ) + cur_buttons |= checkButton(BUTTON_UP, BUTTON_UP_LONG, buttons.TOP_RIGHT, pressed, t) + cur_buttons |= checkButton( + BUTTON_DOWN, BUTTON_DOWN_LONG, buttons.BOTTOM_RIGHT, pressed, t + ) + + pressed_prev = pressed + return cur_buttons + + +def modTime(yrs, mth, day, hrs, mns, sec): + ltime = utime.localtime() + new = utime.mktime( + ( + ltime[0] + yrs, + ltime[1] + mth, + ltime[2] + day, + ltime[3] + hrs, + ltime[4] + mns, + ltime[5] + sec, + None, + None, + ) + ) + utime.set_time(new) + + +def ctrl_display(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = CHANGE_HOURS + else: + updated = False + + +def ctrl_chg_hrs(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_MINUTES + elif bs & BUTTON_UP_LONG: + modTime(0, 0, 0, 10, 0, 0) + elif bs & BUTTON_DOWN_LONG: + modTime(0, 0, 0, -10, 0, 0) + elif bs & BUTTON_UP: + modTime(0, 0, 0, 1, 0, 0) + elif bs & BUTTON_DOWN: + modTime(0, 0, 0, -1, 0, 0) + else: + updated = False + + +def ctrl_chg_mns(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_SECONDS + elif bs & BUTTON_UP_LONG: + modTime(0, 0, 0, 0, 10, 0) + elif bs & BUTTON_DOWN_LONG: + modTime(0, 0, 0, 0, -10, 0) + elif bs & BUTTON_UP: + modTime(0, 0, 0, 0, 1, 0) + elif bs & BUTTON_DOWN: + modTime(0, 0, 0, 0, -1, 0) + else: + updated = False + + +def ctrl_chg_sec(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_YEAR + elif bs & BUTTON_UP_LONG: + modTime(0, 0, 0, 0, 0, 10) + elif bs & BUTTON_DOWN_LONG: + modTime(0, 0, 0, 0, 0, -10) + elif bs & BUTTON_UP: + modTime(0, 0, 0, 0, 0, 1) + elif bs & BUTTON_DOWN: + modTime(0, 0, 0, 0, 0, -1) + else: + updated = False + + +def ctrl_chg_yrs(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_MONTH + elif bs & BUTTON_UP_LONG: + modTime(10, 0, 0, 0, 0, 0) + elif bs & BUTTON_DOWN_LONG: + modTime(-10, 0, 0, 0, 0, 0) + elif bs & BUTTON_UP: + modTime(1, 0, 0, 0, 0, 0) + elif bs & BUTTON_DOWN: + modTime(-1, 0, 0, 0, 0, 0) + else: + updated = False + + +def ctrl_chg_mth(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_DAY + elif bs & BUTTON_UP_LONG: + modTime(0, 6, 0, 0, 0, 0) + elif bs & BUTTON_DOWN_LONG: + modTime(0, -6, 0, 0, 0, 0) + elif bs & BUTTON_UP: + modTime(0, 1, 0, 0, 0, 0) + elif bs & BUTTON_DOWN: + modTime(0, -1, 0, 0, 0, 0) + else: + updated = False + + +def ctrl_chg_day(bs): + global MODE, updated + updated = True + if bs & BUTTON_SEL_LONG: + MODE = DISPLAY + elif bs & BUTTON_SEL: + MODE = CHANGE_HOURS + elif bs & BUTTON_UP_LONG: + modTime(0, 0, 10, 0, 0, 0) + elif bs & BUTTON_DOWN_LONG: + modTime(0, 0, -10, 0, 0, 0) + elif bs & BUTTON_UP: + modTime(0, 0, 1, 0, 0, 0) + elif bs & BUTTON_DOWN: + modTime(0, 0, -1, 0, 0, 0) + else: + updated = False + + +NAME = None +FILENAME = "nickname.txt" + + +def load_nickname(): + global NAME + if FILENAME in os.listdir("."): + with open("nickname.txt", "rb") as f: + name = f.read().strip() + else: + name = b"no nick" + + if len(name) > 7: + name = name[0:7] + else: + name = b" " * (7 - len(name)) + name + + NAME = name + + +# MODE values +DISPLAY = 0 +CHANGE_HOURS = 1 +CHANGE_MINUTES = 2 +CHANGE_SECONDS = 3 +CHANGE_YEAR = 4 +CHANGE_MONTH = 5 +CHANGE_DAY = 6 + +MODE = DISPLAY +MODES = { + DISPLAY: "---", + CHANGE_HOURS: "HRS", + CHANGE_MINUTES: "MNS", + CHANGE_SECONDS: "SEC", + CHANGE_YEAR: "YRS", + CHANGE_MONTH: "MTH", + CHANGE_DAY: "DAY", +} +updated = False + +CTRL_FNS = { + DISPLAY: ctrl_display, + CHANGE_HOURS: ctrl_chg_hrs, + CHANGE_MINUTES: ctrl_chg_mns, + CHANGE_SECONDS: ctrl_chg_sec, + CHANGE_YEAR: ctrl_chg_yrs, + CHANGE_MONTH: ctrl_chg_mth, + CHANGE_DAY: ctrl_chg_day, +} + + +def main(): + global updated + try: + load_nickname() + with display.open() as d: + last_secs, secs = 0, 0 + last_msecs, msecs = 0, 0 + while True: + updated = False + + bs = checkButtons() + CTRL_FNS[MODE](bs) + + last_secs, secs = secs, utime.time_monotonic() + if updated or secs > last_secs: + render(d) + + last_msecs, msecs = msecs, utime.time_monotonic_ms() + if msecs - last_msecs < BUTTON_UPDATE_TIME: + utime.sleep_ms(BUTTON_UPDATE_TIME - (msecs - last_msecs)) + except KeyboardInterrupt: + pass + + +main() diff --git a/preload/apps/digiclk/draw.py b/preload/apps/digiclk/draw.py new file mode 100644 index 0000000000000000000000000000000000000000..e513b13b41c274f2aa0ec08d15d52ace87c15d84 --- /dev/null +++ b/preload/apps/digiclk/draw.py @@ -0,0 +1,82 @@ +def _ceilDiv(a, b): + return (a + (b - 1)) // b + + +def TipHeight(w): + return _ceilDiv(w, 2) - 1 + + +def Tip(d, x, y, w, c, invert=False, swapAxes=False): + h = TipHeight(w) + for dy in range(h): + for dx in range(dy + 1, w - 1 - dy): + px = x + dx + py = y + dy if not invert else y + h - 1 - dy + if swapAxes: + px, py = py, px + d.pixel(px, py, col=c) + + +def Seg(d, x, y, w, h, c, swapAxes=False): + tip_h = TipHeight(w) + body_h = h - 2 * tip_h + + Tip(d, x, y, w, c, invert=True, swapAxes=swapAxes) + + px1, px2 = x, x + w + py1, py2 = y + tip_h, y + tip_h + body_h + if swapAxes: + px1, px2, py1, py2 = py1, py2, px1, px2 + d.rect(px1, py1, px2 - 1, py2 - 1, col=c) + + Tip(d, x, y + tip_h + body_h, w, c, invert=False, swapAxes=swapAxes) + + +def VSeg(d, x, y, w, l, c): + Seg(d, x, y, w, l, c) + + +def HSeg(d, x, y, w, l, c): + Seg(d, y, x, w, l, c, swapAxes=True) + + +def GridSeg(d, x, y, w, l, c, swapAxes=False): + sw = w - 2 + tip_h = TipHeight(sw) + + x = x * w + y = y * w + l = (l - 1) * w + Seg(d, x + 1, y + tip_h + 3, sw, l - 3, c, swapAxes=swapAxes) + + +def GridVSeg(d, x, y, w, l, c): + GridSeg(d, x, y, w, l, c) + + +def GridHSeg(d, x, y, w, l, c): + GridSeg(d, y, x, w, l, c, swapAxes=True) + + +def Grid(d, x1, y1, x2, y2, w, c): + for x in range(x1 * w, x2 * w): + for y in range(y1 * w, y2 * w): + if x % w == 0 or x % w == w - 1 or y % w == 0 or y % w == w - 1: + d.pixel(x, y, col=c) + + +def Grid7Seg(d, x, y, w, segs, c): + if segs[0]: + GridHSeg(d, x, y, w, 4, c) + if segs[1]: + GridVSeg(d, x + 3, y, w, 4, c) + if segs[2]: + GridVSeg(d, x + 3, y + 3, w, 4, c) + if segs[3]: + GridHSeg(d, x, y + 6, w, 4, c) + if segs[4]: + GridVSeg(d, x, y + 3, w, 4, c) + if segs[5]: + GridVSeg(d, x, y, w, 4, c) + if segs[6]: + GridHSeg(d, x, y + 3, w, 4, c) diff --git a/preload/apps/digiclk/metadata.json b/preload/apps/digiclk/metadata.json new file mode 100644 index 0000000000000000000000000000000000000000..ff0c81709b7773e8248f784c63196385391e60f7 --- /dev/null +++ b/preload/apps/digiclk/metadata.json @@ -0,0 +1,7 @@ +{ + "name": "DigiClk", + "description": "A Digital Clock, configurable via buttons", + "category": "wearable", + "author": "yrlf", + "revision": 1 +} diff --git a/preload/apps/digiclk/monotime.py b/preload/apps/digiclk/monotime.py new file mode 100644 index 0000000000000000000000000000000000000000..3cfbbbc54b9659c36928f772944899108a85eeb8 --- /dev/null +++ b/preload/apps/digiclk/monotime.py @@ -0,0 +1,71 @@ +import utime as _utime + +_offset_ms = 0 + + +def time_monotonic(): + return _utime.time() + _offset_ms // 1000 + + +def time_monotonic_ms(): + return _utime.time_ms() + _offset_ms + + +def sleep(s): + return _utime.sleep(s) + + +def sleep_ms(ms): + return _utime.sleep_ms(ms) + + +def sleep_us(us): + return _utime.sleep_us(us) + + +def time(): + return _utime.time() + + +def time_ms(): + return _utime.time_ms() + + +def set_time(t): + global _offset_ms + + cur_t = _utime.time_ms() + _utime.set_time(t) + new_t = _utime.time_ms() + + diff = cur_t - new_t + _offset_ms += diff + + +def set_unix_time(t): + global _offset_ms + + cur_t = _utime.time_ms() + _utime.set_unix_time(t) + new_t = _utime.time_ms() + + diff = cur_t - new_t + _offset_ms += diff + + +def localtime(s=None): + if s != None: + return _utime.localtime(s) + else: + return _utime.localtime() + + +def mktime(t): + return _utime.mktime(t) + + +def alarm(s, cb=None): + if cb != None: + return _utime.alarm(s, cb) + else: + return _utime.alarm(s) diff --git a/preload/apps/ecg/__init__.py b/preload/apps/ecg/__init__.py index 6a0dd08886f37173306c49bbf40eee792d105f89..8a501a21b667ade943fca83ca2e6dd32186ad983 100644 --- a/preload/apps/ecg/__init__.py +++ b/preload/apps/ecg/__init__.py @@ -6,6 +6,7 @@ import buttons import max30001 import math import struct +import itertools WIDTH = 160 HEIGHT = 80 @@ -26,6 +27,15 @@ COLOR_WRITE_FG = [255, 255, 255] COLOR_WRITE_BG = [255, 0, 0] current_mode = MODE_FINGER +modes = itertools.cycle( + [ + ({"bar", "pulse"}, {"text": "Top + Pulse", "posx": 0}), + ({}, {"text": "off", "posx": 55}), + ({"bar"}, {"text": "Top Only", "posx": 25}), + ({"pulse"}, {"text": "Pulse Only", "posx": 5}), + ] +) +led_mode = next(modes)[0] history = [] filebuffer = bytearray() write = 0 @@ -36,6 +46,7 @@ pause_histogram = False histogram_offset = 0 sensor = 0 disp = display.open() +last_sample_count = 1 leds.dim_top(1) COLORS = [((23 + (15 * i)) % 360, 1.0, 1.0) for i in range(11)] @@ -48,7 +59,8 @@ beta = 3 def update_history(datasets): - global history, moving_average, alpha, beta + global history, moving_average, alpha, beta, last_sample_count + last_sample_count = len(datasets) for val in datasets: history.append(val - moving_average) moving_average = (alpha * moving_average + beta * val) / (alpha + beta) @@ -60,6 +72,7 @@ def update_history(datasets): # variables for pulse detection pulse = -1 samples_since_last_pulse = 0 +last_pulse_blink = 0 q_threshold = -1 r_threshold = 1 q_spike = -ECG_RATE @@ -177,14 +190,28 @@ def close_sensor(): def toggle_mode(): - global current_mode + global current_mode, disp, pause_screen + if write > 0: + pause_screen = utime.time_ms() + 500 + disp.clear(COLOR_BACKGROUND) + disp.print("Locked", posx=30, posy=30, fg=COLOR_TEXT) + disp.update() + return + close_sensor() current_mode = MODE_USB if current_mode == MODE_FINGER else MODE_FINGER open_sensor() def toggle_bias(): - global bias + global bias, disp, pause_screen + if write > 0: + pause_screen = utime.time_ms() + 500 + disp.clear(COLOR_BACKGROUND) + disp.print("Locked", posx=30, posy=30, fg=COLOR_TEXT) + disp.update() + return + close_sensor() bias = not bias open_sensor() @@ -209,19 +236,61 @@ def toggle_write(): def toggle_pause(): - global pause_histogram, histogram_offset, history + global pause_histogram, histogram_offset, history, leds if pause_histogram: pause_histogram = False history = [] else: pause_histogram = True histogram_offset = 0 + leds.clear() + + +def toggle_leds(): + global led_mode, disp, pause_screen, leds, modes + led_mode, display_args = next(modes) + + pause_screen = utime.time_ms() + 250 + disp.clear(COLOR_BACKGROUND) + disp.print("LEDs", posx=50, posy=20, fg=COLOR_TEXT) + disp.print(**display_args, posy=40, fg=COLOR_TEXT) + disp.update() + leds.clear() + + +def draw_leds(vmin, vmax): + # vmin should be in [0, -1] + # vmax should be in [0, 1] + global pulse, samples_since_last_pulse, last_pulse_blink + + # stop blinking + if not bool(led_mode): + return + + # update led bar + if "bar" in led_mode: + for i in reversed(range(6)): + leds.prep_hsv( + 5 + i, COLORS[5 + i] if vmin <= 0 and i <= vmin * -6 else (0, 0, 0) + ) + for i in reversed(range(6)): + leds.prep_hsv( + i, COLORS[i] if vmax >= 0 and 5 - i <= vmax * 6 else (0, 0, 0) + ) + # blink red on pulse + if ( + "pulse" in led_mode + and pulse > 0 + and samples_since_last_pulse < last_pulse_blink + ): + for i in range(4): + leds.prep(11 + i, (255, 0, 0)) + elif "pulse" in led_mode: + for i in range(4): + leds.prep(11 + i, (0, 0, 0)) + last_pulse_blink = samples_since_last_pulse -def draw_leds(val): - # val should be in [0, 11] - for i in range(11): - leds.prep_hsv(10 - i, COLORS[10 - i] if i < val else (0, 0, 0)) leds.update() @@ -273,7 +342,10 @@ def draw_histogram(): fg=COLOR_TEXT, ) else: - draw_leds((max(history[-5:]) * scale + SCALE_FACTOR) * 11 / (SCALE_FACTOR * 2)) + led_range = last_sample_count if last_sample_count > 5 else 5 + draw_leds( + min(history[-led_range:]) / value_max, max(history[-led_range:]) / value_max + ) if pulse < 0: disp.print( current_mode + ("+Bias" if bias else ""), @@ -308,10 +380,17 @@ def main(): # show button layout disp.clear(COLOR_BACKGROUND) - disp.print(" BUTTONS ", posx=0, posy=0, fg=COLOR_TEXT) - disp.print("Finger/USB>", posx=0, posy=20, fg=COLOR_MODE_FINGER) - disp.print(" Bias >", posx=0, posy=40, fg=COLOR_MODE_USB) - disp.print("< Write Log", posx=0, posy=60, fg=COLOR_WRITE_BG) + disp.print(" BUTTONS ", posx=0, posy=0, fg=COLOR_TEXT, font=display.FONT20) + disp.line(0, 20, 159, 20, col=COLOR_LINE) + disp.print( + " Pause >", posx=0, posy=28, fg=COLOR_MODE_FINGER, font=display.FONT16 + ) + disp.print( + " Mode/Bias >", posx=0, posy=44, fg=COLOR_MODE_USB, font=display.FONT16 + ) + disp.print( + "< LED/WriteLog", posx=0, posy=64, fg=COLOR_WRITE_BG, font=display.FONT16 + ) disp.update() utime.sleep(3) @@ -324,64 +403,96 @@ def main(): buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT | buttons.TOP_RIGHT ) + # TOP RIGHT + + # down + if button_pressed["TOP_RIGHT"] == 0 and v & buttons.TOP_RIGHT != 0: + button_pressed["TOP_RIGHT"] = utime.time_ms() + toggle_pause() + + # up + if button_pressed["TOP_RIGHT"] > 0 and v & buttons.TOP_RIGHT == 0: + duration = utime.time_ms() - button_pressed["TOP_RIGHT"] + button_pressed["TOP_RIGHT"] = 0 + # BOTTOM LEFT + # + # on pause = shift view left + # long = toggle write + # short = toggle leds + + # down, and still pressed + if ( + button_pressed["BOTTOM_LEFT"] > 0 + and v & buttons.BOTTOM_LEFT != 0 + and not pause_histogram + ): + duration = utime.time_ms() - button_pressed["BOTTOM_LEFT"] + if duration > 1000: + button_pressed["BOTTOM_LEFT"] = -1 + toggle_write() - if button_pressed["BOTTOM_LEFT"] == 0 and v & buttons.BOTTOM_LEFT != 0: + # register down event + elif button_pressed["BOTTOM_LEFT"] == 0 and v & buttons.BOTTOM_LEFT != 0: button_pressed["BOTTOM_LEFT"] = utime.time_ms() + + # register up event but event already called + if button_pressed["BOTTOM_LEFT"] == -1 and v & buttons.BOTTOM_LEFT == 0: + button_pressed["BOTTOM_LEFT"] = 0 + + # register normal up event + elif button_pressed["BOTTOM_LEFT"] > 0 and v & buttons.BOTTOM_LEFT == 0: + duration = utime.time_ms() - button_pressed["BOTTOM_LEFT"] + button_pressed["BOTTOM_LEFT"] = 0 if not pause_histogram: - toggle_write() + toggle_leds() else: l = len(history) histogram_offset += ECG_RATE / 2 if l - histogram_offset < WIDTH: histogram_offset = l - WIDTH - if button_pressed["BOTTOM_LEFT"] > 0 and v & buttons.BOTTOM_LEFT == 0: - duration = utime.time_ms() - button_pressed["BOTTOM_LEFT"] - button_pressed["BOTTOM_LEFT"] = 0 - # BOTTOM RIGHT - - if button_pressed["BOTTOM_RIGHT"] == 0 and v & buttons.BOTTOM_RIGHT != 0: - button_pressed["BOTTOM_RIGHT"] = utime.time_ms() - if not pause_histogram: - toggle_bias() - else: - histogram_offset -= ECG_RATE / 2 - histogram_offset -= histogram_offset % (ECG_RATE / 2) - if histogram_offset < 0: - histogram_offset = 0 - - if button_pressed["BOTTOM_RIGHT"] > 0 and v & buttons.BOTTOM_RIGHT == 0: - duration = utime.time_ms() - button_pressed["BOTTOM_RIGHT"] - button_pressed["BOTTOM_RIGHT"] = 0 - - # TOP RIGHT + # + # on pause = shift view right + # long = toggle bias + # short = toggle mode (finger/usb) # down, and still pressed - if button_pressed["TOP_RIGHT"] > 0 and v & buttons.TOP_RIGHT != 0: - duration = utime.time_ms() - button_pressed["TOP_RIGHT"] + if ( + button_pressed["BOTTOM_RIGHT"] > 0 + and v & buttons.BOTTOM_RIGHT != 0 + and not pause_histogram + ): + duration = utime.time_ms() - button_pressed["BOTTOM_RIGHT"] if duration > 1000: - button_pressed["TOP_RIGHT"] = -1 - toggle_pause() + button_pressed["BOTTOM_RIGHT"] = -1 + toggle_bias() # register down event - elif button_pressed["TOP_RIGHT"] == 0 and v & buttons.TOP_RIGHT != 0: - button_pressed["TOP_RIGHT"] = utime.time_ms() + elif button_pressed["BOTTOM_RIGHT"] == 0 and v & buttons.BOTTOM_RIGHT != 0: + button_pressed["BOTTOM_RIGHT"] = utime.time_ms() # register up event but event already called - if button_pressed["TOP_RIGHT"] == -1 and v & buttons.TOP_RIGHT == 0: - button_pressed["TOP_RIGHT"] = 0 + if button_pressed["BOTTOM_RIGHT"] == -1 and v & buttons.BOTTOM_RIGHT == 0: + button_pressed["BOTTOM_RIGHT"] = 0 # register normal up event - elif button_pressed["TOP_RIGHT"] > 0 and v & buttons.TOP_RIGHT == 0: - duration = utime.time_ms() - button_pressed["TOP_RIGHT"] - button_pressed["TOP_RIGHT"] = 0 + elif button_pressed["BOTTOM_RIGHT"] > 0 and v & buttons.BOTTOM_RIGHT == 0: + duration = utime.time_ms() - button_pressed["BOTTOM_RIGHT"] + button_pressed["BOTTOM_RIGHT"] = 0 if pause_histogram: - toggle_pause() + histogram_offset -= ECG_RATE / 2 + histogram_offset -= histogram_offset % (ECG_RATE / 2) + if histogram_offset < 0: + histogram_offset = 0 else: toggle_mode() if __name__ == "__main__": - main() + try: + main() + except KeyboardInterrupt as e: + sensor.close() + raise e diff --git a/preload/menu.py b/preload/menu.py index e9077e3611920f1fdb74b33347fe8db4f88eca27..bd9705a37158b252591674984eda7a7bfb186931 100644 --- a/preload/menu.py +++ b/preload/menu.py @@ -87,9 +87,12 @@ def no_apps_message(): if __name__ == "__main__": - apps = list(enumerate_apps()) + try: + apps = list(enumerate_apps()) + except OSError: + apps = [] - if apps == []: + if not apps: no_apps_message() MainMenu(apps).run() diff --git a/pycardium/genhdr/meson.build b/pycardium/genhdr/meson.build new file mode 100644 index 0000000000000000000000000000000000000000..a130c8642e0a4728451af8d68537b3252966f294 --- /dev/null +++ b/pycardium/genhdr/meson.build @@ -0,0 +1,6 @@ +qstr_genhdr_h = custom_target( + 'genhdr-qstrdefs.generated.h', + output: 'qstrdefs.generated.h', + input: qstr_h, + command: ['cp', '@INPUT@', '@OUTPUT@'], +) diff --git a/pycardium/meson.build b/pycardium/meson.build index 32973bae0c945a0208ba4c1040367dac75b84fb9..e50b61dfdd69bcc7c104c94123329881e59dae2f 100644 --- a/pycardium/meson.build +++ b/pycardium/meson.build @@ -7,16 +7,17 @@ modsrc = files( 'modules/fat_reader_import.c', 'modules/gpio.c', 'modules/interrupt.c', - 'modules/sys_leds.c', 'modules/light_sensor.c', 'modules/max30001-sys.c', 'modules/os.c', 'modules/personal_state.c', 'modules/power.c', + 'modules/sys_bme680.c', 'modules/sys_display.c', + 'modules/sys_leds.c', 'modules/utime.c', 'modules/vibra.c', - 'modules/bme680.c' + 'modules/ws2812.c' ) ################################# @@ -42,6 +43,7 @@ qstr_h = custom_target( input: [ 'modules/qstrdefs.h', 'mpconfigport.h', + modules_h, micropython_sources, micropython_extmod_sources, ], @@ -49,7 +51,9 @@ qstr_h = custom_target( command: [micropython_gen_qstr, meson.current_source_dir(), '@OUTPUT@', '@INPUT@'], ) -mp_headers = [version_h, modules_h, qstr_h] +subdir('./genhdr') + +mp_headers = [version_h, modules_h, qstr_h, qstr_genhdr_h] ################################# # Python Frozen Modules # diff --git a/pycardium/modules/interrupt.c b/pycardium/modules/interrupt.c index 838ef2b3a397887221041804a0477a5d1cfdbce5..9e2058e591c85333058976f667c88e5450635b4f 100644 --- a/pycardium/modules/interrupt.c +++ b/pycardium/modules/interrupt.c @@ -87,6 +87,8 @@ static const mp_rom_map_elem_t interrupt_module_globals_table[] = { MP_OBJ_NEW_SMALL_INT(EPIC_INT_RTC_ALARM) }, { MP_ROM_QSTR(MP_QSTR_BHI160_ACCELEROMETER), MP_OBJ_NEW_SMALL_INT(EPIC_INT_BHI160_ACCELEROMETER) }, + { MP_ROM_QSTR(MP_QSTR_BHI160_MAGNETOMETER), + MP_OBJ_NEW_SMALL_INT(EPIC_INT_BHI160_MAGNETOMETER) }, { MP_ROM_QSTR(MP_QSTR_BHI160_ORIENTATION), MP_OBJ_NEW_SMALL_INT(EPIC_INT_BHI160_ORIENTATION) }, { MP_ROM_QSTR(MP_QSTR_BHI160_GYROSCOPE), diff --git a/pycardium/modules/os.c b/pycardium/modules/os.c index 874a069322faaefaff63c493ebb10d3aa8ffb382..384a71e24385e638133a75f9de3d253f7ad2ec68 100644 --- a/pycardium/modules/os.c +++ b/pycardium/modules/os.c @@ -22,6 +22,11 @@ bool pycrd_filename_restricted(const char *path) path = fname + 1; fname = strchr(path, '/'); } + fname = strchr(path, '\\'); + while (fname) { + path = fname + 1; + fname = strchr(path, '\\'); + } fname = path; for (int i = 0; @@ -183,6 +188,32 @@ static mp_obj_t mp_os_urandom(mp_obj_t size_in) } static MP_DEFINE_CONST_FUN_OBJ_1(urandom_obj, mp_os_urandom); +enum usb_config_device { + USB_DEVICE_NONE, + USB_DEVICE_FLASH, + USB_DEVICE_SERIAL, +}; + +static mp_obj_t mp_os_usbconfig(mp_obj_t dev) +{ + int device = mp_obj_get_int(dev); + switch (device) { + case USB_DEVICE_NONE: + epic_usb_shutdown(); + break; + case USB_DEVICE_FLASH: + epic_usb_storage(); + break; + case USB_DEVICE_SERIAL: + epic_usb_cdcacm(); + break; + default: + mp_raise_ValueError("Invalid parameter"); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(usbconfig_obj, mp_os_usbconfig); + static const mp_rom_map_elem_t os_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) }, { MP_ROM_QSTR(MP_QSTR_exit), MP_ROM_PTR(&exit_obj) }, @@ -194,6 +225,11 @@ static const mp_rom_map_elem_t os_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&rename_obj) }, { MP_ROM_QSTR(MP_QSTR_read_battery), MP_ROM_PTR(&read_battery_obj) }, { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&urandom_obj) }, + { MP_ROM_QSTR(MP_QSTR_usbconfig), MP_ROM_PTR(&usbconfig_obj) }, + + { MP_ROM_QSTR(MP_QSTR_USB_SERIAL), MP_ROM_INT(USB_DEVICE_SERIAL) }, + { MP_ROM_QSTR(MP_QSTR_USB_FLASH), MP_ROM_INT(USB_DEVICE_FLASH) }, + { MP_ROM_QSTR(MP_QSTR_USB_NONE), MP_ROM_INT(USB_DEVICE_NONE) }, }; static MP_DEFINE_CONST_DICT(os_module_globals, os_module_globals_table); diff --git a/pycardium/modules/py/bhi160.py b/pycardium/modules/py/bhi160.py index 5d28e1e61dfbb913c3ee4dfdc00064fc4bb1342a..430508d10f2406c39a96f6062b7a7dafb1879be5 100644 --- a/pycardium/modules/py/bhi160.py +++ b/pycardium/modules/py/bhi160.py @@ -37,6 +37,9 @@ class BHI160: self.close() def close(self): + """ + Close the connection to the sensor + """ if self.active: self.active = False ret = sys_bhi160.disable_sensor(self.sensor_id) @@ -48,6 +51,18 @@ class BHI160: interrupt.set_callback(self.interrupt_id, None) def read(self): + """ + Read sensor values + + :returns: The recent collected sensor values as a list. If no data is + available the list contains no elements. Maximum length of the list + is ``sample_buffer_len``. The last element contains the most recent + data. The elements contains a sensor specific named tuple. See the + documentation of the sensor class for more information. + + .. warning:: + Weird behaviour ahead: If the internal buffer overflows, the new samples will be dropped. + """ result = [] if self.active: for sample in sys_bhi160.read_sensor(self.stream_id): @@ -70,6 +85,28 @@ class BHI160: class BHI160Accelerometer(BHI160): + """ + Accelerometer of the BHI160. + + This sensors sample data named tuple contains the following fields: + + - ``x``: Acceleration along the x axis + - ``y``: Acceleration along the y axis + - ``z``: Acceleration along the z axis + - ``status``: accuracy / "confidence" value of the sensor (0 being worst and 3 being best) + + .. todo:: + These values are not scaled correctly + + :param int sample_rate: Sample rate (optional, default is 4, range is 1 - 200 in *Hz*) + :param int dynamic_range: Dynamic range (optional, default is 2) + :param callback: Call this callback when enough data is collected (optional, default is None) + + .. todo:: + The callback functionality is untested, so do not be confused if it does not work. + :param int sample_buffer_len: Length of sample buffer (optional, default is 200) + """ + def __init__( self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200 ): @@ -90,6 +127,28 @@ class BHI160Accelerometer(BHI160): class BHI160Gyroscope(BHI160): + """ + Gyroscope of the BHI160. + + This sensors sample data named tuple contains the following fields: + + - ``x``: Rotation around the x axis + - ``y``: Rotation around the y axis + - ``z``: Rotation around the z axis + - ``status``: accuracy / "confidence" value of the sensor (0 being worst and 3 being best) + + .. todo:: + These values are not scaled correctly + + :param int sample_rate: Sample rate (optional, default is 4, range is 1 - 200 in *Hz*) + :param int dynamic_range: Dynamic range (optional, default is 2) + :param callback: Call this callback when enough data is collected (optional, default is None) + + .. todo:: + The callback functionality is untested, so do not be confused if it does not work. + :param int sample_buffer_len: Length of sample buffer (optional, default is 200) + """ + def __init__( self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200 ): @@ -110,6 +169,30 @@ class BHI160Gyroscope(BHI160): class BHI160Orientation(BHI160): + """ + Orientation of the BHI160. Orientation is a virtual sensor that combines + Accelerometer, Magnetometer and Gyroscope using the IMU Algorithm to + calculate an absolute orientation. + + This sensors sample data named tuple contains the following fields: + + - ``x``: azimuth + - ``y``: pitch + - ``z``: roll + - ``status``: accuracy / "confidence" value of the sensor (0 being worst and 3 being best) + + .. todo:: + These values are not scaled correctly + + :param int sample_rate: Sample rate (optional, default is 4, range is 1 - 200 in *Hz*) + :param int dynamic_range: This parameter is unused for the Orientation. + :param callback: Call this callback when enough data is collected (optional, default is None) + + .. todo:: + The callback functionality is untested, so do not be confused if it does not work. + :param int sample_buffer_len: Length of sample buffer (optional, default is 200) + """ + def __init__( self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200 ): @@ -127,3 +210,47 @@ class BHI160Orientation(BHI160): def convert(self, sample): return self.convert_data_vector(sample) + + +class BHI160Magnetometer(BHI160): + """ + Magnetometer of the BHI160 + + This sensors sample data named tuple contains the following fields: + + - ``x``: Magnetic field along the x axis + - ``y``: Magnetic field along the y axis + - ``z``: Magnetic field along the z axis + - ``status``: accuracy / "confidence" value of the sensor (0 being worst and 3 being best) + + .. todo:: + These values are not scaled correctly + + :param int sample_rate: Sample rate (optional, default is 4, range is 1 - 200 in *Hz*) + :param int dynamic_range: Dynamic range (optional, default is 1) + :param callback: Call this callback when enough data is collected (optional, default is None) + + .. todo:: + The callback functionality is untested, so do not be confused if it does not work. + :param int sample_buffer_len: Length of sample buffer (optional, default is 200) + + .. versionadded:: 1.11 + """ + + def __init__( + self, sample_rate=4, dynamic_range=1, callback=None, sample_buffer_len=200 + ): + self.sample_rate = sample_rate + self.dynamic_range = dynamic_range + self.callback = callback + self.sample_buffer_len = sample_buffer_len + self.sensor_id = 1 + self.interrupt_id = interrupt.BHI160_MAGNETOMETER + self._callback = callback + self.enable_sensor() + + def convert_single(self, value): + return 1000 * value / 32768.0 + + def convert(self, sample): + return self.convert_data_vector(sample) diff --git a/pycardium/modules/py/bme680.py b/pycardium/modules/py/bme680.py new file mode 100644 index 0000000000000000000000000000000000000000..bbb6481de9bb0cf780fce35ca161cea8ccaf077b --- /dev/null +++ b/pycardium/modules/py/bme680.py @@ -0,0 +1,134 @@ +import sys_bme680 +import ucollections + +# Import old module for compatibility +from sys_bme680 import * # noqa + +Bme680Data = ucollections.namedtuple( + "Bme680Data", ["temperature", "humidity", "pressure", "gas_resistance"] +) + + +class Bme680: + """ + BME680 4-in-1 environmental sensor. + + **Example**: + + .. code-block:: python + + import bme680 + + environment = bme680.Bme680() + print("Current temperature: {:4.1f} °C".format(environment.temperature())) + + This class can also be used as a context-manager which will automatically + deactivate the sensor on exit: + + .. code-block:: python + + import bme680 + + with bme680.Bme680() as environment: + print("H: {:4.1f}%".format(environment.humidity())) + + # Sensor is off again, saving power + + .. versionadded:: 1.10 + """ + + def __init__(self): + sys_bme680.init() + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def get_data(self): + """ + Get all sensor data at once. + + :py:meth:`~bme680.Bme680.get_data` returns a namedtuple with the + following fields: + + - ``temperature``: Temperature in *°C* + - ``humidity``: Relative humidity + - ``pressure``: Barometric pressure in *hPa* + - ``gas_resistance``: Gas resistance in *Ω* + + **Example**: + + .. code-block:: python + + import bme680 + + with bme680.Bme680() as environment: + data = environment.get_data() + + print("T: {}".format(data.temperature)) + print("H: {}".format(data.humidity)) + """ + return Bme680Data(*sys_bme680.get_data()) + + def close(self): + """ + Stop/deinit the BME680. + + If you no longer need measurements, you should call this function to + save power. + """ + sys_bme680.deinit() + + def temperature(self): + """ + Measure current temperature in *°C*. + + **Example**: + + .. code-block:: python + + environment = bme680.Bme680() + print(str(environment.temperature())) + """ + return self.get_data().temperature + + def humidity(self): + """ + Measure current relative humidity. + + **Example**: + + .. code-block:: python + + environment = bme680.Bme680() + print(str(environment.humidity())) + """ + return self.get_data().humidity + + def pressure(self): + """ + Measure current barometric pressure in *hPa*. + + **Example**: + + .. code-block:: python + + environment = bme680.Bme680() + print(str(environment.pressure())) + """ + return self.get_data().pressure + + def gas_resistance(self): + """ + Measure current gas resistance in *Ω*. + + **Example**: + + .. code-block:: python + + environment = bme680.Bme680() + print(str(environment.gas_resistance())) + """ + return self.get_data().gas_resistance diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py index 22891bcb0813e61307bc6b792d8a4de117560694..b7b440bfa8d89aae57de3e3d45947c3d2aec0d3e 100644 --- a/pycardium/modules/py/display.py +++ b/pycardium/modules/py/display.py @@ -96,9 +96,9 @@ class Display: :param text: Text to print :param fg: Foreground color (expects RGB triple) - :param bg: Background color (expects RGB triple) - :param posx: X-Position of the first character, 0 <= posx <= 159 - :param posy: Y-Position of the first character, 0 <= posy <= 79 + :param bg: Background color (expects RGB triple) or None for transparent background + :param posx: X-Position of the first character + :param posy: Y-Position of the first character :param font: 0 <= font <= 4 (currently) selects a font Avaiable Fonts: @@ -117,9 +117,13 @@ class Display: d.clear() d.print('Hello Earth!', font=display.FONT24) d.update() + + .. versionchanged:: 1.11 + + Added transparent background printing. """ fg = fg or color.WHITE - bg = bg or color.BLACK + bg = bg or fg sys_display.print_adv(text, posx, posy, fg, bg, font) return self @@ -128,8 +132,8 @@ class Display: """ Draws a pixel on the display - :param x: X coordinate, 0<= x <= 159 - :param y: Y coordinate, 0<= y <= 79 + :param x: X coordinate + :param y: Y coordinate :param col: color of the pixel (expects RGB tripple) """ @@ -186,10 +190,10 @@ class Display: """ Draws a line on the display. - :param xs: X start coordinate, 0 <= xs <= 159 - :param ys: Y start coordinate, 0 <= ys <= 79 - :param xe: X end coordinate, 0 <= xe <= 159 - :param ye: Y end coordinate, 0 <= ye <= 79 + :param xs: X start coordinate + :param ys: Y start coordinate + :param xe: X end coordinate + :param ye: Y end coordinate :param col: color of the line (expects RGB triple) :param dotted: whether the line should be dotted or not (questionable implementation: draws every other pixel white, draws @@ -206,10 +210,10 @@ class Display: """ Draws a rectangle on the display. - :param xs: X start coordinate, 0 <= xs <= 159 - :param ys: Y start coordinate, 0 <= ys <= 79 - :param xe: X end coordinate, 0 <= xe <= 159 - :param ye: Y end coordinate, 0 <= ye <= 79 + :param xs: X start coordinate + :param ys: Y start coordinate + :param xe: X end coordinate + :param ye: Y end coordinate :param col: color of the outline and fill (expects RGB triple) :param filled: whether the rectangle should be filled or not :param size: size of the individual pixels, ranges from 1 to 8 @@ -224,8 +228,8 @@ class Display: """ Draws a circle on the display. - :param x: center x coordinate, 0 <= x <= 159 - :param y: center y coordinate, 0 <= y <= 79 + :param x: center x coordinate + :param y: center y coordinate :param rad: radius :param col: color of the outline and fill (expects RGB triple) :param filled: whether the rectangle should be filled or not diff --git a/pycardium/modules/py/leds.py b/pycardium/modules/py/leds.py index 9b7d2511544be91ab632d04cb3b598503b1c166f..75f3aac87dbb362f16a8dc1c1f993c13f22ac158 100644 --- a/pycardium/modules/py/leds.py +++ b/pycardium/modules/py/leds.py @@ -72,6 +72,29 @@ def set_rocket(led, value): sys_leds.set_rocket(led, value) +def get_rocket(led): + """ + Get brightness of one of the rocket LEDs. + + :param int led: Choose your rocket! + + +-------+--------+----------+ + | ID | Color | Location | + +=======+========+==========+ + | ``0`` | Blue | Left | + +-------+--------+----------+ + | ``1`` | Yellow | Top | + +-------+--------+----------+ + | ``2`` | Green | Right | + +-------+--------+----------+ + :rtype: int + :returns: Brightness of LED (value between 0 and 31). + + .. versionadded:: 1.10 + """ + return sys_leds.get_rocket(led) + + def dim_top(value): """ Set global brightness for top RGB LEDs. @@ -138,6 +161,8 @@ def get_rgb(led): :param int led: Which LED to set. 0-10 are the LEDs on the top and 11-14 are the 4 "ambient" LEDs :return [r,g,b] color: RGB triplet + + .. versionadded:: 1.10 """ return sys_leds.get_rgb(led) diff --git a/pycardium/modules/py/meson.build b/pycardium/modules/py/meson.build index 75bf937c7b2d394d0834542e333bb050328c0823..df93ce38da16d1908dd86ac5e57c49839a4f4220 100644 --- a/pycardium/modules/py/meson.build +++ b/pycardium/modules/py/meson.build @@ -1,12 +1,13 @@ python_modules = files( 'bhi160.py', + 'bme680.py', 'color.py', - 'htmlcolor.py', 'display.py', + 'htmlcolor.py', + 'ledfx.py', 'leds.py', 'max30001.py', 'pride.py', - 'ledfx.py', 'simple_menu.py', # MicroPython Standard-Library @@ -19,6 +20,7 @@ python_modules = files( 'string.py', 'struct.py', 'ucontextlib.py', + 'uuid.py', ) frozen_modules = mpy_cross.process(python_modules) diff --git a/pycardium/modules/py/simple_menu.py b/pycardium/modules/py/simple_menu.py index b9c535eeac14fcec5048b7a09377ee615161ec34..18279db442ee22e1ce882a98478229126c82ed8a 100644 --- a/pycardium/modules/py/simple_menu.py +++ b/pycardium/modules/py/simple_menu.py @@ -159,6 +159,9 @@ class Menu: Exit the event-loop. This should be called from inside an ``on_*`` hook. .. versionadded:: 1.9 + .. versionchanged:: 1.11 + + Fixed this function not working properly. """ raise _ExitMenuException() @@ -282,6 +285,8 @@ class Menu: self.idx = (self.idx + 1) % len(self.entries) try: self.on_scroll(self.entries[self.idx], self.idx) + except _ExitMenuException: + raise except Exception as e: print("Exception during menu.on_scroll():") sys.print_exception(e) @@ -291,6 +296,8 @@ class Menu: self.idx = (self.idx + len(self.entries) - 1) % len(self.entries) try: self.on_scroll(self.entries[self.idx], self.idx) + except _ExitMenuException: + raise except Exception as e: print("Exception during menu.on_scroll():") sys.print_exception(e) @@ -298,6 +305,8 @@ class Menu: try: self.on_select(self.entries[self.idx], self.idx) self.select_time = utime.time_ms() + except _ExitMenuException: + raise except Exception as e: print("Menu crashed!") sys.print_exception(e) diff --git a/pycardium/modules/py/uuid.py b/pycardium/modules/py/uuid.py index 4fdee8bab09078df789334747a4f681fc39c0ea8..272719ea879ef414a83999fe8002b251889e4b83 100644 --- a/pycardium/modules/py/uuid.py +++ b/pycardium/modules/py/uuid.py @@ -20,7 +20,7 @@ class UUID: if len(bytes) != 16: raise ValueError("bytes is not a 16-char string") assert isinstance(bytes, bytes_), repr(bytes) - int = int_.from_bytes(bytes, byteorder="big") + int = int_.from_bytes(bytes, "big") if int is not None: if not 0 <= int < 1 << 128: raise ValueError("int is out of range (need a 128-bit value)") @@ -33,7 +33,8 @@ class UUID: # Set the version number. int &= ~(0xF000 << 64) int |= version << 76 - self.__dict__["int"] = int + + setattr(self, "int", int) def __eq__(self, other): if isinstance(other, UUID): diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index e54d726a4e8b5f236721ee0202466ee349336619..23df526b9438c371fc9d97651bcc72cd185db4f0 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -16,6 +16,7 @@ Q(set_all) Q(set_all_hsv) Q(set_flashlight) Q(set_rocket) +Q(get_rocket) Q(set_powersave) Q(set_gamma) Q(dim_top) @@ -47,10 +48,16 @@ Q(ticks_add) Q(ticks_diff) Q(localtime) Q(mktime) +Q(monotonic) +Q(monotonic_ms) Q(time) Q(time_ms) +Q(unix_time) +Q(unix_time_ms) Q(set_time) +Q(set_time_ms) Q(set_unix_time) +Q(set_unix_time_ms) /* vibra */ Q(vibra) @@ -60,6 +67,7 @@ Q(set_callback) Q(enable_callback) Q(disable_callback) Q(BHI160_ACCELEROMETER) +Q(BHI160_MAGNETOMETER) Q(BHI160_ORIENTATION) Q(BHI160_GYROSCOPE) Q(RTC_ALARM) @@ -104,7 +112,7 @@ Q(stop) Q(read) /* bme680 */ -Q(bme680) +Q(sys_bme680) Q(init) Q(deinit) Q(get_data) @@ -140,6 +148,10 @@ Q(mkdir) Q(rename) Q(read_battery) Q(urandom) +Q(usbconfig) +Q(USB_FLASH) +Q(USB_SERIAL) +Q(USB_NONE) /* gpio */ Q(gpio) @@ -171,3 +183,7 @@ Q(COMMUNICATION) Q(CAMP) Q(MAX30001_ECG) + +/* ws2812 */ +Q(ws2812) +Q(set_all) diff --git a/pycardium/modules/bme680.c b/pycardium/modules/sys_bme680.c similarity index 91% rename from pycardium/modules/bme680.c rename to pycardium/modules/sys_bme680.c index ca4aca6d1dcb5d4f06c81ba20458f01bdafdb316..f6899c77c187c4d0d536fb41c14428d449bf62be 100644 --- a/pycardium/modules/bme680.c +++ b/pycardium/modules/sys_bme680.c @@ -46,7 +46,7 @@ static mp_obj_t mp_bme680_get_data() static MP_DEFINE_CONST_FUN_OBJ_0(bme680_get_data_obj, mp_bme680_get_data); static const mp_rom_map_elem_t bme680_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_bme680) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_bme680) }, { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&bme680_init_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&bme680_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_get_data), MP_ROM_PTR(&bme680_get_data_obj) }, @@ -59,4 +59,4 @@ const mp_obj_module_t bme680_module = { }; /* Register the module to make it available in Python */ -MP_REGISTER_MODULE(MP_QSTR_bme680, bme680_module, MODULE_BME680_ENABLED); +MP_REGISTER_MODULE(MP_QSTR_sys_bme680, bme680_module, MODULE_BME680_ENABLED); diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c index 78257797080ed32426f757d48d5e925bf528f42a..b2f492393c92ad2e850125a68afc0d05f3ec4886 100644 --- a/pycardium/modules/sys_display.c +++ b/pycardium/modules/sys_display.c @@ -39,11 +39,11 @@ static mp_obj_t mp_display_print(size_t n_args, const mp_obj_t *args) mp_raise_TypeError("input text must be a string"); } GET_STR_DATA_LEN(args[0], print, print_len); - uint32_t posx = mp_obj_get_int(args[1]); - uint32_t posy = mp_obj_get_int(args[2]); - uint32_t fg = get_color(args[3]); - uint32_t bg = get_color(args[4]); - int res = epic_disp_print(posx, posy, (const char *)print, fg, bg); + int32_t posx = mp_obj_get_int(args[1]); + int32_t posy = mp_obj_get_int(args[2]); + uint32_t fg = get_color(args[3]); + uint32_t bg = get_color(args[4]); + int res = epic_disp_print(posx, posy, (const char *)print, fg, bg); if (res < 0) { mp_raise_OSError(-res); } @@ -60,8 +60,8 @@ static mp_obj_t mp_display_print_adv(size_t n_args, const mp_obj_t *args) mp_raise_TypeError("input text must be a string"); } GET_STR_DATA_LEN(args[0], print, print_len); - uint32_t posx = mp_obj_get_int(args[1]); - uint32_t posy = mp_obj_get_int(args[2]); + int32_t posx = mp_obj_get_int(args[1]); + int32_t posy = mp_obj_get_int(args[2]); uint32_t fg = get_color(args[3]); uint32_t bg = get_color(args[4]); uint8_t fontName = mp_obj_get_int(args[5]); @@ -80,8 +80,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( /* draw pixel on the display */ static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args) { - uint16_t x = mp_obj_get_int(args[0]); - uint16_t y = mp_obj_get_int(args[1]); + int16_t x = mp_obj_get_int(args[0]); + int16_t y = mp_obj_get_int(args[1]); uint16_t col = get_color(args[2]); int res = epic_disp_pixel(x, y, col); @@ -146,10 +146,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( /* draw line on the display */ static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args) { - uint16_t xs = mp_obj_get_int(args[0]); - uint16_t ys = mp_obj_get_int(args[1]); - uint16_t xe = mp_obj_get_int(args[2]); - uint16_t ye = mp_obj_get_int(args[3]); + int16_t xs = mp_obj_get_int(args[0]); + int16_t ys = mp_obj_get_int(args[1]); + int16_t xe = mp_obj_get_int(args[2]); + int16_t ye = mp_obj_get_int(args[3]); uint16_t col = get_color(args[4]); uint16_t ls = mp_obj_get_int(args[5]); uint16_t ps = mp_obj_get_int(args[6]); @@ -180,10 +180,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( /* draw rectangle on the display */ static mp_obj_t mp_display_rect(size_t n_args, const mp_obj_t *args) { - uint16_t xs = mp_obj_get_int(args[0]); - uint16_t ys = mp_obj_get_int(args[1]); - uint16_t xe = mp_obj_get_int(args[2]); - uint16_t ye = mp_obj_get_int(args[3]); + int16_t xs = mp_obj_get_int(args[0]); + int16_t ys = mp_obj_get_int(args[1]); + int16_t xe = mp_obj_get_int(args[2]); + int16_t ye = mp_obj_get_int(args[3]); uint16_t col = get_color(args[4]); uint16_t fs = mp_obj_get_int(args[5]); uint16_t ps = mp_obj_get_int(args[6]); @@ -214,8 +214,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( /* draw rectangle on the display */ static mp_obj_t mp_display_circ(size_t n_args, const mp_obj_t *args) { - uint16_t x = mp_obj_get_int(args[0]); - uint16_t y = mp_obj_get_int(args[1]); + int16_t x = mp_obj_get_int(args[0]); + int16_t y = mp_obj_get_int(args[1]); uint16_t rad = mp_obj_get_int(args[2]); uint16_t col = get_color(args[3]); uint16_t fs = mp_obj_get_int(args[4]); diff --git a/pycardium/modules/sys_leds.c b/pycardium/modules/sys_leds.c index 990a4a36a3a97612ebe5d9dd745bd6317b61f438..a5f5747970e1060f545ab45702695a6e1985f247 100644 --- a/pycardium/modules/sys_leds.c +++ b/pycardium/modules/sys_leds.c @@ -200,6 +200,19 @@ static mp_obj_t mp_leds_set_rocket(mp_obj_t led_in, mp_obj_t value_in) } static MP_DEFINE_CONST_FUN_OBJ_2(leds_set_rocket_obj, mp_leds_set_rocket); +static mp_obj_t mp_leds_get_rocket(mp_obj_t led_in) +{ + int led = mp_obj_get_int(led_in); + uint8_t ret = epic_leds_get_rocket(led); + if (ret == -EINVAL) { + mp_raise_ValueError( + "invalid value: maybe the led does not exists" + ); + } + return MP_OBJ_NEW_SMALL_INT(ret); +} +static MP_DEFINE_CONST_FUN_OBJ_1(leds_get_rocket_obj, mp_leds_get_rocket); + static mp_obj_t mp_leds_dim_top(mp_obj_t dim_in) { int dim = mp_obj_get_int(dim_in); @@ -269,6 +282,7 @@ static const mp_rom_map_elem_t leds_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_set_all), MP_ROM_PTR(&leds_set_all_obj) }, { MP_ROM_QSTR(MP_QSTR_set_all_hsv), MP_ROM_PTR(&leds_set_all_hsv_obj) }, { MP_ROM_QSTR(MP_QSTR_set_rocket), MP_ROM_PTR(&leds_set_rocket_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_rocket), MP_ROM_PTR(&leds_get_rocket_obj) }, { MP_ROM_QSTR(MP_QSTR_set_flashlight), MP_ROM_PTR(&leds_set_flashlight_obj) }, { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&leds_update_obj) }, diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c index 88fe86b9ad2933d1f5e109e0113cf24453be69d3..874d0d7a7fdbbc571f4066f71f4c74508fee0d95 100644 --- a/pycardium/modules/utime.c +++ b/pycardium/modules/utime.c @@ -5,6 +5,7 @@ #include "py/mpconfig.h" #include "py/obj.h" +#include "py/objint.h" #include "py/runtime.h" #include "extmod/utime_mphal.h" @@ -26,6 +27,17 @@ static mp_obj_t time_set_time(mp_obj_t secs) } static MP_DEFINE_CONST_FUN_OBJ_1(time_set_time_obj, time_set_time); +static mp_obj_t time_set_time_ms(mp_obj_t msecs_obj) +{ + uint64_t msecs = 0; + mp_obj_int_to_bytes_impl(msecs_obj, false, 8, (byte *)&msecs); + uint64_t timestamp = + msecs + EPOCH_OFFSET * 1000ULL - TZONE_OFFSET * 1000ULL; + epic_rtc_set_milliseconds(timestamp); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(time_set_time_ms_obj, time_set_time_ms); + static mp_obj_t time_set_unix_time(mp_obj_t secs) { uint64_t timestamp = mp_obj_get_int(secs) * 1000ULL; @@ -34,6 +46,17 @@ static mp_obj_t time_set_unix_time(mp_obj_t secs) } static MP_DEFINE_CONST_FUN_OBJ_1(time_set_unix_time_obj, time_set_unix_time); +static mp_obj_t time_set_unix_time_ms(mp_obj_t msecs_obj) +{ + uint64_t timestamp = 0; + mp_obj_int_to_bytes_impl(msecs_obj, false, 8, (byte *)×tamp); + epic_rtc_set_milliseconds(timestamp); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1( + time_set_unix_time_ms_obj, time_set_unix_time_ms +); + static mp_obj_t time_time(void) { mp_int_t seconds; @@ -45,12 +68,42 @@ MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time); static mp_obj_t time_time_ms(void) { uint64_t milliseconds; - milliseconds = epic_rtc_get_milliseconds() - - (EPOCH_OFFSET + TZONE_OFFSET) * 1000ULL; + milliseconds = epic_rtc_get_milliseconds() - EPOCH_OFFSET * 1000ULL + + TZONE_OFFSET * 1000ULL; return mp_obj_new_int_from_ull(milliseconds); } MP_DEFINE_CONST_FUN_OBJ_0(time_time_ms_obj, time_time_ms); +static mp_obj_t time_unix_time(void) +{ + mp_int_t seconds = epic_rtc_get_seconds(); + return mp_obj_new_int(seconds); +} +MP_DEFINE_CONST_FUN_OBJ_0(time_unix_time_obj, time_unix_time); + +static mp_obj_t time_unix_time_ms(void) +{ + uint64_t milliseconds = epic_rtc_get_milliseconds(); + return mp_obj_new_int_from_ull(milliseconds); +} +MP_DEFINE_CONST_FUN_OBJ_0(time_unix_time_ms_obj, time_unix_time_ms); + +static mp_obj_t time_monotonic(void) +{ + mp_int_t seconds; + seconds = epic_rtc_get_monotonic_seconds(); + return mp_obj_new_int(seconds); +} +MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_obj, time_monotonic); + +static mp_obj_t time_monotonic_ms(void) +{ + uint64_t milliseconds; + milliseconds = epic_rtc_get_monotonic_milliseconds(); + return mp_obj_new_int_from_ull(milliseconds); +} +MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_ms_obj, time_monotonic_ms); + static mp_obj_t time_localtime(size_t n_args, const mp_obj_t *args) { mp_int_t seconds; @@ -130,9 +183,18 @@ static const mp_rom_map_elem_t time_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) }, { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) }, { MP_ROM_QSTR(MP_QSTR_time_ms), MP_ROM_PTR(&time_time_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_unix_time), MP_ROM_PTR(&time_unix_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_unix_time_ms), + MP_ROM_PTR(&time_unix_time_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_monotonic), MP_ROM_PTR(&time_monotonic_obj) }, + { MP_ROM_QSTR(MP_QSTR_monotonic_ms), + MP_ROM_PTR(&time_monotonic_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_set_time), MP_ROM_PTR(&time_set_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_set_time_ms), MP_ROM_PTR(&time_set_time_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_set_unix_time), MP_ROM_PTR(&time_set_unix_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_set_unix_time_ms), + MP_ROM_PTR(&time_set_unix_time_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&time_localtime_obj) }, { MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&time_mktime_obj) }, { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) }, diff --git a/pycardium/modules/ws2812.c b/pycardium/modules/ws2812.c new file mode 100644 index 0000000000000000000000000000000000000000..4df1d84a047981ef28d00d3f3801d1845cd44a46 --- /dev/null +++ b/pycardium/modules/ws2812.c @@ -0,0 +1,53 @@ +#include "epicardium.h" + +#include "py/obj.h" + +#include <stdlib.h> +#include <stdio.h> + +/* Define the pixel set_all function in this module */ +static mp_obj_t mp_ws2812_set_all(mp_obj_t pin, mp_obj_t color_in) +{ + mp_int_t pin_int = mp_obj_get_int(pin); + mp_int_t len = mp_obj_get_int(mp_obj_len(color_in)); + mp_int_t pixels_len = len * 3; + uint8_t *pixels_arr = alloca(pixels_len * sizeof(uint8_t)); + + for (int i = 0; i < len; i++) { + mp_obj_t color = mp_obj_subscr( + color_in, mp_obj_new_int(i), MP_OBJ_SENTINEL + ); + + pixels_arr[i * 3] = mp_obj_get_int(mp_obj_subscr( + color, mp_obj_new_int(1), MP_OBJ_SENTINEL) + ); + pixels_arr[i * 3 + 1] = mp_obj_get_int(mp_obj_subscr( + color, mp_obj_new_int(0), MP_OBJ_SENTINEL) + ); + pixels_arr[i * 3 + 2] = mp_obj_get_int(mp_obj_subscr( + color, mp_obj_new_int(2), MP_OBJ_SENTINEL) + ); + } + + /* call epicardium to be fast enough */ + epic_ws2812_write(pin_int, pixels_arr, pixels_len); + + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_2(ws2812_set_all_obj, mp_ws2812_set_all); + +/* The globals table for this module */ +static const mp_rom_map_elem_t ws2812_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ws2812) }, + { MP_ROM_QSTR(MP_QSTR_set_all), MP_ROM_PTR(&ws2812_set_all_obj) }, +}; +static MP_DEFINE_CONST_DICT(ws2812_module_globals, ws2812_module_globals_table); + +const mp_obj_module_t ws2812_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&ws2812_module_globals, +}; + +/* This is a special macro that will make MicroPython aware of this module */ +/* clang-format off */ +MP_REGISTER_MODULE(MP_QSTR_ws2812, ws2812_module, MODULE_WS2812_ENABLED); diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h index 744a38e38cd2c25ea037e90ac420d4f2403c0d2b..767a69fbd78465b10c0ec5ea54608c8a0270670b 100644 --- a/pycardium/mpconfigport.h +++ b/pycardium/mpconfigport.h @@ -18,7 +18,7 @@ #define MICROPY_ENABLE_GC (1) #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) #define MICROPY_HELPER_REPL (1) -#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_LONGLONG) +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) #define MICROPY_ENABLE_SCHEDULER (1) @@ -60,6 +60,7 @@ int mp_hal_trng_read_int(void); #define MODULE_POWER_ENABLED (1) #define MODULE_UTIME_ENABLED (1) #define MODULE_VIBRA_ENABLED (1) +#define MODULE_WS2812_ENABLED (1) /* * This port is intended to be 32-bit, but unfortunately, int32_t for diff --git a/tools/make-release.sh b/tools/make-release.sh index 09946b6543c6371ac5688410cb7221bcb5f082c7..e73f4f7cef2390bc927a4541db54b3e16d981afd 100755 --- a/tools/make-release.sh +++ b/tools/make-release.sh @@ -52,11 +52,11 @@ fi release_dir="release-$version" mkdir "$release_dir" -message "Building (non-jailbreak) release version ..." +message "Building release version ..." ./bootstrap.sh ninja -C build/ -message "Creating (non-jailbreak) release archive ..." +message "Creating release archive ..." mkdir "$release_dir/$release_name" cp -r -t "$release_dir/$release_name" preload/* cp build/pycardium/pycardium_epicardium.bin "$release_dir/$release_name/card10.bin" @@ -66,20 +66,5 @@ cp build/pycardium/pycardium_epicardium.bin "$release_dir/$release_name/card10.b mkdir "$release_dir/elfs" cp -t "$release_dir/elfs" build/epicardium/epicardium.elf build/pycardium/pycardium.elf build/bootloader/bootloader.elf -message "Building (jailbreak) release version ..." -./bootstrap.sh -Djailbreak_card10=true -ninja -C build/ - -message "Creating (jailbreak) release archive ..." -mkdir "$release_dir/$release_name-jailbreak" -cp -r -t "$release_dir/$release_name-jailbreak" preload/* -cp build/pycardium/pycardium_epicardium.bin "$release_dir/$release_name-jailbreak/card10.bin" -( cd "$release_dir"; zip -r "$release_name-jailbreak"{.zip,}; ) - -# Copy ELFs -mkdir "$release_dir/elfs-jailbreak" -cp -t "$release_dir/elfs-jailbreak" build/epicardium/epicardium.elf build/pycardium/pycardium.elf - message "Done!" -echo "Archive (non-jailbreak): $release_dir/$release_name.zip" -echo "Archive (jailbreak): $release_dir/$release_name-jailbreak.zip" +echo "Archive: $release_dir/$release_name.zip"